bootargs--内核启动参数介绍
bootargs 是 bootloader 传递给内核的启动字符串。
****************************************
甲:bootargs,常用的几种组合:
****************************************
1). 假设文件系统是ramdisk,且直接就在内存中,bootargs的设置应该如下:
setenv bootargs ‘initrd=0x32000000,6M root=/dev/ram0 console=ttySAC0 init=/linuxrc’
2). 假设文件系统是ramdisk,且在flash中,bootargs的设置应该如下:
setenv bootargs ‘root=/dev/ram rw console=ttyS0,115200 init=/linuxrc’
注意这种情况下你应该要在bootm命令中指定ramdisk在flash中的地址,如bootm kernel_addr ramdisk_addr (fdt_addr)
3). 假设文件系统是jffs2类型的,且在flash中,bootargs的设置应该如下
setenv bootargs ‘noinitrd root=/dev/mtdblock2 rw rootfstype=jffs2 init=/linuxrc console=ttyS0,115200’
文件系统默认是ext2, 就不用写了
4). 假设文件系统是基于nfs的,bootargs的设置应该如下
setenv bootargs ‘noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5:192.168.0.3:192.168.0.3:255.255.255.0::eth0:off’
或者
setenv bootargs ‘noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5’
****************************************
乙: initramfs 和 initrd
****************************************
1.initramfs在编译内核的同时被编译并与内核连接成一个文件,它被链接到地址__initramfs_start处,与内核同时被 bootloader加载到ram中
使用initramfs,命令行参数将不需要"initrd="和"root="命令.
initrd是另外单独编译生成的,是一个独立的文件,它由bootloader单独加载到ram中内核空间外的 地址,
例如加载的地址为addr(是物理地址而非虚拟地址),大小为8MB,
那么只要在命令行加入"initrd=addr,8M"命令,系统就可以找到 initrd
2.Linux内核只认cpio格式的initramfs文件包
3.
initramfs不依赖单独ramdisk,
initrd依赖ram disk,需要配置
CONFIG_BLK_DEV_RAM
CONFIG_BLK_DEV_INITRD选项 -- 支持initrd,
------------------------------------------------------
使用initramfs的内核配置(使用initramfs做根文件系统):
------------------------------------------------------
General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
(/rootfs_dir) Initramfs source file(s) //输入根文件系统的所在目录
使用initramfs的内核启动参数
不需要"initrd="和"root="参数,但是必须在initramfs中创建/init文件或者修改内核启动代码
(init 文件是软连接,指向什么? init -> bin/busybox,否则内核启动将会失败)
链接入内核的initramfs文件在linux-2.6.24/usr/initramfs_data.cpio.gz
------------------------------------------------------
使用initrd的内核配置(使用网口将根文件系统下载到RAM -- tftp addr ramdisk.gz):
------------------------------------------------------
1. 配置initrd
General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
() Initramfs source file(s) //清空根文件系统的目录配置
2. 配置ramdisk
Block devices --->
<*> RAM disk support
(16) Default number of RAM disks // 内核在/dev/目录下生成16个ram设备节点
(4096) Default RAM disk size (kbytes)
(1024) Default RAM disk block size (bytes)
使用 initrd的内 核启动参数:
initrd=addr,0x400000 root=/dev/ram rw
注:
(1) addr是根文件系统的下载地址;
(2) 0x400000是根文件系统的大小,该大小需要和内核配置的ramdisk size 4096 kbytes相一致;
(3) /dev/ram是ramdisk的设备节点,rw表示根文件系统可读、可写;
------------------------------------------------------
根文件系统存放在FLASH分区:
------------------------------------------------------
1. 内核启动参数不需要"initrd="(也可以写成"noinitrd");
root=/dev/mtdblock2 (/dev/mtdblock2 -- 根文件系统所烧写的FLASH分区)
2. 内核配置不需要ramdisk;也不需要配置initramfs 或者initrd
[ ] Initial RAM filesystem and RAM disk (initramfs/initrd) support
****************************************
丙: initramfs 利弊
****************************************
1. 利 -- > 简单, 不需要其他文件了
2. 弊 -- > 浪费内存
a. cpio包实际是文件、目录、节点的描述语言包,为了描述一个文件、目录、节点,要增加很多额外的描述文字开销,
特别是对于目录和节点,本身很小 额外添加的描述文字却很多,这样使得cpio包比相应的image文件大很多
b. initramfs 占用内存不能被释放, initrd 占用内存可以被释放
----------------------------------------
补充: 内存盘技术
----------------------------------------
把Linux系统完全嵌入到内存中,而不依赖于任何其他硬盘。现在PC机内存至少128M,而根文件系统所用的只有 30MB,
因此不仅不会使整机性能下降,反而有很大的提高
ramdisk: 是一种基于内存的虚拟磁盘技术,采用ext2文件系统, 把内存当磁盘用
initrd: bootloader可以把一个比较小的根文件系统的映象装载在内存的某个指定位置,
姑且把这段内存称为initrd,然后通过传递参数的方式告诉内核initrd的起始地址和大小(也可以把这些参数编译在内核中),
在启动阶段就可以暂时的用initrd来mount根文件系统
initramfs: 支持cpio格式文件, 直接把镜像编译进内核的方式。