Linux系統裁減之,製作一個極度精簡的Linux-1

第1章 Linux系統裁減之,製作一個極度精簡的Linux-1

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

實驗環境:

宿主系統:Mac OSX El Capitan 版本 10.11.6

軟件環境:VMware Fusion Profissional version 8.0.2

虛擬機安裝的操作系統:CentOS 5.11 64

源系統主機名:CentOS5lsrv01


        此步驟用虛擬機源系統(CentOS5lsrv01)做,在原有的虛擬機上添加一個磁盤(Virtual Disk 2.vmdk,Mac 版的VMware不能修改虛擬磁盤文件名,這個有點那個……),爲新添加的磁盤分2個分區並格式化,分別掛在到/mnt目錄下的boot目錄和sysroot目錄。

/dev/sdb1作爲新系統的boot分區,/dev/sdb2作爲新系統的根“/”分區。

[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


爲新的精簡系統創建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/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.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#

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

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

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

有了bash和bash依賴的庫文件,切換根目錄就不會報錯了!

 

爲新系統建立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系統裁減-1_有水印.jpg

小結:這篇博文寫得應該算簡單吧,後期我會陸續更新關於如何裁減Linux系統的博文,歡迎各位同行繼續關注哦!!^_^

歡迎繼續關注我的後續博文:

第2篇:Linux系統裁減之,製作一個極度精簡的Linux-2-用腳本實現自動拷貝命令和依賴庫文件http://blog.51cto.com/linuxprince/2046142

第3篇:Linux系統裁減之,製作一個極度精簡的Linux-3-爲精簡的系統增加網絡功能和關機重啓功能

http://blog.51cto.com/linuxprince/2047373


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章