Ⅰ 在Ubuntu12.04中搭建NFS Server时在:
1、执行命令:sudo apt-get install nfs-kernel-server 我之前安装了,之所以写下来是防止重装系统后,这些东西都怎么安装。
2、执行命令:mkdir /home/song/nfs 建立一个nfs服务的专有明没如的文件夹,这里路径依自己喜好而定!不过要记得这个路径
3、建立好文件夹后,接着执行命令:sudo vim /etc/exports 配置nfs
4、在文章的最后一行添加:/home/song/nfs *(rw,sync,no_root_squash,no_subtree_check)
/home/song/nfs *(rw,sync,no_root_squash,no_subtree_check)这一行的含义是:
/home/song/nfs:与nfs服务客户端共享的目录,这个路径必须和你前面设置的文件的路径一致!
*:允许所有的网段访问,也可以使用具体的IP
rw:挂接此目录的客户端对该共享目录具有读写权限
sync:资料同步写入内存和硬盘
no_root_squash:root用户具有对根目录的完全管理访问权限。
no_subtree_check:不检查父目录的权限。更多的参数说明我在文章下面贴出来了!
5、修改完上述配置文件保存退出。
6、执行命令:sudo /etc/init.d/portmap restart 重启portmap服务。nfs是一个RPC程序,使用它前,需要映射好端口,通过portmap设定。
7、执行命令:sudo /etc/init.d/nfs-kernel-server restart 重启nfs服务。
8、到这里,你就察宽可以使用nfs服务了。可是怎么用呢?我之前是将自己移植的uboot、内核下载到开发板上后,然后利用nfs服务在开发板上启动自己制作的根文件系统的,可是由于刚整理完内核移植,现在我的mini2440的开发板上还是他自带的supervivi、linux2.6.32.2内核和rootfs_qtopia_qt4.img根文件系统。并且接下来,我还会写一篇利用nfs启动自己制作的根文件系统的文章,在这里先用自带说一下怎么使用吧!那篇文章写完之后再把链接贴过来。
使用步骤(下面的步骤看看就行了哈,不激启用做实验的)
9、首先最重要的就是用网线将你的开发板和电脑相连!然后打开串口终端执行superviv中的 f 命令,格式化你的nand flash,这是为了确保nand flash里边没有根文件系统了。
你看,启动不起来了吧!界面一直停留在这里!
10、通过supervivi的 v命令和k命令,分别将supevivi和内核下载到nand flash的分区,下载过程是要结合这dnw的哈!(注意这里dnw的configuretion地址是0x3000 0000)
下载supervivi到nand flash对应的分区
下载内核到nand flash对应的分区
11、到这里,我不打算利用supervivi自带的y命令将根文件系统下载到nand flash了,现在正式开始介绍利用nfs挂载根文件系统。
12、将根文件系统放在咱们创建的文件里,如下图
13、在supevivi上输入q,进入supervivi的命令模式
14、在命令模式下,输入: param set linux_cmd_line "console=ttySAC0,115200n8 root=/dev/nfs nfsroot=211.64.20.161:/home/song/nfs/rootfs_qtopia_qt4 ip=211.64.20.167",按回车键
上图只需要修改的地方为 :nfsroot=你的主机IP:根文件系统路径 ip=你的开发板ip地址,注意开发板的ip地址只要和主机ip地址在一个网段内就可。
15、接着在命令行模式下输入:boot,按回车键就可以启动系统了!
Ⅱ uboot、内核、操作系统、根文件系统他们之间到底是什么关系,求大神指点!!
uboot是个引导启动程序。BIOS自检完成后就把电脑控制权交给uboot,由uboot来加载并引导操作系统运行。
内核就是最最最核心的那部份。操作系统内核就是操作系统的最最最最核心的那些程序。新安装的操作系统中,一些自带的小工具啊,小游戏啊,甚至连键盘鼠标控制功能,这些都不属于内核。内核是不包括硬件驱动程序的。
操作系统就是控制计算机硬件的软件系统。它与内核的区别是它包含硬件驱动和一些基本的实用功能。
根文件系统这个名词很少出现在windows中。在计算机存储中,目录结构都是以树形结构表示的,根就是指这棵树的根部。其他所有目录都是在这个“根”上面逐级分配而来。“根文件运游前系统”因为你加了“系统”二字,所以可以解释为是指“整棵树”,整个“树形结构的文件系统”
它们之间的关系是:BIOS自检---uboot引导----加旁清载内核----操作系统启动---启动完成,系统待机。这几个步骤所需要用到的文件与程磨燃序什么的全部存贮在文件系统中。在这几个名词来说,文件系统可以独立存在,但其他几样则无法脱离文件系统而存在。
Ⅲ 嵌入式Linux系统移植和裁剪_10_环境搭建和测试(九)
这段时间新冠肺炎疫情又波及了好几个省,下个星期又要在家办公了,哪都不能去了。不过话说回来,在城里面本来也就没什么好玩的,也没什么地方好去的。
接着上一次的内容,要从网络加载内核和设备树,以及挂载网络根文件系统物枝毁,需要在UBoot里面设置 bootcmd 和 bootargs 两个环境变量如下:
set bootcmd 'tftp 41000000 uImage; tftp 42000000 exynos4412-fs4412.dtb; bootm 41000000 - 42000000'
set bootargs 'console=ttySAC2,115200 root=/dev/nfs rw nfsroot=192.168.1.8:/samba/nfs/rootfs,proto=tcp clk_ignore_unused /init=/linuxrc ip=192.168.1.100:192.168.1.8:192.168.1.1:255.255.255.0'
这两个参数需要根据自己的实际情况加以调整,主要是nfs和ip的一些设置。
bootcmd 是内核启动命令,其表示使用tftp协议,从TFTP文件夹下加载uImage到41000000的内存地址。然后从TFTP文件夹下加载exynos4412-fs4412.dtb到42000000的内存地址,然后执行bootm命令,从41000000的地址启动内核。
bootargs 是内核启动的参数,比如设置控制台的串口参数,指定根文件系统(这里我们使用nfs从网络上挂载根文件系统,注意协议用tcp,如果用udp的话,很可能会因为丢包而导致挂载失败)
最后需要saveenv保存设置。
就绪之后,板子重新上电,不要回车打断UBoot,让其引导Linux内核启动,结果内核启动失败。
后来在群里问了老师,他们发了内核镜像和设备树过来,让我用他们编译的试试,我一试,还真能用。本来我还怀疑是不是根文件系统的问题,后来老师让我看看设备树,说是要注释掉下面这一段。搭颂
但是我一看,本来就是注释掉的啊。。。然后就无解了,我以为可能还是根文件系统的问题,群里问老师也没有再回,罩备就搁置了两天,这也算是中间的一个小插曲吧。然后我刚刚又在群里问,另一个老师说这一段现在不需要注释了,就是要加进来。然后我就把注释去掉了,重新编译后,果然就可以启动了。
可以看到根文件系统已经挂载成功了,那这样我们的环境搭建部分就测试OK了,我们得到了一份可以在4412板子上运行的Linux内核源码,UBoot源码和根文件系统。
所以呢,感觉培训机构的资料管理挺乱的,各个老师之间的信息不同步,资料也不同步,视频可能是很老的,配套资料也过时了,你不问还不知道,这可能也是他们需要建立大量的群来答疑的原因吧,总之,体验不佳。当然他们觉得这些步骤你不需要做啊,直接用现成的虚拟机镜像就可以了嘛,编译工具链,各种依赖库,环境变量那些都给你搞好了,干嘛要自己搞。他们这种想法就只适合那些初学驱动的人,确实,如果你只想学习驱动,那确实用他们准备好的虚拟机镜像就可以了。但是如果我要换一个芯片,环境还得自己搭,那就不好使了,或者说我自己已经有虚拟机了,再搞一个镜像其实显得很累赘。
好了,今天就到这里了,后面就开始UBoot的移植学习。
Ⅳ 我的友善之臂micro2440开发板,烧写uboot和Linux内核后我想设置nfs网络根文件系统,但是一直有问题。
linux-2.6.35在fs2410开发板启动后,通过nfs挂载文件系统,但是rtc不能用,也会在挂载文件系统之前打印如下提示信息:
TCP cubic registered
NET: Registered protocol family 1
RPC: Registered udp transport mole.
RPC: Registered tcp transport mole.
drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
IP-Config: Complete:
device=eth0, addr=192.168.20.253, mask=255.255.255.0, gw=192.168.20.1,
host=thomas_fs2410, domain=, nis-domain=(none),
bootserver=192.168.20.192, rootserver=192.168.20.192, rootpath=
Looking up port of RPC 100003/2 on 192.168.20.192
Looking up port of RPC 100005/1 on 192.168.20.192
VFS: Mounted root (nfs filesystem).
Mounted devfs on /dev
Freeing init memory: 184K
解决方案:
1. 内核配置选项
--- Real Time Clock
[*] Set system time from RTC on startup and resume
(rtc0) RTC used to set the system time
[ ] RTC debug support
*** RTC interfaces ***
[*] /sys/class/rtc/rtcN (sysfs)
[*] /dev/rtcN (character devices)
[ ] RTC UIE emulation on dev interface
*** on-CPU RTC drivers ***
<*> Samsung S3C series SoC RTC
2. linux kernel 中 已经支持S3C2410的RTC,但是并没有添加到平台设备初始化数组中,所以系统启动时并不会初始化这一部分,需要修改文件mach-smdk.c
static struct platform_device *smdk2410_devices[] __initdata = {
&s3c_device_ohci,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c0,
&s3c_device_iis,
&s3c_device_rtc, //新增代码
};
3. 创建设备节点,在文件系统/dev目录下执行:
sudo mknod rtc c 10 135
4. 重新编译内核,查看启动信息
S3C24XX RTC, (c) 2004,2006 Simtec Electronics
s3c-rtc s3c2410-rtc: rtc disabled, re-enabling
s3c-rtc s3c2410-rtc: rtc core: registered s3c as rtc0
这里说明rtc驱动起来可以正常工作了
S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics
s3c2410-wdt s3c2410-wdt: watchdog inactive, reset disabled, irq enabled
No device for DAI UDA134X
No device for DAI s3c24xx-i2s
ALSA device list:
No soundcards found.
TCP cubic registered
NET: Registered protocol family 17
s3c-rtc s3c2410-rtc: hctosys: invalid date/time
以上信息说明当前 RTC 时间invalid , RTC 初始时间为 Wed Dec 31 23:59:59 1969 ;
从内核函数 int rtc_valid_tm(struct rtc_time *tm) ,可以看出,当 year 小于 1970 时,认为是时间 invalid ,函数返回 -EINVAL ;
drivers/rtc/rtc-lib.c
/*
* Does the rtc_time represent a valid date/time?
*/
int rtc_valid_tm(struct rtc_time *tm)
{
if (tm->tm_year < 70
|| ((unsigned)tm->tm_mon) >= 12
|| tm->tm_mday < 1
|| tm->tm_mday > rtc_month_days(tm->tm_mon, tm->tm_year + 1900)
|| ((unsigned)tm->tm_hour) >= 24
|| ((unsigned)tm->tm_min) >= 60
|| ((unsigned)tm->tm_sec) >= 60)
return -EINVAL;
return 0;
}
EXPORT_SYMBOL(rtc_valid_tm);
下面来验证一下这个想法
# hwclock
Wed Dec 31 23:59:59 1969 0.000000 seconds
# date
Thu Jan 1 00:06:58 UTC 1970
系统时间是通过 date 来设置的, RTC 时间是通过 hwclock 来设置的。开机时系统时间首先通过 RTC 来获得,RTC没有设置时,系统时间也会使用Wed Dec 31 23:59:59 1969。
# hwclock --help
BusyBox v1.9.2 (2008-04-01 21:32:34 CST) multi-call binary
Usage: hwclock [-r|--show] [-s|--hctosys] [-w|--systohc] [-l|--localtime] [-u|--utc] [-f FILE]
Query and set a hardware clock (RTC)
Options:
-r Read hardware clock and print result
-s Set the system time from the hardware clock
-w Set the hardware clock to the system time
-u The hardware clock is kept in coordinated universal time
-l The hardware clock is kept in local time
-f FILE Use the specified clock (e.g. /dev/rtc2)
# hwclock -s
hwclock: settimeofday() failed: Invalid argument
# hwclock -w
s3c2410-rtc s3c2410-rtc: rtc only supports 100 years
hwclock: RTC_SET_TIME: Invalid argument
以上错误信息都是因为 year 设置不当引起的。没有设置 RTC , RTC 也不会启动计时。
下面首先设置正确的系统时间,然后将系统时间传递给 RTC 。
# date 040612282008.20
Sun Apr 6 12:28:20 UTC 2008
# hwclock -w
# hwclock
Sun Apr 6 12:29:01 2008 0.000000 seconds
# hwclock
Sun Apr 6 12:30:15 2008 0.000000 seconds
Ok , RTC 开始工作了!
为了使系统时间和 RTC 时间同步,可以在初始化文件中添加命令
Hwclock –s
使每次开机时读取 RTC 时间,并同步给系统时间。
在 etc/init.d/rcS 中添加
/bin/hwclock -s
时间设置的相关命令(转载)
1. 在虚拟终端中使用date 命令来查看和设置系统时间
查看系统时钟的操作:
# date
设置系统时钟的操作:
# date 091713272003.30
通用的设置格式:
# date 月日时分年. 秒
2. 使用hwclock 或clock 命令查看和设置硬件时钟
查看硬件时钟的操作:
# hwclock --show 或
# clock --show
2003年 09月 17日 星期三 13 时24 分11 秒 -0.482735 seconds
设置硬件时钟的操作:
# hwclock --set --date="09/17/2003 13:26:00"
或者
# clock --set --date="09/17/2003 13:26:00"
通用的设置格式:hwclock/clock --set --date=“ 月/ 日/ 年时:分:秒” 。
3. 同步系统时钟和硬件时钟
Linux 系统( 笔者使用的是Red Hat 8.0 ,其它系统没有做过实验) 默认重启后,硬件时钟和系统时钟同步。如果不大方便重新启动的话( 服务器通常很少重启) ,使用clock 或hwclock 命令来同步系统时钟和硬件时钟。
硬件时钟与系统时钟同步:
# hwclock --hctosys
或者
# clock --hctosys
上面命令中,--hctosys 表示Hardware Clock to SYStem clock 。
系统时钟和硬件时钟同步:
# hwclock --systohc
或者
# clock --systohc
使用图形化系统设置工具设置时间
参考:http://blogold.chinaunix.net/u2/63560/showart_518707.html
Ⅳ 如何将U-boot烧录到Nand中如何用tftp,nfs加载内核和文件系统
硬件平台是 XAM335x的SKEVM板子。
开发主机上安装的是ubuntu14.04。
SDK是 PROCESSOR-SDK-LINUX-AM335X 02_00_00_00。
1,运行了SDK下面的setup.sh,创建了/tftpboot,以及targetNFS目录了。
2,在sdk的更目录make都是成功的。
然后我也可以用做卡的方式把我自己编译的kernel, uboot以及系统带的 targetNFS目录下的文件系统,写握蠢到SD卡中。而且能够通过判空SD卡正常启动。
现在我想脱离SD卡启动方式。
1,所以要先把U-boot烧录到Nand中,(这里我不知道怎么下载。请告诉我下载方法。)
2,然后开机进入U-boot命令,设置好开发板IP以及serverip等配置。
3,通过tftp命令 (tftp c0008000 zImage-am335x-evm.bin)命令,串口段打印一大串###,也没报错,好像是下载内核成功了。(这掘皮瞎里请问下,tftp命令里的地址 0xc0008000是否正确?应该用什么地址?)
4,NFS下载文件系统,(这一步我也不知道怎么做,网上有命令 setenv bootargs root=/dev/nfs rw nfsroot=$serverip:$rootpath ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:off console=ttyS0,115200等等命令。
Ⅵ bootcmd怎么设置从nfs启动内核
-Boot环境变量的解释说明
环 境 变 量
解 释 说 明
bootdelay
定义执行自动启动的等候秒数
baudrate
定义串口控制台的波特率
netmask
定义以太网接口的掩码
ethaddr
定义以太网接口的MAC地址
bootfile
定义缺省的下载文件
bootargs
定义传递给Linux内核的命令行参数
bootcmd
定义自动启动时执行的几条命令
serverip
定义tftp服务器端的IP地址
ipaddr
定义本地的IP地址
stdin
定义标准输入设备,一般是串口
stdout
定义标准输出设备,一般是串口
stderr
定义标准出错信息输出设备,一般是串口
参考U-boot,其环境变量设置如下:
Uboot> printenv
bootdelay=3
baudrate=115200
ethaddr=00:12:34:56:78:9a
ipaddr=192.168.0.9 ①
serverip=192.168.0.1 ②
netmask=255.255.255.0
rootpath=/home/zht/rfsys ③
stdin=serial
stdout=serial
stderr=serial
bootcmd=tftp 21000000 uImage;bootm 21000000 ④
bootargs=root=/dev/nfs rw nfsroot=192.168.0.1:/home/zht/rfsys nfsaddrs=192.168.0.48: 192.168.0.1:192.168.0.1:255.255.255.0 console=ttyS0,115200 mem=32M ⑤
① 设置目标板IP地址
② 设置服务器IP地址
③ 设置根文件系统在服务器上的路径,注意该路径一定要设定为服务器上的nfs目录。
④ bootcmd是u-boot启动后执行的命令,命令之间用分号分隔。
tftp 21000000 uImage 表示通过tftp 将内核映像下载到RAM中地址为0x21000000;
bootm 21000000 启动linux操作系统
⑤ 定义u-boot传送给linux内核的命令行参数,该命令行指定以网络文件系统作为根文件系统。
其中root=/dev/nfs,并非真的设备,而是一个告诉内核经由网络取得根文件系统的旗标。
参数nfsroot这个参数告诉内核以那一台机器,那个目录以及那个网络文件系统选项作为根文件系统使用。参数的格式如下:
nfsroot=[:][,]
如果指令列上没有给定 nfsroot 参数,则将使用‘/tftpboot/%s’预设值。其它选项如下:
--指定网络文件系统服务端的互联网地址(IP address)。如果没有给定此栏位,则使用由 nfsaddrs 变量(见下面)所决定的值。此参数的用途之一是允许使用不同机器作为反向地址解析协议(RARP) 及网络文件系统服务端。通常你可以不管它(设为空白)。
-- 服务端上要作为根挂入的目录名称。如果字串中有个‘%s’ 符记(token),此符记将代换为客户端互联网地址之 ASCII 表示法。
-- 标准的网络文件系统选项。所有选项都以逗号分开。如果没有给定此选项栏位则使用下列的预设值:
port = as given by server portmap daemon
rsize = 1024
wsize = 1024
timeo = 7
retrans = 3
acregmin = 3
acregmax = 60
acdirmin = 30
acdirmax = 60
flags = hard, nointr, noposix, cto, ac
参数nfsaddrs设定网络通讯所需的各种网络接口地址。如果没有给定这个参数,则内核核会试著使用反向地址解析协议以及/或是启动协议(BOOTP)以找出这些参数。其格式如下:
nfsaddrs=::::::
-- 客户端的互联网地址。如果没设,此地址将由反向地址解析协议或启动协议来决定。使用何种协议端视配置核心时打开的选项以及 参数而定。如果设定此参数,就不会使用反向地址解析协议或启动协议。
-- 网络文件系统服务端之互联网地址。如果使用反向地址解析协议来决定客户端地址并且设定此参数,则只接受从指定之服务端传来的回应。要使用不同的机器作为反向地址解析与网络文件系统服务端的话,在此指定你的反向地址解析协议服务端(保持空白)并在 nfsroot 参数(见上述)中指定你的网络文件系统服务端。如果此项目空白则使用回答反向地址解析协议或启动协议之服务端的地址。
-- 网关(gateway)之互联网地址,若服务端位於不同的子网络上时。如果此项目空白则不使用任何网关并假设服务端在本地的(local)网络上,除非由启动协议接收到值。
-- 本地网络界面的网络掩码。如果为空白,则网络掩码由客户端的互联网地址导出,除非由启动协议接收到值。
-- 客户端的名称。如果空白,则使用客户端互联网地址之 ASCII-标记法,或由启动协议接收的值。
-- 要使用的网络设备名称。如果为空白,所有设备都会用来发出反向地址解析请求,启动协议请求由最先找到的设备发出。网络文件系统使用接收到反向地址解析协议或启动协议回应的设备。如果你只有一个设备那你可以不管它。
-- 用以作为自动配置的方法。如果是 `rarp' 或是 `bootp' 则使用所指示的协议。如果此值为 `both' 或空白,若配置核心时有打开这两种协议则都使用。 `none' 表示不使用自动配置。这种情况下你必须指定前述栏位中所有必要的值。
此 参数可以作为 nfsaddrs 的参数单独使用(前面没有任何 `:` 字符),这种情况下会使用自动配置。然而,此种情况不能使用 `none'作为值。
说明:这只是网上的一种说法,但是没有启动起来。因为我的kernel没有cs8900网卡驱动,烧录后可正常启动,但无法挂载NFS,我在想是否可以通过命令行参数设置,来设置uboot给kernel传递的地址参数,这样间接驱动nfs服务。我先前通过vivi这样搞过,也是可行的。
现在可以这样理解就是说,之前的kernel内核已经配置好了各个基本模块的驱动,这样就可以用了
Ⅶ 如何将U-boot烧录到Nand中如何用tftp,nfs加载内核和文件系统
【系统启动过程简介】初始化代码读取uboot到内存里面,然后跳转到uboot那里去执行uboot,uboot初始化必要的硬件,加载一些驱动,其中包括nandflash的驱动,然后根据uboot里面设置的一个启动命令:;bootm0x30007FC0意思就是,先去读取nandflash,从0x100000开始,长度为0x200000的数据到memory的0x30007FC0处,然后bootm表示从memory的0x30007FC0开始运行。也就是去运行内核镜像了。然后,内核会自己解压缩,然后执行,初始化硬件,加载驱动模块,最后去挂载rootfs,#defineCONFIG_BOOTARGS"root=/dev/mtdblock2rwinit=/linuxrcconsole=ttyS0,115200mem=16Mrootfstype=yafffs2"此文件系统,也是你实现自己用相应的文件系统制作工具,制作的,然后烧写到对应的位置的。上面中root=/dev/mtdblock2,表示,要去/dev/mtdblock2,也就是mtd的第3个分区,去加载。而这里的mtd的第3个分区具体对应的nandflash中的的地址,是你在内核中,一般是在core.c自己定义的的nandflash的分区。一般是uboot是第一个分区,内核kernel是第二个,然后就是rootfs是第三个分区,也就是/dev/mtdblock2。例如分区:staticstructmtd_partitionrm9200_partitions[3]={{/*uboot256K*/.name="uboot",.size=0x40000,.offset=0},{/*kernel1.768M*/.name="kernel",.size=0x1C0000,.offset=0x40000},{/*rootfs2M*/.name="rootfs",.size=0x200000,.offset=0x200000},};如果按照上面分区,定义的/dev/mtdblock2的起始地址是0x200000,还算成大小是2M的位置,然后,内核启动挂载rootfs的时候,就是,以上面从uboot传过来的参数中yaffs2格式,到nandflash的2M的地址读取并加载rootfs,加载完成后,这样,里面对应的根目录,以及所有的文件,文件夹就都可以识别了。然后才会去读取并运行初始化脚本相关的东西,最后初始化console控制台,然后才能看到那个常见的#,才可以输入命令,比如ls,才可以和系统交互。所以,实际就是这个rootfs,对应着mtdblock2,对应的某个nandflash上的地址,比如此处的2M的地方。而不是内核kernel这个文件映射的。
Ⅷ jz2440烧写uboot和根文件系统后(uImage_4.3也烧写了),上电启动只停留在企鹅那里卡住,QT界面显示不出来
这个应该来是文件系统的问源题,是文件系统没有初始化成功,你可以改用nfs网络文件系统,我同学买的ok6410的板子的自带的文件系统也是有问题,改用nfs可以正常启动,而且学习使用交叉编译的比较多,你可以先搭建nfs文件系统,到后面你可以自己编译文件系统,把自己编译的文件系统烧上去
Ⅸ 如何使用uboot去挂载根文件系统
用NFS方式挂载根文件系统 由于原来的内核是用ATBOOT的方式下载的,不知道怎岁悉昌么传递参数(好像不能,网上查的nfs方式都是用U-boot的方式挂载陆友的),因此决定用u-boot重新下载内核。 1.下载u-boot和乎扒内核 1.1编译内核