很多时候我们直接使用别人帮我们打包好的一个linux系统,总感觉某些工具或者命令多余或者效果不好,那我们是否可以自制一个比较符合自己需求的linux系统出来了,答案是肯定的,而且实现这个目标也并困难,需要的时间也不会太长。接下来就给大家分享如何自制的过程。


环境需求:

    1、Vmware虚拟机

    2、Centos6.8光盘镜像IS0文件

    3、Vmware上安装一份Centos6.8的操作系统


第一步:装载一块新硬盘到虚拟机的Centos6.8系统上,并保证系统正常读取

  [[email protected] ~]# lsblk

  NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT

  sda      8:0    0   20G  0 disk 

  ├─sda1   8:1    0  200M  0 part /boot

  ├─sda2   8:2    0    5G  0 part /

  └─sda3   8:3    0    5G  0 part /test

  sr0     11:0    1  3.7G  0 rom  

  [[email protected] ~]# echo "- - -" > /sys/class/scsi_host/host0/scan 

  [[email protected] ~]# lsblk

  NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT

  sda      8:0    0   20G  0 disk 

  ├─sda1   8:1    0  200M  0 part /boot

  ├─sda2   8:2    0    5G  0 part /

  └─sda3   8:3    0    5G  0 part /test

  sr0     11:0    1  3.7G  0 rom  

  sdb      8:16   0   20G  0 disk 

  [[email protected] ~]# 


第二步:分区格式化并挂载,boot分区200M,根分区2G,统一格式化成ext4文件系统,boot分区卷标:boot,根分区卷标:root,boot分区挂载到/mnt/boot,根分区挂载到/mnt/root

  [[email protected] ~]# fdisk /dev/sdb

  Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel

  Building a new DOS disklabel with disk identifier 0x7a85194e.

  Changes will remain in memory only, until you decide to write them.

  After that, of course, the previous content won't be recoverable.


  Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)


  WARNING: DOS-compatible mode is deprecated. It's strongly recommended to

           switch off the mode (command 'c') and change display units to

           sectors (command 'u').


  Command (m for help): n

  Command action

     e   extended

     p   primary partition (1-4)

  p

  Partition number (1-4): 1

  First cylinder (1-2610, default 1): 

  Using default value 1

  Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +200M


  Command (m for help): n

  Command action

     e   extended

     p   primary partition (1-4)

  p

  Partition number (1-4): 2

  First cylinder (27-2610, default 27): 

  Using default value 27

  Last cylinder, +cylinders or +size{K,M,G} (27-2610, default 2610): +2G


  Command (m for help): w

  The partition table has been altered!


  Calling ioctl() to re-read partition table.

  Syncing disks.

  [[email protected] ~]# lsblk

  NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT

  sda      8:0    0    20G  0 disk 

  ├─sda1   8:1    0   200M  0 part /boot

  ├─sda2   8:2    0     5G  0 part /

  └─sda3   8:3    0     5G  0 part /test

  sr0     11:0    1   3.7G  0 rom  

  sdb      8:16   0    20G  0 disk 

  ├─sdb1   8:17   0 203.9M  0 part 

  └─sdb2   8:18   0     2G  0 part 

  [[email protected] ~]# mkfs.ext4 -L boot /dev/sdb1

  mke2fs 1.41.12 (17-May-2010)

  Filesystem label=boot

  OS type: Linux

  Block size=1024 (log=0)

  Fragment size=1024 (log=0)

  Stride=0 blocks, Stripe width=0 blocks

  52208 inodes, 208812 blocks

  10440 blocks (5.00%) reserved for the super user

  First data block=1

  Maximum filesystem blocks=67371008

  26 block groups

  8192 blocks per group, 8192 fragments per group

  2008 inodes per group

  Superblock backups stored on blocks: 

  8193, 24577, 40961, 57345, 73729, 204801


  Writing inode tables: done                            

  Creating journal (4096 blocks): done

  Writing superblocks and filesystem accounting information: done


  This filesystem will be automatically checked every 36 mounts or

  180 days, whichever comes first.  Use tune2fs -c or -i to override.

  [[email protected] ~]# mkfs.ext4 -L root /dev/sdb2

  mke2fs 1.41.12 (17-May-2010)

  Filesystem label=root

  OS type: Linux

  Block size=4096 (log=2)

  Fragment size=4096 (log=2)

  Stride=0 blocks, Stripe width=0 blocks

  131648 inodes, 526128 blocks

  26306 blocks (5.00%) reserved for the super user

  First data block=0

  Maximum filesystem blocks=541065216

  17 block groups

  32768 blocks per group, 32768 fragments per group

  7744 inodes per group

  Superblock backups stored on blocks: 

  32768, 98304, 163840, 229376, 294912


  Writing inode tables: done                            

  Creating journal (16384 blocks): done

  Writing superblocks and filesystem accounting information: done


  This filesystem will be automatically checked every 27 mounts or

  180 days, whichever comes first.  Use tune2fs -c or -i to override.

  [[email protected] ~]# mkdir /mnt/boot

  [[email protected] ~]# mkdir /mnt/root

  [[email protected] ~]# mount /dev/sdb1 /mnt/boot

  [[email protected] ~]# mount /dev/sdb2 /mnt/root

  [[email protected] ~]# 


第三步:创建boot分区的所有文件

复制当前操作系统的内核文件和文件系统驱动加载文件到自制linux系统的boot分区下

  [[email protected] ~]# cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot

  [[email protected] ~]# ll /mnt/boot

  total 29167

  -rw-------. 1 root root 25587665 Sep 11 12:54 initramfs-2.6.32-642.el6.x86_64.img

  drwx------. 2 root root    12288 Sep 11 12:40 lost+found

  -rwxr-xr-x. 1 root root  4264528 Sep 11 12:54 vmlinuz-2.6.32-642.el6.x86_64

  [[email protected] ~]# 


安装grub到自制linux系统的boot分区下

  [[email protected] ~]# grub-install --root-directory=/mnt /dev/sdb

  Probing devices to guess BIOS drives. This may take a long time.

  Installation finished. No error reported.

  This is the contents of the device map /mnt/boot/grub/device.map.

  Check if this is correct or not. If any of the lines is incorrect,

  fix it and re-run the script `grub-install'.


  (fd0) /dev/fd0

  (hd0) /dev/sda

  (hd1) /dev/sdb

  [[email protected] ~]# tree /mnt/boot

  /mnt/boot

  ├── grub

  │   ├── device.map

  │   ├── e2fs_stage1_5

  │   ├── fat_stage1_5

  │   ├── ffs_stage1_5

  │   ├── iso9660_stage1_5

  │   ├── jfs_stage1_5

  │   ├── minix_stage1_5

  │   ├── reiserfs_stage1_5

  │   ├── stage1

  │   ├── stage2

  │   ├── ufs2_stage1_5

  │   ├── vstafs_stage1_5

  │   └── xfs_stage1_5

  ├── initramfs-2.6.32-642.el6.x86_64.img

  ├── lost+found

  └── vmlinuz-2.6.32-642.el6.x86_64


  2 directories, 15 files

  [[email protected] ~]# 


手工创建grub.conf文件

  [[email protected] ~]# clear

  [[email protected] ~]# vim /mnt/boot/grub/grub.conf

  [[email protected] ~]# cat /mnt/boot/grub/grub.conf

      default=0

      timeout=3

  title Centos6.8--lovefirewall

      root (hd0,0)

      kernel /vmlinuz-2.6.32-642.el6.x86_64 root=UUID=062befd6-d27d-4e45-8675-e9b5771ac934 selinux=0 init=/bin/bash

      initrd /initramfs-2.6.32-642.el6.x86_64.img

  [[email protected] ~]# 


第四步:创建根分区的一级目录,创建fstab文件,复制自制linux系统上所需要的命令及其库文件

  [[email protected] ~]# mkdir /mnt/root/{boot,etc,dev,bin,sbin,lib,lib64,home,root,proc,sys,usr,var,opt,mnt,media}

  [[email protected] ~]# ls /mnt/root

  bin   dev  home  lib64       media  opt   root  sys  var

  boot  etc  lib   lost+found  mnt    proc  sbin  usr

  [[email protected] ~]# cd /mnt

  [[email protected] mnt]# vim root/etc/fstab

  [[email protected] mnt]# cat root/etc/fstab

  UUID=8c0add68-89a7-43b6-ade0-10e1647c2531 /boot ext4 defaults 1 1 

  UUID=062befd6-d27d-4e45-8675-e9b5771ac934 /     ext4 defaults 1 2

  [[email protected] mnt]# 


由于库文件较多,纯手工复制太过麻烦,在这里我就使用我之前已经编写好的专用于复制命令及库文件的shell脚本来操作(需要本脚本的可以到博文附件中自行下载)

  [[email protected] mnt]# ls

  boot  copycmd.sh  root

  [[email protected] mnt]# ./copycmd.sh

  Please input a command name or quit: bash

  Please input a command name or quit: poweroff

  Please input a command name or quit: reboot

  Please input a command name or quit: ls

  Please input a command name or quit: pwd

  Please input a command name or quit: cp

  Please input a command name or quit: mv

  Please input a command name or quit: rm

  Please input a command name or quit: touch

  Please input a command name or quit: mkdir

  Please input a command name or quit: cat

  Please input a command name or quit: head

  Please input a command name or quit: tail

  Please input a command name or quit: cut

  Please input a command name or quit: sort

  Please input a command name or quit: uniq

  Please input a command name or quit: paste

  Please input a command name or quit: dd     

  Please input a command name or quit: diff

  Please input a command name or quit: du

  Please input a command name or quit: df

  Please input a command name or quit: clear

  Please input a command name or quit: vim

  Please input a command name or quit: grep

  Please input a command name or quit: egrep

  Please input a command name or quit: fgrep

  Please input a command name or quit: sed

  Please input a command name or quit: awk

  Please input a command name or quit: date

  Please input a command name or quit: clock

  Please input a command name or quit: cal

  Please input a command name or quit: chown

  Please input a command name or quit: chmod

  Please input a command name or quit: lsblk

  Please input a command name or quit: blkid

  Please input a command name or quit: fdisk

  Please input a command name or quit: kpartx

  Please input a command name or quit: mkfs    

  Please input a command name or quit: mkfs.ext3

  Please input a command name or quit: mkfs.ext4

  Please input a command name or quit: mke2fs

  Please input a command name or quit: mkswap

  Please input a command name or quit: swapon

  Please input a command name or quit: swapoff

  Please input a command name or quit: mount

  Please input a command name or quit: umount

  Please input a command name or quit: tune2fs

  Please input a command name or quit: e2label

  Please input a command name or quit: dumpe2fs           

  Please input a command name or quit: e2fsck

  Please input a command name or quit: fuser

  Please input a command name or quit: kill

  Please input a command name or quit: find

  Please input a command name or quit: gzip

  Please input a command name or quit: bzip2

  Please input a command name or quit: xz

  Please input a command name or quit: zip

  Please input a command name or quit: tar

  Please input a command name or quit: gunzip

  Please input a command name or quit: unxz

  Please input a command name or quit: bunzip2

  Please input a command name or quit: cpio

  Please input a command name or quit: lscpu

  Please input a command name or quit: shutdown

  Please input a command name or quit: man

  Please input a command name or quit: more

  Please input a command name or quit: less

  Please input a command name or quit: basename

  Please input a command name or quit: dirname

  Please input a command name or quit: file

  Please input a command name or quit: which

  Please input a command name or quit: whereis

  Please input a command name or quit: stat

  Please input a command name or quit: wc

  Please input a command name or quit: tr

  Please input a command name or quit: bc

  Please input a command name or quit: tee

  Please input a command name or quit: tree

  Please input a command name or quit: test

  Please input a command name or quit: fsck

  Please input a command name or quit: free

  Please input a command name or quit: zcat

  Please input a command name or quit: lsmod

  Please input a command name or quit: quit

  [[email protected] mnt]# 


第五步:检验自制linux系统的boot分区和根分区上必须的文件是否完整

制作完成后boot分区的上所有文件(如下所列文件一个都不能少)

  [[email protected] mnt]# tree boot

  boot

  ├── grub

  │   ├── device.map

  │   ├── e2fs_stage1_5

  │   ├── fat_stage1_5

  │   ├── ffs_stage1_5

  │   ├── grub.conf

  │   ├── iso9660_stage1_5

  │   ├── jfs_stage1_5

  │   ├── minix_stage1_5

  │   ├── reiserfs_stage1_5

  │   ├── stage1

  │   ├── stage2

  │   ├── ufs2_stage1_5

  │   ├── vstafs_stage1_5

  │   └── xfs_stage1_5

  ├── initramfs-2.6.32-642.el6.x86_64.img

  ├── lost+found

  └── vmlinuz-2.6.32-642.el6.x86_64


  2 directories, 16 files

  [[email protected] mnt]# 


制作完成后自制linux根分区的上所有文件,/etc/fstab文件一定不能少,否则系统无法自动分区信息,也无法找到根,bash的命令文件和库文件一定不能少,否则系统没shell入口,我们是无法与操作系统交互的,其它命令没有的话进入系统后就没什么功能可用,但不会影响系统的启动。

  [[email protected] mnt]# tree root

  root

  ├── bin

  │   ├── awk

  │   ├── basename

  │   ├── bash

  │   ├── cat

  │   ├── chmod

  │   ├── chown

  │   ├── cp

  │   ├── cpio

  │   ├── cut

  │   ├── date

  │   ├── dd

  │   ├── df

  │   ├── egrep

  │   ├── fgrep

  │   ├── find

  │   ├── grep

  │   ├── gunzip

  │   ├── gzip

  │   ├── kill

  │   ├── ls

  │   ├── lsblk

  │   ├── mkdir

  │   ├── more

  │   ├── mount

  │   ├── mv

  │   ├── pwd

  │   ├── rm

  │   ├── sed

  │   ├── sort

  │   ├── tar

  │   ├── touch

  │   ├── umount

  │   └── zcat

  ├── boot

  ├── dev

  ├── etc

  │   └── fstab

  ├── home

  ├── lib

  ├── lib64

  │   ├── ld-linux-x86-64.so.2

  │   ├── libacl.so.1

  │   ├── libattr.so.1

  │   ├── libaudit.so.1

  │   ├── libblkid.so.1

  │   ├── libbz2.so.1

  │   ├── libcap.so.2

  │   ├── libcom_err.so.2

  │   ├── libcrypt.so.1

  │   ├── libc.so.6

  │   ├── libdbus-1.so.3

  │   ├── libdevmapper.so.1.02

  │   ├── libdl.so.2

  │   ├── libe2p.so.2

  │   ├── libext2fs.so.2

  │   ├── libfreebl3.so

  │   ├── libgcc_s.so.1

  │   ├── libm.so.6

  │   ├── libncurses.so.5

  │   ├── libncursesw.so.5

  │   ├── libnih-dbus.so.1

  │   ├── libnih.so.1

  │   ├── libnsl.so.1

  │   ├── libpcre.so.0

  │   ├── libproc-3.2.8.so

  │   ├── libpthread.so.0

  │   ├── libreadline.so.6

  │   ├── libresolv.so.2

  │   ├── librt.so.1

  │   ├── libselinux.so.1

  │   ├── libsepol.so.1

  │   ├── libtinfo.so.5

  │   ├── libudev.so.0

  │   ├── libutil.so.1

  │   ├── libuuid.so.1

  │   └── libz.so.1

  ├── lost+found

  ├── media

  ├── mnt

  ├── opt

  ├── proc

  ├── root

  ├── sbin

  │   ├── blkid

  │   ├── clock

  │   ├── dumpe2fs

  │   ├── e2fsck

  │   ├── e2label

  │   ├── fdisk

  │   ├── fsck

  │   ├── fuser

  │   ├── kpartx

  │   ├── lsmod

  │   ├── mke2fs

  │   ├── mkfs

  │   ├── mkfs.ext3

  │   ├── mkfs.ext4

  │   ├── mkswap

  │   ├── poweroff

  │   ├── reboot

  │   ├── shutdown

  │   ├── swapoff

  │   ├── swapon

  │   └── tune2fs

  ├── sys

  ├── usr

  │   ├── bin

  │   │   ├── bc

  │   │   ├── bunzip2

  │   │   ├── bzip2

  │   │   ├── cal

  │   │   ├── clear

  │   │   ├── diff

  │   │   ├── dirname

  │   │   ├── du

  │   │   ├── file

  │   │   ├── free

  │   │   ├── head

  │   │   ├── less

  │   │   ├── lscpu

  │   │   ├── man

  │   │   ├── paste

  │   │   ├── stat

  │   │   ├── tail

  │   │   ├── tee

  │   │   ├── test

  │   │   ├── tr

  │   │   ├── tree

  │   │   ├── uniq

  │   │   ├── unxz

  │   │   ├── vim

  │   │   ├── wc

  │   │   ├── whereis

  │   │   ├── which

  │   │   ├── xz

  │   │   └── zip

  │   └── lib64

  │       ├── libgpm.so.2

  │       ├── liblzma.so.0

  │       ├── libmagic.so.1

  │       └── perl5

  │           └── CORE

  │               └── libperl.so

  └── var


  21 directories, 124 files

  [[email protected] mnt]#


第六步:关闭虚拟机,移除用于自制linux系统的硬盘,新建一个虚拟机,直接使用移除下来这块硬盘,开机启动系统,检验是否能正常启动并进入系统

wKioL1fepDGziqb8AAB5S_7l-gc278.jpg


wKioL1fepDLjhOJ5AAGPXuRFaKc954.jpg


wKiom1fepDPx5byoAAEDNRof7tk292.jpg


wKioL1fepDOS2YLgAAGJuI1xT_U061.jpg

当然这只是一个纯内核加了一些基本的命令组合成的一个微linux系统,要想让它能够产生比较强大的功能,还需要做较多的后续工作,当然能进行到这一步,说明我们自制linux的心愿已经实现了。