1. 程式人生 > >私人訂制——屬於你自己的Linux

私人訂制——屬於你自己的Linux

war sta /usr 移植 工作 ble 自由 lib64 guess

一、前言

  Linux操作系統至1991年10月5日誕生以來,就其開源性和自由性得到了很多技術大牛的青睞,每個Linux愛好者都為其貢獻了自己的一份力,不管是在Linux內核還是開源軟件等方面,都為我們後來人提供了一個良好的學習和研究環境。

  本文主要通過裁剪現有Linux系統,根據自己的需要,打造一個屬於自己的Linux小系統,讓其能夠具備Linux的一些常用小功能。

二、原理

啟動流程介紹:

制作Linux小系統之前,我們有必要再了解一下Linux的啟動流程:

1、首先Linux要通過POST自檢,檢查硬件設備有沒有故障

2、如果有多塊啟動盤的話,需要在BIOS中選擇啟動磁盤

3、啟動MBR中的bootloader引導程序

4、加載內核文件

5、執行所有進程的父進程、老祖宗init

6、打印歡迎界面

在Linux的啟動流程中,加載內核文件時還需要借助別外兩個文件:

1)initrd,是CentOS5上用內存模擬的磁盤設備

2)initramfs,是CentOS6上用內存模擬的文件系統

在啟程的流程中,init主要是用來做哪些操作的呢?

init通過調用/etc/inittab這個配置文件,然後再去執行/etc/rc.d/rc.sysinit的系統初始化腳本

好啦,原理我們已經知道了,接下來我們來看看具體的思路吧(〃‘▽‘〃)

三、思路

1、我們要在一個現有的Linux系統上加一塊硬盤/dev/sdb,在硬盤上分兩個分區,一個是/boot,一個是/,並將其格式化。當然,我們需要明確的概念是,我們現在加的這個硬盤在現有的Linux系統中是/dev/sdb,但是,當我們把東西全部設置好時,我們就需要把這個硬盤拔除,放在我們的新系統上,此時,他就是/dev/sda啦。

2、在/dev/sdb這個硬盤上,我們要將其打造成一個獨立的Linux系統,裏面的所有文件是需要我們一個一個拷貝進去的。而且,作為一個將來要當/dev/sda的硬盤,裏面一定要有grub文件諾~所以我們要安裝grub文件。

3、同時,作為一個能獨立運行的Linux系統,內核是一定不能少的!所以,我們要把內核文件和initramfs文件也一起拷到我們的/dev/sdb上。

4、現在我們系統已經初具規模了,接下來就是需要程序了0.0關於程序的拷貝我們可以通過一個腳本來實現。具體的腳本在下文中會給大家說到。

以上步驟完成,我們的自制Linux就完成啦~我們的思路就是這麽回事,接下來,我們就開始吧( ̄▽ ̄)~*

四、操作步驟

本次實驗我們以centos6.9為例~

1、目標磁盤分區

首先,我們在宿主機上添加一塊大小為20G的硬盤:

技術分享

技術分享

技術分享

技術分享

技術分享

技術分享

技術分享

技術分享

添加完成後,點擊確定,然後我們打開宿主機。 通過fdisk來給我們的/dev/sdb進行分區:

 1 [[email protected] ~]# fdisk /dev/sdb
 2 Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
 3 Building a new DOS disklabel with disk identifier 0x4fde4cd0.
 4 Changes will remain in memory only, until you decide to write them.
 5 After that, of course, the previous content wont be recoverable.
 6 
 7  
 8 Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
 9 
10  
11 WARNING: DOS-compatible mode is deprecated. Its strongly recommended to
12 switch off the mode (command c) and change display units to
13 sectors (command u).
14 
15 
16 Command (m for help): n
17 Command action
18 e extended
19 p primary partition (1-4)
20 p
21 Partition number (1-4): 1
22 First cylinder (1-2610, default 1):
23 Using default value 1
24 Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +100M
25 
26 
27 Command (m for help): n
28 Command action
29 e extended
30 p primary partition (1-4)
31 p
32 Partition number (1-4): 2
33 First cylinder (15-2610, default 15):
34 Using default value 15
35 Last cylinder, +cylinders or +size{K,M,G} (15-2610, default 2610):
36 Using default value 2610
37 #查看分區
38 Command (m for help): p
39 
40  
41 Disk /dev/sdb: 21.5 GB, 21474836480 bytes
42 255 heads, 63 sectors/track, 2610 cylinders
43 Units = cylinders of 16065 * 512 = 8225280 bytes
44 Sector size (logical/physical): 512 bytes / 512 bytes
45 I/O size (minimum/optimal): 512 bytes / 512 bytes
46 Disk identifier: 0x4fde4cd0
47 
48  
49 Device Boot Start End Blocks Id System
50 /dev/sdb1 1 14 112423+ 83 Linux
51 /dev/sdb2 15 2610 20852370 83 Linux
52 #保存並退出
53 Command (m for help): w
54 The partition table has been altered! 

接下來,我們對/dev/sdb的分區進行格式化:

1 [[email protected] ~]# mkfs.ext4 /dev/sdb1
2 [[email protected] ~]# mkfs.ext4 /dev/sdb2 

格式化完成後,我們創建一個文件夾。進行掛載:

1 [[email protected] ~]# mkdir -p /mnt/boot
2 [[email protected] ~]# mount /dev/sdb1 /mnt/boot/ 

  註意:新建的文件夾必須是/mnt/boot

2、安裝grub至目標磁盤

我們直接用grub-install --root-directory=/mnt命令來安裝。用這個命令會安裝grub引導第二階段的文件。

 1 [[email protected] ~]# grub-install --root-directory=/mnt /dev/sdb
 2 Probing devices to guess BIOS drives. This may take a long time.
 3 Installation finished. No error reported.
 4 This is the contents of the device map /mnt/boot/grub/device.map.
 5 Check if this is correct or not. If any of the lines is incorrect,
 6 fix it and re-run the script `grub-install.
 7 
 8  
 9 (fd0)    /dev/fd0
10 (hd0)    /dev/sda
11 (hd1)    /dev/sdb
12 [[email protected] ~]# cd /mnt/boot
13 [[email protected] boot]# ls
14 grub lost+found
15 [[email protected] boot]# cd grub/
16 [[email protected] grub]# ls
17 device.map fat_stage1_5 iso9660_stage1_5 minix_stage1_5 stage1 ufs2_stage1_5 
18 xfs_stage1_5 e2fs_stage1_5 ffs_stage1_5 jfs_stage1_5 reiserfs_stage1_5 stage2 vstafs_stage1_5

  我們可以來看一下二進制確認我們是否安裝成功:

 1 [[email protected] ~]# hexdump -C -n 512 /dev/sdb
 2 00000000 eb 48 90 00 00 00 00 00 00 00 00 00 00 00 00 00 |.H..............|
 3 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
 4 *
 5 00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 02 |................|
 6 00000040 ff 00 00 20 01 00 00 00 00 02 fa 90 90 f6 c2 80 |... ............|
 7 00000050 75 02 b2 80 ea 59 7c 00 00 31 c0 8e d8 8e d0 bc |u....Y|..1......|
 8 00000060 00 20 fb a0 40 7c 3c ff 74 02 88 c2 52 f6 c2 80 |. [email protected]|<.t...R...|
 9 00000070 74 54 b4 41 bb aa 55 cd 13 5a 52 72 49 81 fb 55 |tT.A..U..ZRrI..U|
10 00000080 aa 75 43 a0 41 7c 84 c0 75 05 83 e1 01 74 37 66 |.uC.A|..u....t7f|
11 00000090 8b 4c 10 be 05 7c c6 44 ff 01 66 8b 1e 44 7c c7 |.L...|.D..f..D|.|
12 000000a0 04 10 00 c7 44 02 01 00 66 89 5c 08 c7 44 06 00 |....D...f.\..D..|
13 000000b0 70 66 31 c0 89 44 04 66 89 44 0c b4 42 cd 13 72 |pf1..D.f.D..B..r|
14 000000c0 05 bb 00 70 eb 7d b4 08 cd 13 73 0a f6 c2 80 0f |...p.}....s.....|
15 000000d0 84 f0 00 e9 8d 00 be 05 7c c6 44 ff 00 66 31 c0 |........|.D..f1.|
16 000000e0 88 f0 40 66 89 44 04 31 d2 88 ca c1 e2 02 88 e8 |[email protected]1........|
17 000000f0 88 f4 40 89 44 08 31 c0 88 d0 c0 e8 02 66 89 04 |[email protected]1......f..|
18 00000100 66 a1 44 7c 66 31 d2 66 f7 34 88 54 0a 66 31 d2 |f.D|f1.f.4.T.f1.|
19 00000110 66 f7 74 04 88 54 0b 89 44 0c 3b 44 08 7d 3c 8a |f.t..T..D.;D.}<.|
20 00000120 54 0d c0 e2 06 8a 4c 0a fe c1 08 d1 8a 6c 0c 5a |T.....L......l.Z|
21 00000130 8a 74 0b bb 00 70 8e c3 31 db b8 01 02 cd 13 72 |.t...p..1......r|
22 00000140 2a 8c c3 8e 06 48 7c 60 1e b9 00 01 8e db 31 f6 |*....H|`......1.|
23 00000150 31 ff fc f3 a5 1f 61 ff 26 42 7c be 7f 7d e8 40 |1.....a.&B|..}[email protected]|
24 00000160 00 eb 0e be 84 7d e8 38 00 eb 06 be 8e 7d e8 30 |.....}.8.....}.0|
25 00000170 00 be 93 7d e8 2a 00 eb fe 47 52 55 42 20 00 47 |...}.*...GRUB .G|
26 00000180 65 6f 6d 00 48 61 72 64 20 44 69 73 6b 00 52 65 |eom.Hard Disk.Re|
27 00000190 61 64 00 20 45 72 72 6f 72 00 bb 01 00 b4 0e cd |ad. Error.......|
28 000001a0 10 ac 3c 00 75 f4 c3 00 00 00 00 00 00 00 00 00 |..<.u...........|
29 000001b0 00 00 00 00 00 00 00 00 d0 4c de 4f 00 00 00 01 |.........L.O....|
30 000001c0 01 00 83 fe 3f 0d 3f 00 00 00 4f 6e 03 00 00 00 |....?.?...On....|
31 000001d0 01 0e 83 fe ff ff 8e 6e 03 00 24 5d 7c 02 00 00 |.......n..$]|...|
32 000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
33 000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
34 00000200 

安裝成功。

3、復制內核文件和initrd文件

將內核文件和initrd文件復制到/dev/sdb下的boot目錄中:

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

4、建立grub.conf文件

上面我們已經移植了內核和initrd文件,我們可以根據其版本來編寫grub.conf文件:

1 [[email protected] ~]# vim /mnt/boot/grub/grub.conf
2 default=0
3 timeout=3
4 title linux owner
5 kernel /vmlinuz-2.6.32-696.el6.x86_64 root=UUID=1feac471-08c5-4b5b-aaff-bb6a1da60e26 selinux=0 init=/bin/bash
6 initrd /initramfs-2.6.32-696.el6.x86_64.img 

註意,我們要把selinux給關掉,同時設定一下init,告訴內核不要再去找這個程序了,不然開機的時候會出現錯誤的~

5、創建一級目錄並復制文件

至此,我們就缺目錄和文件了~

創建開機後的一級目錄,同時把/dev/sdb2掛載至/mnt/sysroot,使該目錄作為根目錄:

 1 [[email protected] ~]# mkdir /mnt/sysroot
 2 [[email protected] ~]# mkdir -pv /mnt/sysroot/{etc,tmp,var,usr,sys,proc,opt,home,root,dev,mnt,media}
 3 mkdir: created directory `/mnt/sysroot/etc 4 mkdir: created directory `/mnt/sysroot/tmp 5 mkdir: created directory `/mnt/sysroot/var 6 mkdir: created directory `/mnt/sysroot/usr 7 mkdir: created directory `/mnt/sysroot/sys 8 mkdir: created directory `/mnt/sysroot/proc 9 mkdir: created directory `/mnt/sysroot/opt10 mkdir: created directory `/mnt/sysroot/home11 mkdir: created directory `/mnt/sysroot/root12 mkdir: created directory `/mnt/sysroot/dev13 mkdir: created directory `/mnt/sysroot/mnt14 mkdir: created directory `/mnt/sysroot/media 

  復制文件,復制文件我們通過腳本執行,復制我們平時常用的命令即可,小編這裏復制了ls,ifconfig,bash,reboot,rm,modprobe,mount,ip,mkdir,touch,cat,vi,less,shutdown,insmod。我們可以用tree查看一下這些命令的復制情況:

 1 [[email protected] sysroot]# tree /mnt/sysroot/
 2 /mnt/sysroot/
 3 ├── bin
 4 │   ├── bash
 5 │   ├── cat
 6 │   ├── ls
 7 │   ├── mkdir
 8 │   ├── mount
 9 │   ├── rm
10 │   └── touch
11 ├── dev
12 ├── etc
13 ├── home
14 ├── lib64
15 │   ├── ld-linux-x86-64.so.2
16 │   ├── libacl.so.1
17 │   ├── libattr.so.1
18 │   ├── libaudit.so.1
19 │   ├── libblkid.so.1
20 │   ├── libcap.so.2
21 │   ├── libcrypt.so.1
22 │   ├── libc.so.6
23 │   ├── libdbus-1.so.3
24 │   ├── libdl.so.2
25 │   ├── libfreebl3.so
26 │   ├── libgcc_s.so.1
27 │   ├── libm.so.6
28 │   ├── libnih-dbus.so.1
29 │   ├── libnih.so.1
30 │   ├── libnsl.so.1
31 │   ├── libpcre.so.0
32 │   ├── libpthread.so.0
33 │   ├── libresolv.so.2
34 │   ├── librt.so.1
35 │   ├── libselinux.so.1
36 │   ├── libsepol.so.1
37 │   ├── libtinfo.so.5
38 │   ├── libutil.so.1
39 │   └── libuuid.so.1
40 ├── lost+found
41 ├── media
42 ├── mnt
43 ├── opt
44 ├── proc
45 ├── root
46 ├── sbin
47 │   ├── ifconfig
48 │   ├── insmod
49 │   ├── ip
50 │   ├── modprobe
51 │   ├── reboot
52 │   └── shutdown
53 ├── sys
54 ├── tmp
55 ├── usr
56 │   ├── bin
57 │   │   ├── less
58 │   │   └── vim
59 │   └── lib64
60 │   ├── libgpm.so.2
61 │   └── perl5
62 │   └── CORE
63 │   └── libperl.so
64 └── var
65 
66 20 directories, 42 files 

  很明顯我們都復制成功了~

附:復制命令的腳本源代碼

 1 #!/bin/base
 2 #----------------------------------
 3 #Filename:copycmd.sh
 4 #Revision:1.0
 5 #Date:2017-09-14
 6 #Author:Keer
 7 #Email:893348728@qq.com
 8 #Website:http://www.cnblogs.com/keerya/
 9 #Description:復制命令到指定目錄
10 #----------------------------------
11 
12 #定義變量
13 destdir=/mnt/sysroot
14 SETCOLOR_FAILURE="echo -en \\033[1;35;5m"
15 SETCOLOR_NORMAL="echo -en \\033[0m"
16 
17 echo_jiantou() {
18 echo -en \\033[40G
19 $SETCOLOR_FAILURE
20 }
21 
22 echo_copy() {
23 echo -en \\033[80G
24 $SETCOLOR_FAILURE
25 echo -n $"復制完成!"
26 $SETCOLOR_NORMAL
27 }
28 
29 #定義函數
30 #復制命令
31 copy_cmd(){
32 #       定義變量
33         local cmd_path=`which --skip-alias $cmd`
34         local cmd_dir=`dirname $cmd_path`
35         local cmd_destdir=$destdir$cmd_dir
36         if [ ! -d $cmd_destdir ] ;then
37                 mkdir -pv $cmd_destdir &> /dev/null
38         fi
39         cp $cmd_path $cmd_destdir &> /dev/null
40         echo -e "\t$cmd_path `echo_jiantou` \t $cmd_destdir `echo_copy` "
41 }
42 #復制庫文件 判斷庫文件是否存在,若存在,跳過該次循環;如不存在,判斷庫文件所在目錄是否存在,若存在,復制庫文件;若不存在,則新建目錄並復制庫文件  cp -v 顯示命令執行的詳細操作
43 copy_libfile(){
44         local cmd_path=`which --skip-alias $cmd`
45         local lib_list=`ldd $cmd_path |egrep -o "/.* " `
46         for i in  $lib_list ;do
47                 local lib_dir=$destdir$i
48                 local lib_destdir=$destdir`dirname $i`
49                 echo -e "\t$i `echo_jiantou` \t $lib_destdir `echo_copy` "
50                 if [ -e $lib_dir ];then
51                         continue
52                 elif [ -d $lib_destdir ];then
53                         cp  $i $lib_destdir
54                 else
55                         mkdir -pv $lib_destdir &> /dev/null
56                         cp  $i $lib_destdir
57                 fi
58         done
59 }
60 #若/mnt/sysroot不存在,則創建
61 if [ ! d $destdir ];then
62         mkdir $destdir
63 fi
64 
65 #死循環,清空屏幕
66 while true ; do
67         tput clear
68 #正式:
69 cat <<-EOF
70 **********************************************************************
71 ***                      命令復制腳本                                ***
72 ***                     請輸入一個命令                               ***
73 ***                   按q或quit退出腳本                              ***
74 **********************************************************************
75 EOF
76 
77         read -p "Please input a execute command:" cmd
78         if [ "$cmd" == q -o "$cmd" == quit ];then
79                 unset cmd destdir
80                 break
81         fi
82 #       判斷輸入的命令是否存在
83         if [ -n "$cmd" ];then
84                 which --skip-alias "$cmd" &> /dev/null
85                 if [ $? -eq 0 ];then
86                         copy_cmd $cmd
87                         copy_libfile $cmd
88                 else
89                         echo "$cmd is not exist"
90                 fi
91         else
92                 echo "Please enter at leastone command"
93         fi
94         echo -e "Please enter \\033[31;1menter\\033[0m and we continue"
95         read input
96 
97 done

6、復制網卡驅動

我們基本工作已經完成了,如果想使這個虛擬機帶有網卡功能,我們就必須把網卡驅動拷過來,具體操作如下:

1)查詢網卡詳細信息:

 1 [[email protected] sysroot]# modinfo e1000
 2 filename: /lib/modules/2.6.32-696.el6.x86_64/kernel/drivers/net/e1000/e1000.ko
 3 version: 7.3.21-k8-NAPI
 4 license: GPL
 5 description: Intel(R) PRO/1000 Network Driver
 6 author: Intel Corporation, <[email protected]>
 7 srcversion: A911791C4EFC2A93BCFCF6A
 8 alias: pci:v00008086d00002E6Esv*sd*bc*sc*i*
 9 alias: pci:v00008086d000010B5sv*sd*bc*sc*i*
10 alias: pci:v00008086d00001099sv*sd*bc*sc*i*
11 alias: pci:v00008086d0000108Asv*sd*bc*sc*i*
12 alias: pci:v00008086d0000107Csv*sd*bc*sc*i*
13 alias: pci:v00008086d0000107Bsv*sd*bc*sc*i*
14 …… 

2)把網卡模塊的路徑復制到/mnt/sysroot的庫文件下:

1 [[email protected] sysroot]# cp /lib/modules/2.6.32-696.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib64/

以上,我們的操作全部完成。現在我們就可以關機,然後把/dev/sdb這個硬盤拆下來,放到新的虛擬機上運行了~

五、測試開機

我們創建一個新的虛擬機,啟動的時候會帶一個硬盤,我們不用它的,刪掉再把我們自己定義的硬盤加進去:

技術分享

技術分享

技術分享

技術分享

技術分享

技術分享

此時,我們做好的硬盤已經加進去了。我們可以試試能不能啟動了,如果虛擬機可以正常開啟,就說明我們的實驗成功~

技術分享

技術分享

六、實現網絡功能

技術分享

由於復制命令的時候忘記復制ping了……所以我們用另一臺機器來ping一下這個ip地址:

技術分享

可以ping通~

至此,我們已經完成了私人訂制Linux的全部操作,同時我們的自制Linux也可以聯網啦~

所有實驗圓滿成功!撒花??ヽ(°▽°)ノ?

私人訂制——屬於你自己的Linux