金沙澳门官网7817网址嵌入式 hi351八平台uboot引导nfs文件系统

下面是我采用的uboot的环境变量,并从在加载内核之后把通过启动参数将”从nfs挂载根文件系统”传入内核,但在OS的开发环境中,嵌入式开发通常使用,1.   制作ramdisk根文件系统镜像,首先我认为先制作根文件系统好,uImage与zImage文件的区别是uImage比zImage多个文件头,uboot只能识别uImage的文件格式

金沙澳门官网7817网址 2

ipaddr表示开辟板的ip

tftp的设置和安排

tftp即tiny
ftp
,是一种轻型的ftp协议,Ubuntu下能够运用上面那么些小本子安装并安顿。

#!/bin/bash
echo "Please input tftpdir"
read tftpdir
sudo mkdir $tftpdir        #创建用于传输文件的目录
sudo chmod 0777 $tftpdir
sudo apt-get install tftp-hpa tftpd-hpa xinetd -y
#sudo vi /etc/default/tftp-hpa
sudo touch /etc/default/tftpd-hpa
sudo chmod 0777 /etc/default/tftpd-hpa
sudo echo "TFTP_USERNAME=\"tftp\"" > /etc/default/tftpd-hpa
sudo echo "TFTP_DIRECTORY=\"$tftpdir\"" >> /etc/default/tftpd-hpa   #tftpd-hpa的服务目录,这个想建立在哪里都行
sudo echo "TFTP_ADDRESS=\"0.0.0.0:69\""     >> /etc/default/tftpd-hpa   #指定开发板地址,需要和主机的ip在同一个网段     
sudo echo "TFTP_OPTIONS=\"-l -c -s\""       >> /etc/default/tftpd-hpa   #-c是可以上传文件的参数,-s是指定tftpd-hpa服务目录,上面已指定

sudo service tftpd-hpa restart
echo -e '\n'

 PS:若是开行的时候现身如下难题:
Failed to execute /linuxrc.  Attempting
defaults…
Kernel panic – not syncing: No init
found.  Try passing init= option to kernel.

<name>
— 客户端的名目。借使空白,则选拔客户端互连网地址之 ASCII-标识法,或由运营商业事务接收的值。

#pri                    #即printenv  
baudrate=115200
bootargs=root=/dev/nfs nfsroot=192.168.0.50:/nfs rw console=ttySAC2,115200n8 init=/linuxrc ip=192.168.0.55 loglevel=7 clk_ignore_unused
bootcmd=tftp 41000000 uImage;tftp 42000000 exynos4412-origen.dtb;bootm 41000000 - 42000000
bootdelay=4
ethact=dm9000
ethaddr=11:22:33:44:55:66
fileaddr=41000000
filesize=26D213
gatewayip=192.168.2.1
ipaddr=192.168.0.55
netmask=255.255.255.0
serverip=192.168.0.50
stderr=serial
stdin=serial
stdout=serial

nfs的设置和布置

nfs即network
filesystem,能够使客户端直接从服务器挂接文件系统,方便开荒板直接待上访问大家的先后或文件。nfs的装置和安插脚本

#!/bin/bash
echo "nfs service"
echo "Please input nfs dir"
read nfsdir
sudo mkdir $nfsdir
sudo apt-get install nfs-kernel-server nfs-common portmap -y
#sudo vi /etc/exports
sudo touch /etc/exports
sudo chmod 0777 /etc/exports
sudo echo "$nfsdir  *(rw,sync,no_subtree_check,no_root_squash)" > /etc/exports
sudo service nfs-kernel-server restart
echo -e '\n'

export文件的属性选项

ro      只读访问
rw      读写访问
sync    所有数据在请求时写入共享
async   nfs在写入数据前可以响应请求
secure  nfs通过1024以下的安全TCP/IP端口发送
insecure    nfs通过1024以上的端口发送
wdelay      如果多个用户要写入nfs目录,则归组写入(默认)
no_wdelay   如果多个用户要写入nfs目录,则立即写入,当使用async时,无需此设置
hide        在nfs共享目录中不共享其子目录
no_hide     共享nfs目录的子目录
subtree_check   如果共享/usr/bin之类的子目录时,强制nfs检查父目录的权限(默认)
no_subtree_check    不检查父目录权限
all_squash      共享文件的UID和GID映射匿名用户anonymous,适合公用目录
no_all_squash   保留共享文件的UID和GID(默认)
root_squash     用户的所有请求映射成如anonymous用户一样的权限(默认)
no_root_squash  root用户具有根目录的完全管理访问权限
anonuid=xxx     指定nfs服务器/etc/passwd文件中匿名用户的UID
anongid=xxx     指定nfs服务器/etc/passwd文件中匿名用户的GID

设置收尾能够应用下边包车型地铁一声令下测试一下

$sudo mount -t nfs localhost:/home/jiang/nfs /mnt/  #localhost后面接的是nfs共享目录
$ls /mnt/
1.txt       #如果能看到nfs里面的1.txt就表示挂接成功了,nfs服务器没有问题
$sudo unmount /mnt/

 

        acregmax        = 60

netmask表示子网掩码

uboot意况布署

通过安插uboot让它在运维进程中从tftp获取基本和设施树,并从在加载内核之后把经过运维参数将”从nfs挂载根文件系统”传入内核。这么些布局首假诺通过uboot内建的”set 变量名 变量值+save“设置意况变量的法门进行计划,上边是自家利用的uboot的遭逢变量,上边是本身用的情状变量设置:

#pri                    #即printenv  
baudrate=115200
bootargs=root=/dev/nfs nfsroot=192.168.0.50:/nfs rw console=ttySAC2,115200n8 init=/linuxrc ip=192.168.0.55 loglevel=7 clk_ignore_unused
bootcmd=tftp 41000000 uImage;tftp 42000000 exynos4412-origen.dtb;bootm 41000000 - 42000000
bootdelay=4
ethact=dm9000
ethaddr=11:22:33:44:55:66
fileaddr=41000000
filesize=26D213
gatewayip=192.168.2.1
ipaddr=192.168.0.55
netmask=255.255.255.0
serverip=192.168.0.50
stderr=serial
stdin=serial
stdout=serial

baudrate尽管Porter率,习贯上就设成115200,依照硬件的差异足以对应的修改

bootargs运营参数,那几个参数除了uboot要用,运维水源之后还有或者会传出内核。
其中,root=/dev/nfs表示开荒板的根文件系统从nfs互联网设备中加载,nfsroot=192.168.0.55:/nfs表示从网络中的ip是1玖贰.16捌.0.55的主机中的/nfs目录加载根文件系统,rw表示可读可写,console=ttySAC2代表使用的中端,115200表示Porter率,init=/linuxrc表示运维的祖宗进度的职位,显著那是给linux内核用的,ip=192.168.0.55是开拓板的ip,须求和主机在同三个网段,loglevel=7便是登入等第,那个不设也行,clk_ignore_unused忽视挂钟

bootcmd启航命令,tftp 41000000 uImage表示从tftp互连网中下载uImage内核镜像到四一千000地方处,tftp 42000000 exynos4412-origen.dtb表示下载从tftp网络中下载设备树文件到4三千000地址处,bootm 41000000 - 42000000表示从四1000000起动水源,小编那从没randisk,用-代表,不是从四一千000到42000000的意味!!!,最终从4三千000挂载根文件系统。
留意:多少个指令之间用;相隔,所感到了在装置变量的时候不立时实践,应该写成set bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-origen.dtb\;bootm 41000000 - 42000000

bootdelay开发银行倒计时的秒数

gatewayip意味着网关

ipaddr代表开拓板的ip

serverip意味着主机的ip

netmask代表子网掩码

stderrstdinstdout表示行业内部输入输出错误设备,基本都填串口serial

搭建开荒情状的细节好些个,如有纰漏迎接研讨^-^调换

正文永恒更新链接地址:http://www.linuxidc.com/Linux/2016-11/137530.htm

金沙澳门官网7817网址 1

       #nand erase 002九千0 500000         
//擦除从0x002八千0起大小为600000的上空
       #nand write 八2000000 00270000 四千00  
//从0x83000000读取500000大小内容到0x002七千0

 

gatewayip意味着网关

组织表达

在有OS的嵌入式系统中,SoC的运转进度有贰个加载。

  1. 上电的率先个程序正是片上固化的运维代码,它承担把bootloader从Flash中加载到内部存款和储蓄器中并施行
  2. bootloader会从Flash中加载Linux内核以及设备树文件到内部存款和储蓄器,并对双边实行有关的计划。实现存着职业后跳转到内核的首地址
  3. 根本接管bootloader配置好的硬件财富,内核运营进度中丰硕首要的一件事正是挂载文件系统。

在付出进度中,由于bootloader平时都存有网络成效,而linux内核,设备树dts和文件系统fs都以无休止迭代的,所以大家当然希望经过配备bootloader的网络效用使其平素通过服务器(开南岭天帝机)下载内核并进一步下载设备树文件(tftp),以至一贯挂接网络上的文件系统(nfs)。整个开辟情形的组织框图如下:
金沙澳门官网7817网址 2

    捌.一而再回来minicom下测试网络是不是可用
            #ping 10.0.0.1
    若打字与印刷输出语句host 10.0.0.1 is alive 声明网络可用  

setenv bootargs ${bootargs}

ip=${ipaddr}:${serverip}:/

${gatewayip}:${netmask}:/

${hostname:${netdev}:off

serverip意味着主机的ip

嵌入式开垦常常采纳主机-开发板的支付形式,在裸板开辟中,大家普通接纳串口调节和测试工具传递文件,比方windows平台的一流终端,SecuCRT以及Linux平台的ckermit(题外话:ckermit比windows的那五个快多了)。但在OS的费用意况中,由于程序繁复,规模巨大,串口的低速和易错就不再符合我们付出了,而在这种条件下,基于网络的支出条件由于火速和正确受到了大家的爱护。

下一场配置基本只需配备如下选项就能够:
 [*] Initial RAM filesystem and RAM disk (initramfs/initrd)
support                              
         (/nfs/rootfs) Initramfs source file(s)    
//括号中写明你的rootfs路线
编写翻译生成uImage就能够。

 

bootdelay起步倒计时的秒数

烧写ramdisk:

mem:

bootargs启航参数,这些参数除了uboot要用,运转水源之后还有或者会传出内核。
其中,root=/dev/nfs意味着开垦板的根文件系统从nfs互联网设备中加载,nfsroot=192.168.0.55:/nfs意味着从网络中的ip是1玖二.16八.0.5伍的主机中的/nfs目录加载根文件系统,rw意味着可读可写,console=ttySAC2代表使用的中端,115200意味着波特率,init=/linuxrc意味着运营的古代人进度的职位,明显那是给linux内核用的,ip=192.168.0.55是开采板的ip,须求和主机在同四个网段,loglevel=7正是登入等第,那几个不设也行,clk_ignore_unused大意时钟。那么些参数的面目是uboot传入内核的,所以须求仿照效法内核的运营参数的连带文书,作者在底下做了简短的印证。除了运转参数,uboot还需求做一些其它的预备干活,并不是其一参数筹划好了基础即可干活了,举例,关于arm平台的linux内核运行条件,能够参照Linux内核源码中的Documentation/arm/Booting
,这里就不做验证了
bootcmd运转命令,tftp 41000000 uImage代表从tftp互连网中下载uImage内核镜像到4一千000地点处,tftp 42000000 exynos4412-origen.dtb代表下载从tftp网络中下载设备树文件到4两千000地点处,bootm 41000000 - 42000000代表从四一千000起动水源,作者那并没有randisk,用-代表,不是从四一千000到4两千000的意趣!!!其余,①旦填入了ramdisk地址,内核就能够从ramdisk挂载根文件系统而忽略nfs。最后,把设备树从4三千000传出内核。
只顾:多少个指令之间用;相隔,所以为了在安装变量的时候比不上时实行,应该写成set bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-origen.dtb\;bootm 41000000 - 42000000

      #setenv bootcmd nand read 82000000 00280000 400000 \; nand read
81000000 00780000 400000 \; bootm 82000000

        rsize           = 1024

baudrate正是Porter率,习于旧贯上就设成115200,依照硬件的例外足以对应的退换

烧写uImage(烧写地址依照自个儿的开荒板):

是PC端(或虚拟机)的 IP,下面的IP遵照自身的其真实处景况修改,不要弄错了。

stderrstdinstdout表示行业内部输入输出错误设备,基本都填串口serial

    四.用网线和串口线连接好开采板和Computer(暂不开启开荒板),打开minicom:
            #sudo minicom
    接通开采板的电源,当出现如下字符后Hit any key to stop autoboot
,敲击键盘空格键进入uboot。
    
    六.运用uboot命令配置遇到变量
            #setenv serverip 10.0.0.一             //对应主机IP地址
            #setenv ethaddr 00:26:6c:5a:a7:51  
       表明:该硬件地址是友善主机的硬件地址,在另三个终端下实行ifconfig
eth0 查看
            #setenv ipaddr 10.0.0.2               //开发板IP地址
            #setenv bootargs initrd=0x81000000,0x200000 root=/dev/ram 
rw  console=ttyS2,115200n8 mem=64M init=/linuxrc
       表明:意思为从ramdisk运行,ramdisk压缩文件初始地址在内部存款和储蓄器地址0x8一千000处,文件大小为0x三千00。
 
       这里真的是一对一的郁闷…..  
笔者一开首下载完今后,总是在Uncompressing
Linux………………………………这里就停住了,搞了几天也不明所以…. 
首若是看的几篇小说在console=ttySx后边都不曾写Porter率,小编也就没写。最终在背后加了个波特率就好了.. 
坑爹…  固然依旧不懂,为何没写明Porter率就特别了.. 
知道的跟自家疏解下~~
            #saveenv
            然后重新设置下开荒板,再度进入uboot。
           
    7.在另1个终端下实践如下命令配置主机ip地址
            #sudo ifconfig eth0 10.0.0.1

/home/lah/nfs   *(rw,sync,no_root_squash)

Linux内核运行参数

基本需求的起步参数在linux-4.8.5/Documentation/kernel-parameters.txt以及对应的文书中,那个参数正是uboot要求通过bootargs将他们筹算好并传给内核,当然,这几个参数都是有缺省值的,我们只须求对急需的参数举行陈设,这里列出这里运用的多少个

noinitrd    [RAM] Tells the kernel not to load any configured
            initial RAM disk.

root=       [KNL] Root filesystem
            See name_to_dev_t comment in init/do_mounts.c.

nfsroot=    [NFS] nfs root filesystem for disk-less boxes.
            See Documentation/filesystems/nfs/nfsroot.txt.

rw          [KNL] Mount root device read-write on boot

rootwait    [KNL] Wait (indefinitely) for root device to show up.
            Useful for devices that are detected asynchronously
            (e.g. USB and MMC devices).

ip=         [IP_PNP]
            See Documentation/filesystems/nfs/nfsroot.txt.

console=    [KNL] Output console device and options.
        。。。

init=       [KNL]
            Format: <full_path>
            Run specified binary instead of /sbin/init as init
            process.

loglevel=   All Kernel Messages with a loglevel smaller than the
            console loglevel will be printed to the console. 
            。。。

clk_ignore_unused
            [CLK]
            Prevents the clock framework from automatically gating
            clocks that have not been explicitly enabled by a Linux
            device driver but are enabled in hardware at reset or
            by the bootloader/firmware. 
            。。。

$grep ip=  Documentation/filesystems/nfs/nfsroot.txt -A 20
ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>

  This parameter tells the kernel how to configure IP addresses of devices and also how to set up the IP routing table. It was originally called 'nfsaddrs', but now the boot-time IP configuration works independently of NFS, so it was renamed to 'ip' and the old name remained as an alias for compatibility reasons.
。。。。

$grep nfsroot=  Documentation/filesystems/nfs/nfsroot.txt -A 20
nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]

  If the 'nfsroot' parameter is NOT given on the command line,
  the default "/tftpboot/%s" will be used.
 。。。

本文长久更新链接地址:http://www.linuxidc.com/Linux/2016-12/138659.htm

金沙澳门官网7817网址 3

    拾.起步水源
            #bootm 0x82000000

***************************************************************************

经过配备uboot让它在运维进程中从tftp获取基本和装置树,并从在加载内核之后把经过运转参数将”从nfs挂载根文件系统”传入内核。那些布局重若是经过uboot内建的”set 变量名 变量值+save“设置遇到变量的主意实行配置,上边是自家使用的uboot的情况变量,下边是自己用的情形变量设置:

参考:
      

uboot设置bootargs命令的不2秘籍

    九.使用uboot下载内核和ramdisk并烧写。
            #nfs 0x82000000 10.0.0.1:/nfs/uImage  
            #nfs 0x81000000 10.0.0.1:/nfs/ramdisk.gz
      
表达:ramdisk.gz的下载地址必须是您参数里设置的initrd对应的地址。

此参数可以用作 nfsaddrs 的参数单独选取(后面未有其他 `:` 字符),这种情况下会使用机关配置。不过,此种情况不能够使用`none’作为值。

这几天做了下ramdisk根文件运营实验,小结下。

一、运维ramdisk文件系统

 

 

一.   制作ramdisk根文件系统镜像
    首先安装ext二文件系统的创制工具:
    #sudo apt-get install genext2fs
    跳转到你的rootfs文件系统所在目录,实施如下命令
    #genext2fs -b 4096 -d rootfs ramdisk
       -b是指制作的ramdisk大小为40玖六K字节
       -d是指要制作成ramdisk的根文件系统目录
    最终的ramdisk是创设出来的ramdisk的名字,当然能够改名的。
    注: 若出现genext2fs: couldn’t
allocate a block (no free space)那样的谬误,则修改40九陆为81玖二
    #gzip -9 -f ramdisk
    该ramdisk以最优办法减少为ramdisk.gz

自个儿直接进的root帐户。

测试情状:Ubuntu 12.0四

apt-get install nfs-kernel-server

首先需求盘活rootfs这几个大致的根文件系统目录。唯1须求修改的是initramfs根文件系统运维时实施的首先个程序是init,而不是linuxrc,所以在炮制的根文件系统中要求增添3个init文件,相应的linuxrc文件就不再须求了。
根据如下格局修改根文件系统
            #cd /nfs/rootfs
            #ln -s bin/busybox init
如此那般就为busybox创制了三个软链接init,那几个文件正是大家要创立的init文件。

转移文书从此,依据所要采用运营的文件系统,设置uboot的参数:

 

        port            = as given by server portmap daemon

并安装运营命令:

 

initramfs根文件系统运维

先是个参数是nfs共享目录,第三个是你允许的主机IP,这里设置成全体客户机都可共享该目录,括号里面包车型大巴rw表示挂接此目录的客户机对该目录有读写的权柄,no_root_squash  代表同意挂接此目录的客户机享有该主机的root 身份。

比如想将uImage和ramdisk进行烧写,可奉行如下命令:

下面的这么些在自然景况下是通用的,当然那要看你日前的系统是还是不是扶助,可是mtd是字符设备,而mtdblock是块设备,有的时候候你的顺序的试到底当前的系列援助地方这种情景下,但是root=/dev/mtdblockx
rw相比通用。其它,假若直接内定设备名能够的话,那么使用此设施的器材号也是能够的。

今后基于Linux的发行版经常使用initramfs代替initrd,架构更简约,应用也越来越灵敏一些。

    root=/dev/mtdx rw
    root=/dev/mtdblockx rw
    root=/dev/mtdblock/x rw
    root=31:0x

由来大概是setenv bootargs
initrd=0x八1000000,0×300000 root=/dev/ram  rw  console=ttyS贰,115200n八mem=6四M init=/linuxrc
中的ramdisk大小设置难点,将0x三千00改成0x500000。

 

在设置uboot情形变量时,只须要转移bootargs变量
         #setenv bootargs console=ttys2,115200n8 mem=64M
其余步骤与ramdisk一点差别也没有。

参数nfsaddrs设定互联网通信所需的种种网络接口地址。假使未有给定那些参数,则内核核会试著使用反向地址剖判协议以及/或是运行商事(BOOTP)以搜索这个参数。其格式如下:

    三.编写翻译内核
    施行如下命令:
        #make clean
        #make uImage
    编写翻译后生成的内核印象uImage位于当前目录下。将其拷贝到/nfs目录下
        #cp uImage /nfs

实验板表达:
MPC8349itx开发板: IP: 59.64.155.244  网关 59.64.155.1
付出板eth0为vsc8201芯片,uboot帮忙驱动,另1芯片为沟通调换芯片vsc73八伍,单独模块驱动。
U-Boot-1.1.3 ;    Linux kernel-2.6.13
水源补助NFS分区(即编写翻译时在File system中当选[*] Root file system on
NFS), 以及补助基础IP_PNP(即编写翻译时在Networking中选中[*] IP: kernel
level autoconfiguration)
    File systems  —> 
        Network File Systems  —> 
            <*> NFS file system support                       
## 必选
                [*]   Provide NFSv3 client support             ##
可选
            [*] Root file system on NFS                        ##
必选
    Networking  —> 
        [*] Networking support 
            Networking options  —> 
                [*]   IP: kernel level autoconfiguration       ##
必选

 

x八陆 Linux主机开启nfs服务,步骤如下:

第1本人觉着先创设根文件系统好,因为布署基本中有壹项跟你制作的ramdisk大小有关。
这里笔者是直接使用原本制作好的根文件系统。

在安装配置文件在此以前,先创立共享目录/home/lah/nfs,nfs共享目录。修改nfs配置文件/etc/exports,增添如下壹行:

2.  布局基本   
  
先是解压内核到职业目录,然后进入基础目录,实施如下语句。
  #sudo su
  #make menuconfig       (如ubuntu下的用户不能够实行该命令则先实践如下命令
sudo apt-get install libncurses5-dev)
    General setup–>[*] Initial RAM filesystem and RAM disk
support
                –>    [*]Optimize for size
    Device Drivers–>Block devices–><*>RAM block device
support
   (40九陆)Default RAM disk size (kbytes)                   //要是你从前制作的ramdisk是8192kb的,则写成81九2
    File system –> <*> Second extended fs support 
//提供基础对ext二文件系统的支持
        退出保存配置。

在uboot命令行推行
=> run tftpramboot
一定于实践 B 操作

       #nand erase 00780000 400000
       #nand write 81000000 00780000 400000

二)假设选择mkimage生成内核镜像文件的话,会在根本的前头加上了64byte的音讯,供建构tag之用。bootm命令会首先判定bootm
xxxx 这几个钦命的地址xxxx是不是与-a钦定的加载地址同样。
(一)如若不一样的话会从那么些地点开首提抽出这些6肆byte的尾部,对其张开分析,然后把去掉尾部的基石复制到-a钦命的load地址中去运作之
(2)如若壹致的话那就让其原封分裂的放在那,但-e内定的进口地址会推后6四byte,以跳过那6四byte的头顶。

       假若mnt下有/home/lah/nfs目录下的文本,则印证nfs服务一度配备好了。

 

<auto>
— 用以作为活动配置的情势。纵然是 `rarp’ 或是 `bootp’ 则动用所提示的合计。如若此值为`both’ 或空白,若配置大旨时有展开那三种协议则都应用。 `none’ 代表不选择自动配置。这种情景下你不能不钦赐前述栏位中持有须求的值。

ip: