构建自己的小linux
在构建linux之前我们先了解linux系统启动的过程,分以下四个阶段:
第一阶段:BIOS启动引导
在该过程中实现硬件的初始化以及查找可启动的介质,从MBR中装载引导管理器(GRUB)并运行该启动管理器
第二阶段:GRUB启动引导
装载stage1,装载stage1_5,装载stage2,读取/boot/grub/grub.conf,装载所选的kernel和initrd到内存
第三阶段:内核
运行内核启动参数、解压initrd文件并挂载initrd文件系统,装载核心驱动、挂载根文件系统
第四阶段:SysV init初始化
启动/sbin/init、读取/etc/inittab文件、运行/etc/rc.d/rc.sysinit脚本、运行在/etc/rc.d/rcN.d中定义的不同runlevel的服务初始化脚本、打开字符终端1-6控制台,打开图形显示管理的7号控制台
从以上Linux系统的启动过程可知,构建基本的Linux需要:1)基本的物理硬件 2)安装启动引导程序 3)Kernel和initrd 4)/sbin/init程序,有了这些我们就可以构建最基本的Linux了,构建过程如下:
1、在宿主机上面创建两个主分区并创建ext3的文件系统
- # echo '
- >n
- >p
- >1
- >
- >+100M
- >w' | fdisk /dev/sdb &> /dev/null
- # echo '
- >n
- >p
- >2
- >
- >+512M
- >w' | fdisk /dev/sdb &> /dev/null
PS:sdb是宿主机上面的第二块硬盘,注意别写错,否则后果不堪设想
用fdisk -l 查看创建分区是否成功,成功之后为上面两个分区创建ext3文件系统
- # mkfs -t ext3 /dev/sdb1
- # mkfs -t ext3 /dev/sdb2
检验是否成功创建ext3文件系统
- # blkid /dev/sdb{1,2}
挂载/dev/sdb{1,2}分别到/mnt/boot和/mnt/sysroot
- # mkdir /mnt/{boot,sysroot}
- # mount /dev/sdb1 /mnt/boot
- # mount /dev/sdb2 /mnt/sysroot
告诉Kernel重新加载磁盘
- # partprobe /dev/sdb
2、安装启动引导程序GRUB(有两种方法)
- 1)grub-install --root-directory /mnt /dev/sdb
- 2)# mkdir /mnt/boot/grub
- # cp /usr/share/grub/i386-redhat/* /mnt/boot/grub
- # grub
- >root (hd1,0)
- >setup (hd1)
- >quit
3、复制内核并提供initrd
- # cp /boot/vmlinuz-$(uname -r) /mnt/boot/vmlinuz
- # mkdir /tmp/initrd
- # cp /boot/initrd-$(uname -r).img /tmp/initrd
- # cd /tmp/initrd
- # file initrd-$(uname -r).img
- # mv initrd-$(uname -r).img ./initrd
- # gzip -d initrd
- # cpio -id < initrd
- # sed -i "s@/dev/vol0/root@/dev/sda2@g" init
- # rm -rf initrd
- # find . | cpio -o -H newc --quiet | gzip -9 > /mnt/boot/initrd.gz
4、提供grub.conf文件
- # vim /mnt/boot/grub/grub.conf
- default=0
- timeout=10
- title My Min Linux
- root (hd0,0)
- kernel /vmlinuz ro root=/dev/sda2 rhgb quiet
- initrd /initrd
5、提供根文件系统
- # cd /mnt/sysroot
- # mkdir -pv ./{bin,sbin,etc,dev,sys,proc,var,home,tmp,lib,mnt,media,misc,opt}
- # cp /sbin/init sbin/
- # cp /bin/{bash,ls,hostname} bin/
init,bash,ls,hostname运行需要用到库文件,用#ldd {/sbin/init,/bin/{bash,ls,hostname}}查看并复制到对应的目录下
- #ldd {/sbin/init,/bin/bash}
- /sbin/init:
- linux-gate.so.1 => (0x0055a000)
- libsepol.so.1 => /lib/libsepol.so.1 (0x00573000)
- libselinux.so.1 => /lib/libselinux.so.1 (0x00110000)
- libc.so.6 => /lib/libc.so.6 (0x00825000)
- libdl.so.2 => /lib/libdl.so.2 (0x0096d000)
- /lib/ld-linux.so.2 (0x00802000)
- /bin/bash:
- linux-gate.so.1 => (0x0067e000)
- libtermcap.so.2 => /lib/libtermcap.so.2 (0x0099c000)
- libdl.so.2 => /lib/libdl.so.2 (0x0096d000)
- libc.so.6 => /lib/libc.so.6 (0x00825000)
- /lib/ld-linux.so.2 (0x00802000)
- /bin/ls:
- linux-gate.so.1 => (0x003cf000)
- librt.so.1 => /lib/librt.so.1 (0x009b5000)
- libacl.so.1 => /lib/libacl.so.1 (0x009c0000)
- libselinux.so.1 => /lib/libselinux.so.1 (0x00559000)
- libc.so.6 => /lib/libc.so.6 (0x00825000)
- libpthread.so.0 => /lib/libpthread.so.0 (0x0099c000)
- /lib/ld-linux.so.2 (0x00802000)
- libattr.so.1 => /lib/libattr.so.1 (0x0060e000)
- libdl.so.2 => /lib/libdl.so.2 (0x0096d000)
- libsepol.so.1 => /lib/libsepol.so.1 (0x00573000)
- /bin/hostname:
- linux-gate.so.1 => (0x00c83000)
- libselinux.so.1 => /lib/libselinux.so.1 (0x00559000)
- libc.so.6 => /lib/libc.so.6 (0x00825000)
- libdl.so.2 => /lib/libdl.so.2 (0x0096d000)
- libsepol.so.1 => /lib/libsepol.so.1 (0x00573000)
- /lib/ld-linux.so.2 (0x00802000)
- # cp /lib/{libsepol.so.1,libselinux.so.1,libc.so.6,libdl.so.2,ld-linux.so.2,libtermcap.so.2} lib/
- # cp /lib/{librt.so.1,libacl.so.1,libpthread.so.0,libattr.so.1} lib/
6、提供配置文件:
- # vim etc/inittab
- id:3:initdefault:
- si::sysinit:/etc/rc.d/rc.sysinit
- # vim etc/rc.d/rc.sysinit
- #!/bin/bash
- echo -e "\t Welcom to My Min Linux"
- /bin/bash
- # chmod +x etc/rc.d/rc.sysinit
到此自己的Min Linux 构造完成,该Linux只支持ls,hostname外部命令
转载于:https://blog.51cto.com/urchin/788394