• 基于busybox和LFS的linux系统定制


    自从在大学知道了Linux这玩意是可以定制的之后,一直想做出一版属于自己的Linux系统。最近工作比较闲,终于塌下心来好好学习了一下。
     
    目前来说,我接触的定制Linux的方法主要有两种:
     
    1、以busybox为核心,通过构建initrd+busybox做出的fs+内核这三大块,构建Linux
     
    2、采用更底层方式,基于源代码级,通过编译&构建自己的工具链+编译&构建自己的lfs+内核这三大块,构建Linux,其中最典型的就是我刚刚完成的LFS系统。
     
    关于两种方法的优缺点呢,由于我接触的还比较肤浅,所以认识可能有些错误。
     
    方法1在速度上要比2快得多,更适合于小型嵌入式Linux。而方法2由于采用了更底层更直接的方式,适合用来学习Linux的架构,也有很好的拓展性和自由性,对定制比较灵活,打好基础后续还可以继续BLFS。
     
    先不管那么多,我只是想做个笔记而已,以免做完了,过了两月,怎么做的都忘干净了= =!
     
    方法一:
     
    需要准备工具:
     
    宿主机一台,硬盘一块(学习时可以使用虚拟机的虚拟磁盘),纯洁的内核一份,busybox源代码一份
     
    1、将硬盘分两个区,一个boot用,一个当根文件系统用,之后分别挂载至宿主机的/mnt/boot和/mnt/sysroot目录。
     
       将grub安装到boot目录:grub-install --root-directory=/mnt /dev/sda
     
    2、编译busybox,这玩意做的menuconfig跟内核很像呢,在里面选上下面这项,即编译出来的busybox不与宿主机共享库文件,之后make install:
     
       Busybox Settings --> Build Options -->  Build BusyBox as a static binary (no shared libs)
     
    3、制作initrd。initrd全称是init ram disk,在我理解就是在linux启动之前运行在ram中的临时根文件系统,用来挂载实际硬盘上的根文件系统。对于一些需要热关机的场合,initrd其实直接就可以当最终文件系统来使用。
     
       制作方法是这样的,在宿主机/tmp目录下建一个initrd文件夹,将刚才busybox安装完毕出现的_install文件夹下内容全部拷贝到initrd文件夹下,此时其中已经包含了部分系统常用命令。
     
       接下来建立系统常用的文件夹:mkdir -pv  proc  sys  etc tmp  dev  mnt/sysroot
     
       创建两个必要的设备文件:
           mknod  dev/console  c  5  1
           mknod  dev/null  c  1  3
     
       建立init脚本,实现initrd启动后对rootfs的切换
     
    [root@localhost initrd]# vim  init
     
    [root@localhost initrd]# cat init
     
    #!/bin/sh
    mount -t proc proc /proc
    mount -t sysfs sysfs /sys
    mdev -s
    mount -t ext3 /dev/hda2  /mnt/sysroot
    exec  switch_root  /mnt/sysroot  /sbin/init
    #给此脚本执行权限:
    chmod  +x  init
    这里需要注意一下,由于各种可能原因,init脚本启动无法挂载rootfs,尤其是在mdev -s这步,这里有一个调试办法,直接在initrd中启动shell。
    /sbin/getty -n -l /bin/sh 38400 tty1
    exec /bin/sh
    以上的代码可以酌情加载init脚本中某个位置。
     
    好,到这里initrd就制作完毕了,把它打包,待用。
     
    find  .  | cpio  --quiet  -H newc  -o  | gzip  -9 > /mnt/boot/initrd.gz
     
    5、接下来制作真正的rootfs,其实方法原理跟制作initrd差不多了。以下为无脑转载:
     
     
    #拷贝busybox中所有文件到/mnt/sysroot
    cp -a busybox-1.20.2/_install/* /mnt/sysroot
    #创建minilinux所需的目录
    mkdir -pv /mnt/{boot/grub,sysroot/{boot,proc,sys,bin,sbin,lib/modules,usr/{bin,sbin,lib},var/{run,log,lock},etc/{init.d,rc.d},dev/pts,home,root,tmp}}
    #创建两个必要的设备文件:
    mknod  dev/console  c  5  1
    mknod  dev/null  c  1  3
    #配置init所需的inittab配置文件
    cd  /mnt/sysroot
    rm  -f  linuxrc
    [root@localhost sysroot]# vim etc/inittab 
    [root@localhost sysroot]# cat etc/inittab 
    ::sysinit:/etc/rc.d/rc.sysinit
    ::respawn:/sbin/getty 9600 tty1
    ::respawn:/sbin/getty 9600 tty2
    ::respawn:/sbin/getty 9600 tty3
    ::shutdown:/bin/umount -a -r
    ::ctrlaltdel:/sbin/reboot
    #配置系统初始化脚本etc/rc.d/rc.sysinit
    [root@localhost sysroot]# vim  etc/rc.d/rc.sysinit
    [root@localhost sysroot]# cat etc/rc.d/rc.sysinit
    #!/bin/sh
    echo -e " Welcome to  33[31mMageEdu33[0m Linux"
    echo -e "Remounting the root filesystem ..."
    mount -t proc proc /proc
    mount -t sysfs sysfs /sys
    mount -o  remount,rw  /
    echo -e "Creating the files of device ..."
    mdev -s
    echo -e "Mounting the filesystem ..."
    mount -a
    swapon -a
    echo -e "Starting the log daemon ..."
    syslogd
    klogd
    echo -e "Configuring loopback interface ..."
    ifconfig  lo  127.0.0.1/24
    ifconfig eth0 172.16.100.100/16
    #而后让此脚本具有执行权限:
    chmod +x  etc/rc.d/rc.sysinit
    #为系统准备一个“文件系统表”配置文件etc/fstab
    [root@localhost sysroot]# vim  etc/fstab
    [root@localhost sysroot]# cat etc/fstab
    sysfs                   /sys                    sysfs   defaults        0 0
    proc                    /proc                   proc    defaults        0 0
    /dev/hda1               /boot                   ext3    defaults        0 0
    /dev/hda2               /                       ext3    defaults        1 1
    ————————————————————转载结束————————————————————————
    需要注意的是,fstab这个文件十分重要,要配置符合成实际使用情况。
    4、把纯洁的内核先给编译喽,可以精简部分选项.。第一次最好要做好完全准备,记得提前make mrproper。编译完成后,把编译好的bzImage文件拷到boot分区下。
    5、现在既有了内核,又有了initrd,该配置grub.conf了,同样注意实际使用情况。
    6、一定记得sync,之后新建一个虚拟机,用做好的硬盘应该就可以引导起来了。
    关于busybox这个方法,网上有大量教程,很详细,思路都差不多,就说道这里。
    方法二:
     
    需要准备工具:
     
    宿主机一台,硬盘一块(学习时可以使用虚拟机的虚拟磁盘),LFS-packeages,官方提供下载,我用的是stable7.3
     
    其实关于这个方法,最好的还是去读官方教程,写的非常好,非常详细,也连带着许多知识点,我这就记录一个思路。
     
    下面我说一下我的理解。
    我们要做一个系统,最重要的一点是保证她的纯洁,即做完了的这个系统是个独立的系统,与宿主机毫无瓜葛,那么由于LFS是基于代码级的,所有程序都需要编译,这就意味着编译时依赖的编译器、glibc库等,是一个重点,也就是反复提到的工具链,如下。
    宿主机工具链-》编译出LFS系统工具链-》进行自编译,形成独立-》构建rootfs
    整个LFS的流程是这样的
    1、还是将硬盘分区
    2、新建一个用户,进入该目录,依附宿主机分别编译Binutils和Gcc,之后编译Glibc,接着,基于刚编译好的Glib重新编译Binutils和Gcc。其实工具链的布置就是这么个意思,摆脱了与宿主机的关系。当然,这三个是最基本的,除此之外,在布置工具链还需要大量的工具,而这些工具是基于这三个的。
    3、下面chroot,进入纯净的LFS系统,从零开始。通过上面完成的工具链,一个一个安装需要的命令。
    4、编译内核、配置fstab、配置grub,但是没有initrd。在网上查了一下原因,原来initrd存在的意义还可以缩小真正系统的内核大小,因为其中有一些系统启动时候需要的启动介质驱动、根文件系统驱动,所以一般发行版都有。但LFS一般只供单机使用,所以就没有这个步骤,当然想加也是可以加上的。
     
    以上是一个初学者的(可能是漏洞百出、错误连篇的)笔记。
  • 相关阅读:
    个人的购物项目 第一期
    中小企业信贷风险补偿综合管理系统
    市场部信息管理系统
    mono+jexus 之连接数据库
    mono+jexus 验证码不显示:System.Drawing
    CentOS安装epel
    system 函数
    tcp/ip协议listen函数中backlog参数的含义与php-fpm的502 Bad Gateway
    tengine-2.1.0 + lua + base64
    tengine-2.1.0 + GraphicsMagick-1.3.20
  • 原文地址:https://www.cnblogs.com/sysk/p/4821715.html
Copyright © 2020-2023  润新知