您尚未登录。

楼主 #1 2018-03-31 21:26:50

1066950103
会员
注册时间: 2017-11-17
已发帖子: 61
积分: 46

关于内核启动起来加载根文件问题 busybox ramdisk buildroot ext4

关于linux内核启动起来加载根文件的疑惑,linux启动起来挂载根文件必须要ramdisk么?ramdisk 必须包含些什么呢?ramdisk里面必须包含busybox所制作的命令么?ramdisk 是建立在内存上的我们平时移植了软件可以放在里面,但是软件大了放在里面必然消耗过多内存这肯定不划算。所以大一点的软件必须放在ubi yaffs2 ext4…… 等格式的文件系统里面。为了减少移植麻烦我们一般选择buildroot来选择软件,make之后会生成文件系统里面包含了busybox的命令。这样感觉busybox就重复了。感觉这块有点模糊,那个大神讲讲这些知识点之间的关系呢,实际项目中这几个关键词(busybox ramdisk buildroot ext4 )到底是怎么个关系。

离线

#2 2018-03-31 21:55:25

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,246
积分: 9197

Re: 关于内核启动起来加载根文件问题 busybox ramdisk buildroot ext4

1. Linux必须要一个根文件系统, 至于这个根文件系统在什么位置Linux根本不care, 只要在bootargs参数里面指定他的位置就可以了, 再加上把这种文件系统编译到kernel.

2. ramdisk只是根文件系统里面的其中一种, 一般编译内核的时候一起打包到Linux Image. 这样做的坏处会把内核镜像弄到比较大,而且运行时还要占用内存。减缓了启动速度,但是好处是任何时候都能启动系统,只要这个区域不破坏。我们公司的系统就是这么做的, 台湾智源的IPCAM SDK也是这么干的。我把应用程序放在别的区域, 根文件系统只读,假如应用程序升级失败, 可以通过插入U盘,系统启动ramdisk识别到U盘,可以启动拷贝命令把U盘文件读到应用程序区,再启动, 这样机器就不会在客户那里变砖头,即使升级失败还可以挽回。
当然可能还有其他好处。

3. 在ubuntu上你可以看到各个命令都是独立项目, http://git.savannah.gnu.org/gitweb/?p=coreutils.git
    这里你可以找到所有的命令完整源码 dd.c, df.c, ls.c 等, busybox 只是一个 coreutils 的精简实现而已。

4. buildroot 可以非常方便生成目标平台的各种工具(utils),当然包括busybox(Linux基本命令), Qt(GUI), ffmpeg(音视频编解码器), mplayer(视频播放器)了

5. Busybox并没有重复, 我一般都用buildroot 生成文件系统.





离线

楼主 #3 2018-03-31 22:43:36

1066950103
会员
注册时间: 2017-11-17
已发帖子: 61
积分: 46

Re: 关于内核启动起来加载根文件问题 busybox ramdisk buildroot ext4

谢谢 晕哥大神的指点。
1.linux内核启动的根文件是谁它不关心,直接指定即可。这个我明白了。
2.ramdisk 里面也会包含linux基本命令对吧,这基本命令是busybox产生的么?
3.buildroot 里面可以不选用busybox 继续用ramdisk里面的busybox的linux基本命令?
4.关于buildroot生成目标平台工具,以ffmpeg为例子吧,在嵌入式产品里面要用它肯定要裁剪的。如果不用buildroot 那么可以使用./configure 来添加或者删除编解码器 等组件。请问buildroot里面它是怎样裁剪ffmpeg的呢?

离线

#4 2018-03-31 22:50:06

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,246
积分: 9197

Re: 关于内核启动起来加载根文件问题 busybox ramdisk buildroot ext4

1066950103 说:

谢谢 晕哥大神的指点。
1.linux内核启动的根文件是谁它不关心,直接指定即可。这个我明白了。
2.ramdisk 里面也会包含linux基本命令对吧,这基本命令是busybox产生的么?
3.buildroot 里面可以不选用busybox 继续用ramdisk里面的busybox的linux基本命令?
4.关于buildroot生成目标平台工具,以ffmpeg为例子吧,在嵌入式产品里面要用它肯定要裁剪的。如果不用buildroot 那么可以使用./configure 来添加或者删除编解码器 等组件。请问buildroot里面它是怎样裁剪ffmpeg的呢?

2. 嵌入式一般是用 busybox生成的, 据说android又另起炉灶搞了另外一套更精简的。
3. 如果你有根文件系统,而且能正常引导系统,那么完全可以在buildroot里面干掉busybox.
4. ffmpeg 剪裁用不修改buildroot貌似难度很大, 因为光用menuconfig 很难做到非常精细的控制。这个时候估计还是自己configure配合适一点。





离线

楼主 #5 2018-03-31 22:58:08

1066950103
会员
注册时间: 2017-11-17
已发帖子: 61
积分: 46

Re: 关于内核启动起来加载根文件问题 busybox ramdisk buildroot ext4

1.假设我系统构建采用ramdisk+ext4 ramdisk里面包含了用busybox生成的linux基本命令,ext4里面是buildroot生成的文件系统的,那ramdisk 用起来之后怎样在去用ext4里面的buildroot呢? ramdisk和ext4 这两个里面都有{/bin,/sbin,/usr/sbin/,/usr/bin} 这些目录对吧?
2.buildroot 难道就不裁剪那里面的软件?不进行configure 的话 应该是不会有Makefile的呢!

离线

#6 2018-03-31 23:13:06

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,246
积分: 9197

Re: 关于内核启动起来加载根文件问题 busybox ramdisk buildroot ext4

1. ext4 ramdisk?很少这么干吧?
你是这么做的?
https://unix.stackexchange.com/questions/401295/how-can-i-create-an-ext4-ramdisk

mkdir /mnt/ramdisk
mount -t ramfs ramfs /mnt/ramdisk
dd if=/dev/zero of=/mnt/ramdisk/ext4.image bs=1M count=512
mkfs.ext4 /mnt/ramdisk/ext4.image
mkdir /mnt/ext4ramdisk
mount -o loop /mnt/ramdisk/ext4.image /mnt/ext4ramdisk
But remember, ext4 was not designed to use in ram! tmpfs and ramfs are always better choice in ram than any disk-based filesystem.

如上, 如果 ext ramdisk 挂载目录是 /mnt/ext4ramdisk, 那ls 的访问路径是 /mnt/ext4ramdisk/ls, 以此类推。

2. Makefile仍然有的,只是控制不够精细,非常粗糙的。
Makefile肯定有生成的, 比如Qt
output/build/qt5base-5.9.1/Makefile
当然这个目录还会生成buildroot相关的隐藏文件:

-rw-r--r-- 1 root root 0 Nov 14 10:30 .stamp_built
-rw-r--r-- 1 root root 0 Nov 14 09:47 .stamp_configured
-rw-r--r-- 1 root root 0 Nov 14 09:32 .stamp_downloaded
-rw-r--r-- 1 root root 0 Nov 14 09:32 .stamp_extracted
-rw-r--r-- 1 root root 0 Nov 14 09:32 .stamp_patched
-rw-r--r-- 1 root root 0 Nov 14 10:31 .stamp_staging_installed
-rw-r--r-- 1 root root 0 Nov 14 10:31 .stamp_target_installed

比如如果删掉 .stamp_built, 会重新编译Qt, 删掉.stamp_target_installed会重新把Qt库安装到output/target目录.





离线

楼主 #7 2018-04-01 09:24:38

1066950103
会员
注册时间: 2017-11-17
已发帖子: 61
积分: 46

Re: 关于内核启动起来加载根文件问题 busybox ramdisk buildroot ext4

晕哥 说:

1. ext4 ramdisk?很少这么干吧?
你是这么做的?
https://unix.stackexchange.com/questions/401295/how-can-i-create-an-ext4-ramdisk

mkdir /mnt/ramdisk
mount -t ramfs ramfs /mnt/ramdisk
dd if=/dev/zero of=/mnt/ramdisk/ext4.image bs=1M count=512
mkfs.ext4 /mnt/ramdisk/ext4.image
mkdir /mnt/ext4ramdisk
mount -o loop /mnt/ramdisk/ext4.image /mnt/ext4ramdisk
But remember, ext4 was not designed to use in ram! tmpfs and ramfs are always better choice in ram than any disk-based filesystem.

如上, 如果 ext ramdisk 挂载目录是 /mnt/ext4ramdisk, 那ls 的访问路径是 /mnt/ext4ramdisk/ls, 以此类推。

2. Makefile仍然有的,只是控制不够精细,非常粗糙的。
Makefile肯定有生成的, 比如Qt
output/build/qt5base-5.9.1/Makefile
当然这个目录还会生成buildroot相关的隐藏文件:

-rw-r--r-- 1 root root 0 Nov 14 10:30 .stamp_built
-rw-r--r-- 1 root root 0 Nov 14 09:47 .stamp_configured
-rw-r--r-- 1 root root 0 Nov 14 09:32 .stamp_downloaded
-rw-r--r-- 1 root root 0 Nov 14 09:32 .stamp_extracted
-rw-r--r-- 1 root root 0 Nov 14 09:32 .stamp_patched
-rw-r--r-- 1 root root 0 Nov 14 10:31 .stamp_staging_installed
-rw-r--r-- 1 root root 0 Nov 14 10:31 .stamp_target_installed

比如如果删掉 .stamp_built, 会重新编译Qt, 删掉.stamp_target_installed会重新把Qt库安装到output/target目录.

我没有按照1那种情况来想,我昨天算想明白了怎么个过程了。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn