热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

Linux系统裁减之,制作一个极度精简的Linux1.1建立一个用于安装精简Linux的磁盘实验环境:操作系统:CentOS5.1164位????????????此步骤用虚拟机做,
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&#39;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&#39;

mkdir: created directory `sys&#39;

mkdir: created directory `dev&#39;

mkdir: created directory `etc&#39;

mkdir: created directory `etc/rc.d&#39;

mkdir: created directory `lib&#39;

mkdir: created directory `lib64&#39;

mkdir: created directory `bin&#39;

mkdir: created directory `sbin&#39;

mkdir: created directory `boot&#39;

mkdir: created directory `home&#39;

mkdir: created directory `var&#39;

mkdir: created directory `var/log&#39;

mkdir: created directory `usr&#39;

mkdir: created directory `usr/bin&#39;

mkdir: created directory `usr/sbin&#39;

mkdir: created directory `root&#39;

mkdir: created directory `tmp&#39;

把必要的程序拷贝给精简的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&#39;: 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


推荐阅读
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • IT方面的论坛太多了,有综合,有专业,有行业,在各个论坛里混了几年,体会颇深,以前是论坛哪里人多 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • Python操作MySQL(pymysql模块)详解及示例代码
    本文介绍了使用Python操作MySQL数据库的方法,详细讲解了pymysql模块的安装和连接MySQL数据库的步骤,并提供了示例代码。内容涵盖了创建表、插入数据、查询数据等操作,帮助读者快速掌握Python操作MySQL的技巧。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
author-avatar
yuhao
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有