ramdisk根文件系统+initramfs


ramdisk根文件系统+initramfs
 
这几天做了下ramdisk根文件启动实验,小结下。
 
测试环境:Ubuntu 12.04
 
首先我认为先制作根文件系统好,因为配置内核中有一项跟你制作的ramdisk大小有关。
这里我是直接使用原先制作好的根文件系统。
 
1.   制作ramdisk根文件系统镜像
    首先安装ext2文件系统的制作工具:
    #sudo apt-get install genext2fs
    跳转到你的rootfs文件系统所在目录,执行如下命令
    #genext2fs -b 4096 -d rootfs ramdisk
       -b是指制作的ramdisk大小为4096K字节
       -d是指要制作成ramdisk的根文件系统目录
    最后的ramdisk是制作出来的ramdisk的名字,当然可以改名的。
    注: 若出现genext2fs: couldn't allocate a block (no free space)这样的错误,则修改4096为8192
    #gzip -9 -f ramdisk
    该ramdisk以最优方式压缩为ramdisk.gz
 
 
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 
   (4096)Default RAM disk size (kbytes)                   //如果你之前制作的ramdisk是8192kb的,则写成8192
    File system --> <*> Second extended fs support  //提供内核对ext2文件系统的支持
        退出保存配置。
 
    3.编译内核
    执行如下命令:
        #make clean
        #make uImage
    编译后生成的内核映像uImage位于当前目录下。将其拷贝到/nfs目录下
        #cp uImage /nfs
 
    4.用网线和串口线连接好开发板和电脑(暂不开启开发板),打开minicom:
            #sudo minicom
    接通开发板的电源,当出现如下字符后Hit any key to stop autoboot ,敲击键盘空格键进入uboot。
    
    6.使用uboot命令配置环境变量
            #setenv serverip 10.0.0.1             //对应主机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压缩文件起始地址在内存地址0x81000000处,文件大小为0x200000。   
       这里真的是相当的郁闷.....   我一开始下载完之后,总是在Uncompressing Linux....................................那里就停住了,搞了几天也不明所以....  主要是看的几篇文章在console=ttySx后面都没有写波特率,我也就没写。最后在后面加了个波特率就好了..  坑爹...  虽然还是不懂,为什么没写明波特率就不行了..  知道的跟我讲解下~~
            #saveenv
            然后复位下开发板,再次进入uboot。
            
    7.在另一个终端下执行如下命令配置主机ip地址
            #sudo ifconfig eth0 10.0.0.1
 
    8.继续回到minicom下测试网络是否可用
            #ping 10.0.0.1
    若打印输出语句host 10.0.0.1 is alive 表明网络可用  
 
    9.使用uboot下载内核和ramdisk并烧写。
            #nfs 0x82000000 10.0.0.1:/nfs/uImage   
            #nfs 0x81000000 10.0.0.1:/nfs/ramdisk.gz
       说明:ramdisk.gz的下载地址必须是你参数里设置的initrd对应的地址。
 
    10.启动内核
            #bootm 0x82000000
 
 PS:如果启动的时候出现如下问题:
Failed to execute /linuxrc.  Attempting defaults...
Kernel panic - not syncing: No init found.  Try passing init= option to kernel.
 
原因可能是setenv bootargs initrd=0x81000000,0x200000 root=/dev/ram  rw  console=ttyS2,115200n8 mem=64M init=/linuxrc
中的ramdisk大小设置问题,将0x200000改成0x400000。
 
如果想将uImage和ramdisk进行烧写,可执行如下命令:
 
烧写uImage(烧写地址根据自己的开发板):
 
       #nand erase 00280000 400000          //擦除从0x00280000起大小为400000的空间
       #nand write 82000000 00280000 400000   //从0x82000000读取400000大小内容到0x00280000
 
烧写ramdisk:
 
       #nand erase 00780000 400000
       #nand write 81000000 00780000 400000
 
并设置启动命令:
 
      #setenv bootcmd nand read 82000000 00280000 400000 \; nand read 81000000 00780000 400000 \; bootm 82000000
 
initramfs根文件系统启动
 
现在基于Linux的发行版通常采用initramfs代替initrd,架构更简单,应用也更灵活一些。
 
首先需要做好rootfs这个简单的根文件系统目录。唯一需要修改的是initramfs根文件系统启动时执行的第一个程序是init,而不是linuxrc,所以在制作的根文件系统中需要添加一个init文件,相应的linuxrc文件就不再需要了。
按照如下方式修改根文件系统
            #cd /nfs/rootfs
            #ln -s bin/busybox init
这样就为busybox创建了一个软链接init,这个文件就是我们要创建的init文件。
 
然后配置内核只需配置如下选项即可:
 [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support                               
         (/nfs/rootfs) Initramfs source file(s)     //括号中写明你的rootfs路径
编译生成uImage即可。
 
在设置uboot环境变量时,只需要改变bootargs变量
         #setenv bootargs console=ttys2,115200n8 mem=64M 
其他步骤与ramdisk无差别。

相关内容

    暂无相关文章