linux汇编学习(6)---添加根文件系统

【完整代码   https://github.com/linzhanglong/mini_bootloader  】

       现在我们开始添加一个文件系统。如何引导文件系统呢?一个古老的方法就是通过命令函数。bootloader传给内核 root=xxxx,然后由内核去加载这个分区,然后执行里面的文件,这个有个问题就是这个分区可能是外置存储,或者其他各种各样的存储。这样就有一个问题就是内核需要有对应的驱动去访问和挂在这个分区,然后才能去读取执行分区里面的执行文件。内核不可能去兼容各种存储,所以引入了initramfs 文件系统。这个是集成到内核里面的内存文件系统,使用者自己通过这个文件系统去挂在自己真正的文件系统,具体怎么挂载,需要什么驱动这个都是使用者自己去实现了。

      那我们怎么设计自己文件系统呢?我们需要一个磁盘,这个磁盘有两个分区,第一个分区就是存放内核(集成内存文件系统initramfs),第二个分区存放我们真正的文件系统。

       那么我们现在第一步就是实现这个文件系统,然后编译到内核去。详细的制作可以看: https://wiki.gentoo.org/wiki/Custom_Initramfs

      1. 新建基本的文件和目录:

 #mkdir -p /usr/src/initramfs/{bin,dev,etc,lib,lib64,mnt/root,proc,root,sbin,sys}
 #cp -a /dev/{null,console,tty} /usr/src/initramfs/dev/

      2. 我们要挂载我们真正的文件系统,所以我们需要mount命令,怎么办呢?通过静态编译busybox就可以达到我们要的各种常用的命令,并且是静态链接的!所以我们现在在另一个目录编译一个busybox

#http://busybox.net/downloads/busybox-1.27.2.tar.bz2
# tar xvf busybox-1.27.2.tar.bz2
# cd busybox-1.27.2
# make menuconfig
 Busybox Settings  --->
    [*] Build BusyBox as a static binary (no shared libs)
保存
#make
#make install


现在那些命令就放在_install目录下。

这里为了简单直接把busybox的可执行文件拷贝到内存文件系统

#cp /home/busybox-1.27.2/_install/bin/* /usr/src/initramfs/bin/
#cp /home/busybox-1.27.2/_install/sbin/* /usr/src/initramfs/sbin/

       3. 内核执行内存文件系统,第一个执行文件就是内存文件的根目录的init文件,所以我们就是通过这个文件来挂载我们真正的文件系统:

#vim /usr/src/initramfs/init
#!/bin/busybox sh
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs none /dev #使用udev机制,这样就可以加载磁盘设备名称了
#挂载我们的磁盘文件系统,hda2存放我们的是磁盘文件系统,具体见下面介绍
mount /dev/hda2 /mnt
#切换到磁盘文件系统
exec switch_root /mnt /sbin/init


    现在把内存文件系统集成到内核去,还有qemu模拟的磁盘是IDE磁盘,控制器是piix的IDE控制器,所以内核要添加对应的驱动

    General setup  --->
           [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
           ( /usr/src/initramfs) Initramfs source file(s)
    Device Drivers  --->
    <*> ATA/ATAPI/MFM/RLL support (DEPRECATED)  --->
        <*>   generic ATA/ATAPI disk support
        [*]     ATA disk support
        <*>   Intel PIIX/ICH chipsets support
    File systems  --->
        <*> Ext3 journalling file system suppor
        [*]   Default to 'data=ordered' in ext3
        [*]   Ext3 extended attributes

编译得到bzImage,现在引导这个内核启动就可以进入内存文件系统了。

      4,最后就是通过内存文件系统引导我们磁盘的文件系统了!

      4.1  首先制作文件系统,这里和上面差不多,这里直接用busybox的各种命令:

#mkdir /home/rootfs && cd /home/rootfs
#mkdir root dev etc bin sbin mnt sys proc lib home tmp var usr
#mkdir usr/sbin usr/bin usr/lib usr/modules
#mkdir mnt/usb mnt/nfs mnt/etc mnt/etc/init.d
#mkdir lib/modules

#mknod -m 660 /home/rootfs/dev/console c 204 64
#mknod -m 660 /home/rootfs/dev/null c 1 3

开始拷贝busybox东西
#cp /home/busybox-1.27.2/_install/* /home/rootfs/ -rdf
#cp /home/busybox-1.27.2/examples/bootfloppy/etc/* /home/rootfs/etc/ -rdf

支持mdev
#vim /home/rootfs/etc/fstab
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0

#vim /home/rootfs/etc/init.d/rcS
#! /bin/sh
mkdir /dev/pts
/bin/mount -a
echo /sbin/mdev>/proc/sys/kernel/hotplug #启动热插拔事件;
mdev -s


现在把文件系统写到磁盘去,我们修改之前make_disk.sh文件,这个文件新建一个20G的磁盘文件,然后进行分区。第一个分区占用1G,存放stage2代码和bzImage代码,第二个分区存放我们的磁盘文件系统。(stage1是MBR代码,写入磁盘的头446字节):

# !/bin/bash
rm -rf stage1 stage2 disk.qcow2

#新建一个20G的磁盘文件
qemu-img create -f qcow2 disk.qcow2 20G
if [[ $? != 0 ]];then
    exit 1
fi

qemu-nbd -c /dev/nbd0 disk.qcow2
if [[ $? != 0 ]];then
    exit 1
fi

#格式化磁盘,分为两个分区,第一个分区(从1M偏移开始到1G的位置),剩余的是第二个分区
fdisk /dev/nbd0 <


到此我们的文件系统就OK了,这里是最终的效果图:


linux汇编学习(6)---添加根文件系统_第1张图片






      

      

你可能感兴趣的:(linux汇编学习(6)---添加根文件系统)