實戰自制Linux操作系統
自制linux系統
步驟概述:
1、新建一個硬盤
2、在該新硬盤上新建兩個分區,一個當boot分區,一個當/分區
3、格式化并且掛載兩個分區
4、安裝grub至目標磁盤
5、為grub提供配置文件
6、復制內核文件和initrd文件
7、創建目標主機根文件系統
8、移植bash命令和其庫文件到根文件系統
9、裝載模塊,實現網絡功能
10、啟動測試
具體操作步驟如下:
1)為CentOS 6系統添加一塊新的硬盤,然后啟動,演示如下:
2)查看新添加的硬盤,并為添加好的磁盤分區,創建文件系統;
[root@CentOS6 ~]# fdisk -l /dev/sd[a-z] Disk /dev/sda: 85.9 GB, 85899345920 bytes 255 heads, 63 sectors/track, 10443 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x0007eba7 Device Boot Start End Blocks Id System /dev/sda1 * 1 26 204800 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 26 7859 62914560 8e Linux LVM /dev/sda3 7860 9165 10490445 83 Linux /dev/sda4 9166 10443 10265535 5 Extended /dev/sda5 9166 9819 5253223+ 83 Linux Disk /dev/sdb: 21.5 GB, 21474836480 bytes #可以看到新添加的硬盤 sdb 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000
分三個主分區,分別作為為根分區,swap分區和boot分區,并創建對應的文件系統,操作如下:
[root@CentOS6 ~]# fdisk /dev/sdb #創建分區, #創建文件系統如下命令: [root@CentOS6 ~]# mkfs.ext4 /dev/sdb1 [root@CentOS6 ~]# mkswap /dev/sdb2 [root@CentOS6 ~]# mkfs.ext4 /dev/sdb3 #查看創建好的分區 [root@CentOS6 ~]# blkid /dev/sdb1: UUID="f4921d76-f089-4cb6-8f47-aff34711cb7a" TYPE="ext4" /dev/sdb2: UUID="3eaa649e-a5c0-4f9c-8887-453368419238" TYPE="swap" /dev/sdb3: UUID="286c857d-8f52-465f-9ed6-8eeaa3363743" TYPE="ext4"
3)創建一個boot目錄,并把boot分區(sdb1)掛載上;
[root@CentOS6 ~]# mkdir /mnt/boot [root@CentOS6 ~]# mount /dev/sdb1 /mnt/boot [root@CentOS6 ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/vg0-root 20511356 1112808 18349972 6% / tmpfs 502068 0 502068 0% /dev/shm /dev/sda1 194241 34199 149802 19% /boot /dev/mapper/vg0-usr 10190136 2473060 7192788 26% /usr /dev/mapper/vg0-var 20511356 489148 18973632 3% /var /dev/sda5 5039592 10352 4766580 1% /home /dev/sdb1 104769 1550 97598 2% /mnt/boot # 掛載的設備sdb1
4)創建grub,并查看;
[root@CentOS6 ~]# ls /mnt/boot/ lost+found [root@CentOS6 ~]# grub-install --root-directory=/mnt /dev/sdb #創建grub Probing devices to guess BIOS drives. This may take a long time. Installation finished. No error reported. This is the contents of the device map /mnt/boot/grub/device.map. Check if this is correct or not. If any of the lines is incorrect, fix it and re-run the script `grub-install'. (fd0) /dev/fd0 (hd0) /dev/sda (hd1) /dev/sdb [root@CentOS6 ~]# ls /mnt/boot/ grub lost+found [root@CentOS6 ~]# ls /mnt/boot/grub/ device.map fat_stage1_5 iso9660_stage1_5 minix_stage1_5 stage1 ufs2_stage1_5 xfs_stage1_5 e2fs_stage1_5 ffs_stage1_5 jfs_stage1_5 reiserfs_stage1_5 stage2 vstafs_stage1_5
5)要想成為一個真正的系統,還需要內核文件,initrd以及grub/grub.conf這些文件;
[root@CentOS6 ~]# cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/vmlinuz [root@CentOS6 ~]# cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot/initramfs.img [root@CentOS6 ~]# vim /mnt/boot/grub/grub.conf #手動編寫配置文件 default=0 timeout=5 title CentOS (Express) root (hd0,0) # 在當前下為第二塊磁盤應為(hd1,0),但是如果自其它設備上使用為(hd0,0) kernel /vmlinuz ro root=/dev/sda3 #加載的根目錄所在的分區,因為在其他設備上為第一塊磁盤所以為 /dev/sda3 initrd /initramfs.img #內核匹配的ramfs文件
6)要把/dev/sda3當做根文件系統,就需要掛載,并創建根文件系統下想對應的子目錄:
[root@CentOS6 ~]# mkdir /mnt/sysroot [root@CentOS6 ~]# mount /dev/sdb3 /mnt/sysroot/ [root@CentOS6 ~]# cd /mnt/sysroot/ [root@CentOS6 sysroot]# ls lost+found [root@CentOS6 sysroot]# mkdir -pv etc bin sbin lib lib64 dev proc sys mnt var usr home root tmp media mkdir: created directory `etc' mkdir: created directory `bin' mkdir: created directory `sbin' mkdir: created directory `lib' mkdir: created directory `lib64' mkdir: created directory `dev' mkdir: created directory `proc' mkdir: created directory `sys' mkdir: created directory `mnt' mkdir: created directory `var' mkdir: created directory `usr' mkdir: created directory `home' mkdir: created directory `root' mkdir: created directory `tmp' mkdir: created directory `media' [root@CentOS6 sysroot]# ls bin dev etc home lib lib64 lost+found media mnt proc root sbin sys tmp usr var
7)根文件系統的目錄有了,但是要想運行還需要程序,還需要bash,以及基于動態編譯的共享庫文件
[root@CentOS6 sysroot]# cp /bin/bash /mnt/sysroot/bin #復制bash [root@CentOS6 sysroot]# ldd /bin/bash # 查看庫文件 linux-vdso.so.1 => (0x00007ffd127d9000) libtinfo.so.5 => /lib64/libtinfo.so.5 (0x0000003278e00000) libdl.so.2 => /lib64/libdl.so.2 (0x000000326f200000) libc.so.6 => /lib64/libc.so.6 (0x000000326f600000) /lib64/ld-linux-x86-64.so.2 (0x000000326ee00000) # 復制共享庫中的文件到創建的根目錄中的lib64下 [root@CentOS6 sysroot]# cp /lib64/libtinfo.so.5 /mnt/sysroot/lib64 [root@CentOS6 sysroot]# cp /lib64/libdl.so.2 /mnt/sysroot/lib64 [root@CentOS6 sysroot]# cp /lib64/libc.so.6 /mnt/sysroot/lib64 [root@CentOS6 sysroot]# cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64
8)如上,基本的操作已經完成,使用 chroot 切換根,進行測試,如下:
[root@CentOS6 sysroot]# chroot /mnt/sysroot/ # 切換根 bash-4.1# bash-4.1# bash-4.1# ls # 因為沒有復制命令,所以只能使用內建命令,如果需要使用外部命令,就把命令以及以依賴的庫復制過去就可以了。 bash: ls: command not found bash-4.1# pwd / bash-4.1# exit exit
9)最后,我們在編輯一下配置文件/mnt/boot/grub/grub.conf
[root@CentOS6 ~]# vim /mnt/boot/grub/grub.conf default=0 timeout=5 title CentOS (Express) root (hd0,0) kernel /vmlinuz ro root=/dev/sda3 init=/bin/bash # 表示要求限定運行的的是/bin/bash 而不是 /sbin/init 這樣就直接把bash當做用戶空間的第一個進程來使用了 initrd /initramfs.img
10)最后同步一下
[root@CentOS6 ~]# sync
11)我們新建一個虛擬機,把硬盤改為新創建好的磁盤,測試系統能否啟動?
啟動此虛擬機,如下圖:按e鍵可以看到我們創建的系統文件,選定內核,按b鍵啟動
選定內核,按b鍵啟動,發現系統報錯,什么原因呢?可能是沒有添加selinux策略
選定內核,按e鍵,進入編輯模式,添加selinux=0 ,重新啟動,發現可以正常啟動
到此,一個迷你版的Linux誕生了,可以裝在自己移動U盤等設備上面,這里不做過多解釋
原創文章,作者:zhumengxiaotao,如若轉載,請注明出處:http://www.www58058.com/47762