2017年(111)
分类: LINUX
2017-06-23 19:24:37
dd if=/dev/zero of=ramdisk_ext2 bs=1k count=11000
sudo losetup /dev/loop2 ramdisk_ext2
sudo mke2fs -m 0 /dev/loop2
mkdir tempdir -p
sudo mount -t ext2 /dev/loop2 tempdir/
sudo cp initramfs/* tempdir/ -rf
sudo umount tempdir
sudo losetup -d /dev/loop2
rm ramdisk_ext2.gz
rm tempdir -rf
gzip -9 ramdisk_ext2
说明:如果大家通过 make menuconfig 配置内核启动参数CONFIG_CMDLINE的时候,对具体参数不知道什么含义,
可以在内核源代码目录里面找到详细的说明,文档路径如下:
Documentation\kernel-parameters.txt
内核是如何挂载root文件系统的?
简单说,linux内核运行的最后阶段会执行 mount_root() 函数,挂在root文件系统。
但是,整个过程,基于以下几点内容:
1. 内核只有支持了相应的root文件系统的驱动,才能挂载相应root文件系统。
-- CONFIG_BLK_DEV_RAM=y,使内核支持 root ramdisk 驱动
-- CONFIG_ROOT_NFS=y,使内核支持 root nfs 驱动
2. 通过内核启动参数CONFIG_CMDLINE的root选项可以让kernel运行到最后阶段决定加载何种文件系统的驱动
-- root=/dev/ram0 加载ramdisk root文件系统的驱动
-- root=/dev/nfs 加载nfs root文件系统的驱动
3. 内核加载相应的 root文件系统驱动后,这些驱动程序就会让内核正常的挂载相应的root文件系统
root文件系统常用的格式有,ramfs、nfs、ramdisk、yaffs等
在调试阶段常使用的 root 文件系统有如下几个:
1. ramfs文件系统
ramfs文件系统比较简单,只需将制作好的busybox目录在内核config文件中指定一下就可以了。
主要关注下面两个配置:
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE="/home/lidongliang/root_fs"
CONFIG_CMDLINE="console=ttyS0,115200 mem=900M root=/dev/ram0 rootfstype=ramfs noinitrd init=/init"
- mem =512M 表示内核管理的物理内存大小
(进入shell后,可以通过 cat /proc/meminfo 查看内核管理的物理内存的情况)
- initrd 表示将ramdisk文件系统放到物理内存中的起始地址
- root=/dev/ram0 表示采用了哪种Root filesystem,ram0表示内存硬盘(ramdisk)
- init=/init 表示制定init进程,比如init=/sbin/init
2. nfs文件系统
前提1:网卡驱动工作正常
前提2:建立 nfs server (10.0.13.198:/opt/share/fs/nfs_rootfs)
只需在nfs 服务器上添加你的制作好的busybox目录,格式如下:
vi /etc/exports 添加如下内容:
/opt/share/fs/nfs_rootfs *(rw,sync,no_root_squash)
然后重启nfs: /etc/init.d/nfs-kernel-server restart
CONFIG_NETWORK_FILESYSTEMS=y
CONFIG_NFS_FS=y
CONFIG_NFS_V3=y
CONFIG_ROOT_NFS=y
- 使内核支持 root nfs
CONFIG_NFS_COMMON=y
CONFIG_CMDLINE="console=ttyS0,115200 mem=512M root=/dev/nfs rw nfsroot=10.0.13.198:/opt/share/fs/nfs_rootfs noinitrd init=/init ip=10.0.13.244:10.0.13.198:10.0.12.1:255.255.254.0:target:eth0:none"
- root=/dev/nfs 表示采用
了哪种Root filesystem,nfs表示网络文件系统
- ip=10.0.13.244:10.0.13.198:10.0.12.1:255.255.254.0:target:eth0:none
ip=
详细信息请看 Documentation/filesystems/nfs/nfsroot.txt
- nfsroot=10.0.13.198:/opt/share/fs/nfs_rootfs 表示 nfs server 的路径
3. ramdisk文件系统
前提:制作ext2文件系统,并将busybox拷贝到制作的文件系统中去,然后压缩。
dd if=/dev/zero of=ramdisktao bs=1k count=8000 //建立一块虚拟的磁盘文件
losetup /dev/loop0 ramdisktao //虚拟成循环设备
mke2fs -m 0 /dev/loop0 //格式化虚拟的磁盘文件
mount -t ext2 /dev/loop0 abc/ //将虚拟的磁盘文件mount到abc目录下
cp rootfs/* abc/ -rf //将busybox拷贝到虚拟的磁盘中
umount abc //卸载虚拟的磁盘文件
gzip -9 ramdisktao ramdisktao.gz //压缩成gz格式
如果要往文件系统里面添加文件
gunzip -d ramdisktao.gz //解压压缩过的磁盘文件
mount ramdisktao abc/ //将磁盘文件挂载到abc目录
拷贝文件到abc目录
umount abc //卸载虚拟的磁盘文件
gzip -9 ramdisktao //压缩成gz格式
然后将 ramdisktao.gz 下载到 0x81000000 地址
CONFIG_BLK_DEV_RAM=y
- 使内核支持root ramdisk
CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_=8192
- 配置内核支持的ramdisk的大小(KB)
CONFIG_CMDLINE="console=ttyS0,115200 mem=512M root=/dev/ram0 initrd=0x81000000,0x00800000 rootfstype=ext2"
- initrd (含义同ramfs文件系统)
- root=/dev/ram0 (含义同ramfs文件系统)
- rootfstype=ext2 表示文件系统的类型是ext2
4. ae使用的gzip格式的ramdisk文件系统
ramdisk.img 是android使用 ./mkbootfs /opt/share/fs/root_fs | ./minigzip > ramdisk.img 得到的
内核支持gzip格式的ramdisk文件
[*]Initial RAM filesystem and RAM disk (initramfs/initrd) support x x
()Initramfs source file(s) x x
[*]Support initial ramdisks compressed using gzip
CONFIG_CMDLINE="console=ttyS0,115200 mem=128M init=/init)
//CONFIG_CMDLINE="console=ttyS0,115200 mem=128M initrd=0x82000000,0x00800000 init=/init)
以后再补充