码迷,mamicode.com
首页 > 系统相关 > 详细

Linux系统裁减之,制作一个极度精简的Linux

时间:2017-11-29 18:15:24      阅读:340      评论:0      收藏:0      [点我收藏+]

标签:极简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

标签:极简linux

原文地址:http://blog.51cto.com/linuxprince/2045703

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!