1. 程式人生 > >Linux系統裁減之,制作一個極度精簡的Linux

Linux系統裁減之,制作一個極度精簡的Linux

極簡linux

Linux系統裁減之,制作一個極度精簡的Linux

1.1建立一個用於安裝精簡Linux的磁盤

實驗環境:

操作系統:CentOS 5.11 64

此步驟用虛擬機做,在原有的虛擬機上添加一個磁盤,為新添加的磁盤分2個分區並格式化,分別掛在到/mnt目錄下的boot目錄和sysroot目錄。

/dev/sdb1作為boot分區,/dev/sdb2作為根“/”分區。

查看系統的塊設備掛在信息:

[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

GRUB安裝到/mnt/boot,必須指定安裝的目標設備(此處是

/dev/sdb

[root@CentOS5lsrv01 ~]# grub-install --root-directory=/mnt/ /dev/sdb

1.3 創建臨時根文件系統鏡像文件,但不能直接創建

[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

先拷貝到/root目錄並修改文件名:

[root@CentOS5lsrv01 ~]# cp /boot/initrd-2.6.18-398.el5.img ./initrd-2.6.18-398.el5.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) ?註意解壓後的變化

展開解壓後的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

還有另一個方法可以展開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

創建gurb.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/boot

[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系統,包括程序依賴的庫文件(必須拷貝到相應的目錄),但庫文件可能會有比較多,一個一個拷貝顯然效率太低,做成腳本吧

[root@CentOS5lsrv01 sysroot]# ldd init

ldd: ./init: No such file or directory

[root@CentOS5lsrv01 sysroot]# ldd /sbin/init

linux-vdso.so.1 => (0x00007fff47ffd000)

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)

先手工拷貝/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.6ld-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#

註意:只拷貝命令到新系統是沒有用的,必須同時把命令依賴的庫問件都拷貝到新系統相應的目錄下才行,這點非常重要。如果只復制命令,不復制庫文件的話,切換根目錄時會報錯:

[root@CentOS5lsrv01 ~]# chroot /mnt/sysroot

chroot: cannot run command `/bin/bash': No such file or directory

為新系統建立inittab文件

[root@CentOS5lsrv01 ~]# cd /mmt/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系統裁減之,制作一個極度精簡的Linux