上一篇文章说到了内核编译的问题,这篇文章记录了构造根文件系统的过程。
先大概说一下过程:原先想根据网上一些文章的内容,直接构建一个initrd,从我的redhat中把需要的目录、文件、库考过去,发现在挂在文件系统时出错,折腾了半天也没搞定。后来使用busybox,经过几天挣扎之后,终于看到可爱的concole了 ,下面把过程记录如下。
1、内核编译选项的调整
1.1 由于一开始总挂不上文件系统,所以在内核配置时,加了几个File System的选项,对具体选项的作用还要研究。 Compressed ROM file system support 、 Virtual file system support 、/proc file system support 、/dev file system support 等等。
1.2 如果VM把光驱和磁盘虚拟成 SICI 设备的话,还要选上 SICI support 。
2、建立ext2格式的文件系统印像initrd.img
2.1 创建一个空文件,将/dev/zero(0字符流)做为initrd.img的输入,块大小为1024,共4M空间。
dd if=/dev/zero of=/tmp/ramdisk.img bs=1024 count=4000
2.2 用mke2fs命令来创建一个使用这个空文件的ext2文件系统
sbin/mke2fs -F -m 0 -b 1024 /tmp/ramdisk.img 40000
2.3 以loop设备的形式挂载这个文件到/mnt/initrd
mount -o loop /tmp/ramdisk.img /mnt/initrd
3、文件系统的内容
3.1 创建一些必须的目录
mkdir /mnt/initrd/bin
mkdir /mnt/initrd/sys
mkdir /mnt/initrd/dev
mkdir /mnt/initrd/proc
mkdir /mnt/initrd/etc
3.2 创建一些设备文件,直接从redhat拷,注意用 -a 保持所有属性
cp -a /dev/console /mnt/initrd/dev
cp -a /dev/ramdisk /mnt/initrd/dev
cp -a /dev/ram0 /mnt/initrd/dev
cp -a /dev/null /mnt/initrd/dev
cp -a /dev/tty1 /mnt/initrd/dev
cp -a /dev/tty2 /mnt/initrd/dev
3.3 拷贝busybox 到bin先,建立一些符号连接,注意配置busybox时要选init ,这里就详细说busybox了。
cp $busybox_path/busybox ./mnt/initrd/bin
ln -s busybox ash
ln -s busybox mount
ln -s busybox echo
ln -s busybox ls
ln -s busybox cat
ln -s busybox ps
ln -s busybox init (初时话程序)
3.4 建立 etc/init.d/rcS 文件,这是 busybox 默认的 init
cat >> /mnt/initrd/etc/init.d/rcS 内容为:
echo
echo "hello alex :)"
echo
更改权限
chmod o+x rcS
在/mnt/initrd 下建立一个到rcS的连接 linuxrc
ln -s etc/init.d/rcS linuxrc
3.5 完成
umount /mnt/initrd
gzip -9 initrd.img
4、建立iso
4.1 把 initrd.img.gz 拷贝至 iso 制作目录
4.2 修改 loadlin 参数
loadlin vmlinuz initrd=initrd.img.gz root=/dev/ramdisk
5、搞定,贴张图show一下
很有成就感的说:P
后记
关于文件系统,可以有很多办法,用busybox 的 make all install 也可以生成。但要能构造一个能用的linux,还有很多路要走,下面还要想办法把文件系统放到VM的虚拟磁盘上、引导程序(lilo、grub)、驱动、gui等等,都能试试。