关闭
关闭

61阅读

linux启动时间-linux启动时挂载rootfs

发布时间:2018-04-22 所属栏目:linux系统启动时间

一 : linux启动时挂载rootfs

1。linux启动时,经过一系列初始化之后,需要mount 根文件系统,为最后运行init进程等做准备,mount 根文件系统有这么几种方式:

1)文件系统已经存在于硬盘(或者类似的设备)的某个分区上了,kernel根据启动的命令行参数(root=/dev/xxx),直接进行mount。 这里有一个问题,在root文件系统本身还不存在的情况下,kernel如 何根据/dev/xxx来找到对应的设备呢?注意:根文件系统和其他文件系统的mount方式是不一样的,kernel通过直接解析设备的名称来获得设备的主、从设备号,然后就可以访问对应的设备驱动 了。所以在init/main.c中有很长一串的root_dev_names(如hda,hdab,sda,sdb,nfs,ram,mtdblock……),通过这个表就可以根据设备名称得到设备号。注意,bootloader或内核中设定的启动参数(root=/dev/xxx)只是一个代号,实际的根文件系统中不一定存在这个设备文件!

2)从软驱等比较慢的设备上装载根文件系统,如果kernel支持ramdisk,在装载root文件系统时,内核判断到需要从软盘(fdx)mount(root=/dev/fd0),就会自动把文件系统映象复制到ramdisk,一般对应设备ram0,然后在ram0上mount 根文件系统。 从源码看,如果kernel编译时没有支持ramdisk,而启动参数又是root=/dev/fd0, 系统将直接在软盘上mount,除了速度比较慢,理论上是可行的(没试过,不知道是不是这样?)

3)启动时用到initrd来mount根文件系统。注意理解ramdisk和initrd这两个概念,其实ramdisk只是在ram上实现的块设备,类似与硬盘操作,但有更快的读写速度,它可以在系统运行的任何时候使用,而不仅仅是用于启动;initrd(boot loader initialized RAM disk)可以说是启动过程中用到的一种机制,具体的实现过程也使用ramdisk技术。就是在装载linux之前,bootloader可以把一个比较小的根文件系统的映象装载在内存的某个指定位置,姑且把这段内存称为initrd(这里是initrd所占的内存,不是ramdisk,注意区别),然后bootloader通过传递参数的方式告诉内核initrd的起始地址和大小(也可以把这些参数编译在内核中),在启动阶段就可以暂时的用initrd来mount根文件系统。initrd的最初的目的是为了把kernel的启动分成两个阶段:在kernel中保留最少最基本的启动代码,然后把对各种各样硬件设备的支持以模块的方式放在initrd中,这样就在启动过程中可以从initrd所mount的根文件系统中装载需要的模块。这样的一个好处就是在保持kernel不变的情况下,通过修改initrd中的内容就可以灵活的支持不同的硬件。在启动完成的最后阶段,根文件系统可以重新mount到其他设备上,但是也可以不再 重新mount(很多嵌入式系统就是这样)。 initrd的具体实现过程是这样的:bootloader把根文件系统映象装载到内存指定位置,把相关参数传递给内核,内核启动时把initrd中的内容复制到ramdisk中(ram0),把initrd占用的内存释放掉,在ram0上mount根文件系统。从这个过程可以看出,内核需要对同时对ramdisk和initrd的支持(这种需要都编入内核,不能作为模块)。

2。嵌入式系统根文件系统的一种实现方法:对于kernel和根文件系统都存储在flash中的系统,一般可以利用linux启动的initrd的机制。具体的过程前面已经比较清楚了,还有一点就是在启动参数中传递root=/dev/ram0,这样使得用initrd进行mount的根文件系统不再切换,因为这个时候实际的设备就是ram0。还有就是initrd的起始地址参数为虚拟地址,需要和bootloader中用的物理地址对应。

二 : 减少linux启动时间

1.verifying the kernel image验证内核镜像。
如果我们的内核是好的,为什么我们需要每次重启内核做重新验证呢?所以我们可以去掉内核验证来提高系统启动时间。
uboot #setenv verify none
上面这条命令在我们启动内核时去掉了对内核的验证工作,从而提高了内核启动时间
2.再花费了将近2秒钟的时间来得到网络的物理链接包括获得DHCP ip地址
uboot #setenv ip_method none
依赖于网路速度这个过程可能会增长启动时间。事实上,在没有DHCP服务器的情况下会为超时花费好几分钟。
通过内核网络配置,设置ip=off在启动参数将会仍然允许你在用户空间配置网络。所以关掉ip_method会减少启动时间。
3.内核初始化工具将会帮助你找到内核中花费很长时间初始化的静态驱动
uboot #setenv optargs initcall_debug
uboot #saveenv
当linux系统启动后你能通过dmesg | grep initcall 来查看静态驱动消耗的启动时间。
[xxxxx] initcall [] returned 0 after usecs
如果CONFIG_PRINT_TIME 允许 dmesg | grep initcall |sort -k8 -n 否则 dmesg | grep initcall | sort -k6 -n
可以通过使用内核中bootgraph 脚本来查看initcall时间
CONFIG_PRINTK_TIME被允许 cat | perl /scripts/bootgraph.pl> boot.svg
你能够通过使用其他工具帮助你分析linux 内核。例如:
1.linux Trace Toolkit(LTTng) 2.Oprofile 3.Bootchart
4.优化的领域
一般来说在2个地方优化
1.大小
减小二进制的大小
删除不需要的功能减少组件的大小
2.速度
优化目标处理器
Neon优化
使用最快的多媒体启动
NOR/NAND vs 美眉C/USB
减少启动的任务数
如果从NAND中启动不要检查美眉C
如果从美眉C启动不要初始化网络
减少初始化操作
如果不需要不要带着网络启动
没有网之际不要在设备上启动SSH服务
3.减少环境大小以便减少读到内存的数据量
CONFIG_ENV_SIZE
4.去掉不必要的console打印状态
uboot # setenv silent 1
5.设置启动延时时间
uboot #setenv bootdelay 0
6.禁用未用外设 例如 USB/美眉C/Ethernet/UART
7.修改你设备<u-bootsources>/include/configs. 例如am335x_emv.h
避免长文本帮助文件为U-BOOT启动命令节省空间
#undef CONFIG_SYS_LONGHELP
使用简单的parser代替hush
#undef CONFIG_SYS_HUSH_PARSER
如果没有USB/NAND/美眉C/SPI/NOR(flash)
#undef CONFIG_USB
#undef CONFIG_NAND
#undef CONFIG_美眉C
#undef CONFIG_SPI
#undef CONFIG_FLASH_*
8.删除编译器-g操作
10.其他主意
禁止UART启动
删除镜像验证
尝试不压缩镜像
验证内核读到正确的内存位置
11.从内核中删掉不必要的驱动特性
减少驱动初始化时间
减少内核大小
12.构建非快速驱动为模块
当那有更多时间,在系统启动之后加载
13.禁止console口输出使用静默
不显示console信息的花费时间
在启动参数中,设置静默,但是仍然被记录。
uboot #setenv optargs quiet
删掉不使用的consoles。这些初始化花费时间。这些在/etc/inittab中删掉
完全的禁用printk是可能的,但是这个将会消除许多调试信息。
14.延迟模块init call调用
延迟模块initcalls没有建立动态模块是可能的。这个需要修改kernel。对于模块来说不必要在启动之际替代module_init()功能调用deferred_module_init(),一旦系统启动延迟调用能被这样执行。
echo 1 > /proc/deferred_initcalls
更多的细节参照http://elinux.org/Deferred_Initcalls
15.禁用内核调试特性
内核调试
调试文件系统
追踪
16.删掉你能增加的例如initcall中的任何指令
17.预设每1个计时器循环
你需要立即[www.61k.com]测量找到lpj在内核启动信息里。例如718.02BogoMIPS 增加lpj=3590144到启动参数中
18.尽可能的使用静态IP
如果你不需要网络那么完全禁止它
如果你需要网络性能,但是不是NFS那么在内核启动参数行里确定设置 ip=off
19.通过”mem=“操作设置内存限制
尽可能的使用更多的需要的内存以避免内存初始化时间
20.使用最小busybox文件系统
减少forking in shell
构建静态以减少文件系统不使用的代码。小心这些静态链接也能引起你的系统大小的显著增加
21.避免使用ramdisk或者initramfs

本文标题:linux启动时间-linux启动时挂载rootfs
本文地址: http://www.61k.com/1130927.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1