第1章 Linux系統裁減之,製做一個極度精簡的Linux-1
node
1.1創建一個用於安裝精簡Linux的磁盤linux
實驗環境:web
宿主系統:Mac OSX El Capitan 版本 10.11.6api
軟件環境:VMware Fusion Profissional version 8.0.2bash
虛擬機安裝的操做系統:CentOS 5.11 64位網絡
源系統主機名:CentOS5lsrv01app
此步驟用虛擬機源系統(CentOS5lsrv01)作,在原有的虛擬機上添加一個磁盤(Virtual Disk 2.vmdk,Mac 版的VMware不能修改虛擬磁盤文件名,這個有點那個……),爲新添加的磁盤分2個分區並格式化,分別掛在到/mnt目錄下的boot目錄和sysroot目錄。
dom
/dev/sdb1做爲新系統的boot分區,/dev/sdb2做爲新系統的根「/」分區。ide
[root@CentOS5lsrv01 ~]# mkfs.ext3 /dev/sdb1測試
[root@CentOS5lsrv01 ~]# mkfs.ext3 /dev/sdb2
[root@CentOS5lsrv01 ~]# mount /dev/sdb1 /mnt/boot
[root@CentOS5lsrv01 ~]# mount /dev/sdb2 /mnt/sysroot
查看系統的設備掛載信息:
[root@CentOS5lsrv01 ~]# mount
/dev/sda3 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/sdb1 on /mnt/boot type ext3 (rw)
/dev/sdb2 on /mnt/sysroot type ext3 (rw)
1.2 爲新系統安裝GRUB(此步在源主機CentOS5lsrv01上操做)
把GRUB安裝到/mnt/boot,必須指定安裝的目標設備(此處是/dev/sdb)
[root@CentOS5lsrv01 ~]# grub-install --root-directory=/mnt/ /dev/sdb
1.3 爲新的系統製做臨時根文件系統鏡像文件initrd-2.6.18-398.el5.img
源系統的initrd是不能直接被新系統使用的,必須修改initrd中的init腳本才能使用,展開臨時根文件系統鏡像文件initrd-2.6.18-398.el5.img
方法1:
[root@CentOS5lsrv01 ~]# mkinitrd /mnt/boot/initrd-`uname -r`.img `uname -r`
查看一下initrd-2.6.18-398.el5.img文件的類型
[root@CentOS5lsrv01 ~]# file /boot/initrd-2.6.18-398.el5.img
/boot/initrd-2.6.18-398.el5.img: gzip compressed data, from Unix, last modified: Wed Nov 29 09:54:28 2017, max compression
方法2:
先拷貝到/root目錄並修改文件名:
[root@CentOS5lsrv01 ~]# cp /boot/initrd-2.6.18-398.el5.img ./initrd-2.6.18-398.el5.img.gz
[root@CentOS5lsrv01 ~]# gzip -d initrd-2.6.18-398.el5.img.gz
[root@CentOS5lsrv01 ~]# file initrd-2.6.18-398.el5.img
initrd-2.6.18-398.el5.img: ASCII cpio archive (SVR4 with no CRC) ß注意解壓後的變化
提示:使用mkinit命令創和直接用系統的initrd鏡像文件都可
1)展開解壓後的initrd-2.6.18-398.el5.img文件到一個臨時目錄/root/temp
[root@CentOS5lsrv01 temp]# mkdir temp
[root@CentOS5lsrv01 ~]# cd temp
[root@CentOS5lsrv01 temp]# cpio -id < ../initrd-2.6.18-398.el5.img
[root@CentOS5lsrv01 temp]# ls
bin dev etc init lib proc sbin sys sysroot
2)使用zcat命令和cpio命令展開initrd-2.6.18-398.el5.img,不用先解壓(比較簡單,推薦用此方法)
[root@CentOS5lsrv01 ~]# mkdir iso
[root@CentOS5lsrv01 ~]# cd iso
[root@CentOS5lsrv01 iso]# zcat /boot/initrd-2.6.18-398.el5.img | cpio -id
14318 blocks
[root@CentOS5lsrv01 iso]# ls
bin dev etc init lib proc sbin sys sysroot
查看一下init的類型:
[root@CentOS5lsrv01 iso]# file init
init: a /bin/nash script text executable ß這裏的init是一個nash腳本
看一看init作了那些操做:
[root@CentOS5lsrv01 iso]# cat -n init
1 #!/bin/nash
2
3 mount -t proc /proc /proc
4 setquiet
5 echo Mounting proc filesystem
6 echo Mounting sysfs filesystem
7 mount -t sysfs /sys /sys
8 echo Creating /dev
9 mount -o mode=0755 -t tmpfs /dev /dev
10 mkdir /dev/pts
11 mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts
12 mkdir /dev/shm
13 mkdir /dev/mapper
14 echo Creating initial device nodes
15 mknod /dev/null c 1 3
16 mknod /dev/zero c 1 5
17 mknod /dev/urandom c 1 9
18 mknod /dev/systty c 4 0
19 mknod /dev/tty c 5 0
20 mknod /dev/console c 5 1
21 mknod /dev/ptmx c 5 2
22 mknod /dev/rtc c 10 135
23 mknod /dev/tty0 c 4 0
24 mknod /dev/tty1 c 4 1
25 mknod /dev/tty2 c 4 2
26 mknod /dev/tty3 c 4 3
27 mknod /dev/tty4 c 4 4
28 mknod /dev/tty5 c 4 5
29 mknod /dev/tty6 c 4 6
30 mknod /dev/tty7 c 4 7
31 mknod /dev/tty8 c 4 8
32 mknod /dev/tty9 c 4 9
33 mknod /dev/tty10 c 4 10
34 mknod /dev/tty11 c 4 11
35 mknod /dev/tty12 c 4 12
36 mknod /dev/ttyS0 c 4 64
37 mknod /dev/ttyS1 c 4 65
38 mknod /dev/ttyS2 c 4 66
39 mknod /dev/ttyS3 c 4 67
40 echo Setting up hotplug.
41 hotplug
42 echo Creating block device nodes.
43 mkblkdevs
44 echo "Loading ehci-hcd.ko module"
45 insmod /lib/ehci-hcd.ko
46 echo "Loading ohci-hcd.ko module"
47 insmod /lib/ohci-hcd.ko
48 echo "Loading uhci-hcd.ko module"
49 insmod /lib/uhci-hcd.ko
50 mount -t usbfs /proc/bus/usb /proc/bus/usb
51 echo "Loading jbd.ko module"
52 insmod /lib/jbd.ko
53 echo "Loading ext3.ko module"
54 insmod /lib/ext3.ko
55 echo "Loading scsi_mod.ko module"
56 insmod /lib/scsi_mod.ko
57 echo "Loading sd_mod.ko module"
58 insmod /lib/sd_mod.ko
59 echo "Loading scsi_transport_spi.ko module"
60 insmod /lib/scsi_transport_spi.ko
61 echo "Loading mptbase.ko module"
62 insmod /lib/mptbase.ko
63 echo "Loading mptscsih.ko module"
64 insmod /lib/mptscsih.ko
65 echo "Loading mptspi.ko module"
66 insmod /lib/mptspi.ko
67 echo "Loading libata.ko module"
68 insmod /lib/libata.ko
69 echo "Loading ata_piix.ko module"
70 insmod /lib/ata_piix.ko
71 echo "Loading ahci.ko module"
72 insmod /lib/ahci.ko
73 echo "Loading dm-mem-cache.ko module"
74 insmod /lib/dm-mem-cache.ko
75 echo "Loading dm-mod.ko module"
76 insmod /lib/dm-mod.ko
77 echo "Loading dm-log.ko module"
78 insmod /lib/dm-log.ko
79 echo "Loading dm-region_hash.ko module"
80 insmod /lib/dm-region_hash.ko
81 echo "Loading dm-message.ko module"
82 insmod /lib/dm-message.ko
83 echo "Loading dm-raid45.ko module"
84 insmod /lib/dm-raid45.ko
85 echo Waiting for driver initialization.
86 stabilized --hash --interval 1000 /proc/scsi/scsi
87 mkblkdevs
88 echo Scanning and configuring dmraid supported devices
89 #resume LABEL=SWAP-sda2 ß新的精簡系統沒有swap分區,所以註釋掉這行
90 echo Creating root device.
91 mkrootdev -t ext3 -o defaults,ro /dev/sda3 ß須要修改這行,在新的精簡系統中根「/」設備是/dev/sda2,因此把sda3修改成sda2
92 echo Mounting root filesystem.
93 mount /sysroot
94 echo Setting up other filesystems.
95 setuproot
96 echo Switching to new root and running init.
97 switchroot
init腳本進行了一系列建立設備、加載內核模塊、建立根設備並以只讀方式掛載等的操做,修改後使用cpio從新打包
[root@CentOS5lsrv01 iso]# find . | cpio -H newc --quiet -o | gzip -9 > /mnt/boot/initrd.gz
有了initrd還須要kernel,先使用系統的kernel,這樣比較簡單,後期的博文再談談如何裁減kernel吧:
[root@CentOS5lsrv01 ~]# cp /boot/vmlinuz-2.6.18-398.el5 /mnt/sysroot/boot/vmlinuz
爲新的精簡系統建立grub.conf文件:
[root@CentOS5lsrv01 ~]# cd /mnt/boot
[root@CentOS5lsrv01 boot]# vi grub/grub.conf
default=0
timeout=5
title mini Linux(xiaoruan's Linux)
root(hd0,0)
kernel /vmlinuz
initrd /initrd.gz
爲新的精簡系統建立必要的目錄
[root@CentOS5lsrv01 ~]# cd /mnt/sysroot
[root@CentOS5lsrv01 sysroot]# mkdir -pv proc sys dev etc/rc.d lib lib64 bin sbin boot home var/log usr/{bin,sbin} root tmp
mkdir: created directory `proc'
mkdir: created directory `sys'
mkdir: created directory `dev'
mkdir: created directory `etc'
mkdir: created directory `etc/rc.d'
mkdir: created directory `lib'
mkdir: created directory `lib64'
mkdir: created directory `bin'
mkdir: created directory `sbin'
mkdir: created directory `boot'
mkdir: created directory `home'
mkdir: created directory `var'
mkdir: created directory `var/log'
mkdir: created directory `usr'
mkdir: created directory `usr/bin'
mkdir: created directory `usr/sbin'
mkdir: created directory `root'
mkdir: created directory `tmp'
把必要的程序拷貝給精簡的Linux系統,包括程序依賴的庫文件(必須拷貝到相應的目錄),但庫文件可能會有比較多,一個一個拷貝顯然效率過低,作成腳本吧。先手工拷貝/sbin/init和/bin/bash到精簡的Linux系統下
[root@CentOS5lsrv01 mnt]# cp /sbin/init /mnt/sysroot/sbin/
[root@CentOS5lsrv01 mnt]# ldd /sbin/init
linux-vdso.so.1 => (0x00007fffc55fd000)
libsepol.so.1 => /lib64/libsepol.so.1 (0x0000003979000000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003978c00000)
libc.so.6 => /lib64/libc.so.6 (0x0000003977400000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003977800000)
/lib64/ld-linux-x86-64.so.2 (0x0000003977000000)
[root@CentOS5lsrv01 mnt]# cp /lib64/libsepol.so.1 /mnt/sysroot/lib64/
[root@CentOS5lsrv01 mnt]# cp /lib64/libselinux.so.1 /mnt/sysroot/lib64/
[root@CentOS5lsrv01 mnt]# cp /lib64/libc.so.6 /mnt/sysroot/lib64/
提示:libc.so.6和ld-linux-x86-64.so.2一樣也是/bin/bash須要的庫文件,在下面拷貝
[root@CentOS5lsrv01 ~]# ldd /bin/bash
linux-vdso.so.1 => (0x00007fff74bfd000)
libtermcap.so.2 => /lib64/libtermcap.so.2 (0x0000003977c00000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003977800000)
libc.so.6 => /lib64/libc.so.6 (0x0000003977400000)
/lib64/ld-linux-x86-64.so.2 (0x0000003977000000)
[root@CentOS5lsrv01 ~]# cp /bin/bash /mnt/sysroot/bin/
[root@CentOS5lsrv01 ~]# cp /lib64/libtermcap.so.2 /mnt/sysroot/lib64/
[root@CentOS5lsrv01 ~]# cp /lib64/libdl.so.2 /mnt/sysroot/lib64/
[root@CentOS5lsrv01 ~]# cp /lib64/libc.so.6 /mnt/sysroot/lib64/
[root@CentOS5lsrv01 ~]# cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64/
[root@CentOS5lsrv01 ~]# ll !$
ll /mnt/sysroot/lib64/
total 1878
-rwxr-xr-x 1 root root 144776 Nov 29 13:37 ld-linux-x86-64.so.2
-rwxr-xr-x 1 root root 1726296 Nov 29 13:37 libc.so.6
-rwxr-xr-x 1 root root 23360 Nov 29 13:37 libdl.so.2
-rwxr-xr-x 1 root root 15584 Nov 29 13:36 libtermcap.so.2
[root@CentOS5lsrv01 ~]# chroot /mnt/sysroot ß切換根目錄
bash-3.2# ls ß找不到ls命令,由於根本沒有把ls命令複製到新系統下嘛^_^
bash: ls: command not found
bash-3.2#
注意:只拷貝bash命令到新系統是沒有用的,必須同時把bash命令依賴的庫文件都拷貝到新系統相應的目錄下才行,這點很是重要。若是隻複製命令,不復制庫文件的話,切換根目錄時會報錯:
[root@CentOS5lsrv01 ~]# chroot /mnt/sysroot
chroot: cannot run command `/bin/bash': No such file or directory
有了bash和bash依賴的庫文件,切換根目錄就不會報錯了!
爲新系統創建inittab文件:
[root@CentOS5lsrv01 ~]# cd /mnt/sysroot
[root@CentOS5lsrv01 sysroot]# vi etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
建立新系統的系統初始化腳本:注意此時所在目錄/mnt/sysroot
[root@CentOS5lsrv01 sysroot]# vi etc/rc.d/rc.sysinit
#!/bin/bash
#
echo -e "\tWelcome to \033[31mMy team \033[0m Linux."
/bin/bash ß一上來直接打開bash,什麼用戶登陸的都沒有,夠簡單粗暴吧!!@_@
記得給個執行權限
[root@CentOS5lsrv01 sysroot]# chmod +x etc/rc.d/rc.sysinit
[root@CentOS5lsrv01 sysroot]# sync <--將修改當即同步到磁盤,多同步幾回吧
[root@CentOS5lsrv01 sysroot]# sync
[root@CentOS5lsrv01 sysroot]# sync
而後中止原來的系統,啓動新系統測試,以下圖:
小結:這篇博文寫得應該算簡單吧,後期我會陸續更新關於如何裁減Linux系統的博文,歡迎各位同行繼續關注哦!!^_^
歡迎繼續關注個人後續博文:
第2篇:Linux系統裁減之,製做一個極度精簡的Linux-2-用腳本實現自動拷貝命令和依賴庫文件http://www.javashuo.com/article/p-kzglxkeb-bk.html
第3篇:Linux系統裁減之,製做一個極度精簡的Linux-3-爲精簡的系統增長網絡功能和關機重啓功能
http://www.javashuo.com/article/p-ofizkruk-bk.html
第4篇:Linux系統裁減之,製做一個極度精簡的Linux-4-使用mingetty繞開/bin/login http://www.javashuo.com/article/p-uchibdlc-m.html
第5篇:Linux系統裁減之,製做一個極度精簡的Linux-5-從新編譯login去除對pam模塊的依賴 https://blog.51cto.com/linuxprince/2054153