《LINUX實(shí)戰(zhàn):打造屬于你自己的Linux系統(tǒng)》要點(diǎn):
本文介紹了LINUX實(shí)戰(zhàn):打造屬于你自己的Linux系統(tǒng),希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
Linux操作系統(tǒng)至1991年10月5日誕生以來(lái),就其開(kāi)源性和自由性得到了很多技術(shù)大牛的青睞,每個(gè)Linux喜好者都為其貢獻(xiàn)了自己的一份力,不管是在Linux內(nèi)核還是開(kāi)源軟件等方面,都為我們后來(lái)人提供了一個(gè)良好的學(xué)習(xí)和研究環(huán)境.
本文主要通過(guò)裁剪現(xiàn)有Linux系統(tǒng),根據(jù)本身的需要,打造一個(gè)屬于本身的Linux小系統(tǒng),讓其能夠具備Linux的一些常用小功能.
啟動(dòng)流程先容:
制作Linux小系統(tǒng)之前,我們有需要再了解一下Linux的啟動(dòng)流程:
1、首先Linux要通過(guò)POST自檢,反省硬件設(shè)備有沒(méi)有故障
2、如果有多塊啟動(dòng)盤(pán)的話,必要在BIOS中選擇啟動(dòng)磁盤(pán)
3、啟動(dòng)MBR中的bootloader引導(dǎo)法式
4、加載內(nèi)核文件
5、執(zhí)行所有過(guò)程的父過(guò)程、老祖宗init
6、打印迎接界面
在Linux的啟動(dòng)流程中,加載內(nèi)核文件時(shí)還必要借助別外兩個(gè)文件:
1)initrd,是CentOS5上用內(nèi)存模擬的磁盤(pán)裝備
2)initramfs,是CentOS6上用內(nèi)存模擬的文件體系
在啟程的流程中,init主要是用來(lái)做哪些操作的呢?
init通過(guò)挪用/etc/inittab這個(gè)配置文件,然后再去執(zhí)行/etc/rc.d/rc.sysinit的系統(tǒng)初始化腳本
? ?
好啦,原理我們已經(jīng)知道了,接下來(lái)我們來(lái)看看具體的思緒吧(〃'▽'〃)
? ? 1、我們要在一個(gè)現(xiàn)有的Linux系統(tǒng)上加一塊硬盤(pán)/dev/sdb,在硬盤(pán)上分兩個(gè)分區(qū),一個(gè)是/boot,一個(gè)是/,并將其格式化.當(dāng)然,我們需要明確的概念是,我們現(xiàn)在加的這個(gè)硬盤(pán)在現(xiàn)有的Linux系統(tǒng)中是/dev/sdb,但是,當(dāng)我們把東西全部設(shè)置好時(shí),我們就需要把這個(gè)硬盤(pán)鏟除,放在我們的新系統(tǒng)上,此時(shí),他就是/dev/sda啦.
? ? 2、在/dev/sdb這個(gè)硬盤(pán)上,我們要將其打造成一個(gè)獨(dú)立的Linux系統(tǒng),里面的所有文件是需要我們一個(gè)一個(gè)拷貝進(jìn)去的.而且,作為一個(gè)將來(lái)要當(dāng)/dev/sda的硬盤(pán),里面必定要有g(shù)rub文件諾~所以我們要安裝grub文件.
? ? 3、同時(shí),作為一個(gè)能獨(dú)立運(yùn)行的Linux系統(tǒng),內(nèi)核是必定不能少的!所以,我們要把內(nèi)核文件和initramfs文件也一起拷到我們的/dev/sdb上.
? ? 4、現(xiàn)在我們系統(tǒng)已經(jīng)初具規(guī)模了,接下來(lái)就是需要程序了0.0關(guān)于程序的拷貝我們可以通過(guò)一個(gè)腳原來(lái)實(shí)現(xiàn).具體的腳本在下文中會(huì)給大家說(shuō)到.
? ? 以上步驟完成,我們的自制Linux就完成啦~我們的思路便是這么回事,接下來(lái),我們就開(kāi)始吧( ̄▽ ̄)~*
? ? 本次實(shí)驗(yàn)我們以centos6.9為例~
1、目的磁盤(pán)分區(qū)
? ? 首先,我們?cè)谒拗鳈C(jī)上添加一塊年夜小為20G的硬盤(pán):
? ? 添加完成后,點(diǎn)擊肯定,然后我們打開(kāi)宿主機(jī). 通過(guò)fdisk來(lái)給我們的/dev/sdb進(jìn)行分區(qū):
1 [root@localhost ~]# 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 won't 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. It's 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 #查看分區(qū) 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!
接下來(lái),我們對(duì)/dev/sdb的分區(qū)進(jìn)行格式化:
1 [root@localhost ~]# mkfs.ext4 /dev/sdb1 2 [root@localhost ~]# mkfs.ext4 /dev/sdb2
? ? 格式化完成后,我們創(chuàng)立一個(gè)文件夾.進(jìn)行掛載:
1 [root@localhost ~]# mkdir -p /mnt/boot 2 [root@localhost ~]# mount /dev/sdb1 /mnt/boot/
注意:新建的文件夾必需是/mnt/boot
2、安裝grub至目的磁盤(pán)
? ? 我們直接用grub-install --root-directory=/mnt命令來(lái)安裝.用這個(gè)命令會(huì)安裝grub領(lǐng)導(dǎo)第二階段的文件.
1 [root@localhost ~]# 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 [root@localhost ~]# cd /mnt/boot 13 [root@localhost boot]# ls 14 grub lost+found 15 [root@localhost boot]# cd grub/ 16 [root@localhost 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 ?
我們可以來(lái)看一下二進(jìn)制確認(rèn)我們是否安裝勝利:
1 [root@localhost ~]# 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 |. ..@|<.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 |..@f.D.1........| 17 000000f0 88 f4 40 89 44 08 31 c0 88 d0 c0 e8 02 66 89 04 |..@.D.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|..}.@| 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、復(fù)制內(nèi)核文件和initrd文件
? ? 將內(nèi)核文件和initrd文件復(fù)制到/dev/sdb下的boot目次中:
1 [root@localhost ~]# cp /boot/vmlinuz-2.6.32-696.el6.x86_64 /mnt/boot/ 2 [root@localhost ~]# cp /boot/initramfs-2.6.32-696.el6.x86_64.img /mnt/boot/
4、樹(shù)立grub.conf文件
? ? 上面我們已經(jīng)移植了內(nèi)核和initrd文件,我們可以根據(jù)其版原來(lái)編寫(xiě)grub.conf文件:
1 [root@localhost ~]# 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給關(guān)掉,同時(shí)設(shè)定一下init,告訴內(nèi)核不要再去找這個(gè)程序了,否則開(kāi)機(jī)的時(shí)候會(huì)出現(xiàn)錯(cuò)誤的~
5、創(chuàng)立一級(jí)目錄并復(fù)制文件
? ? 至此,我們就缺目次和文件了~
? ? 創(chuàng)立開(kāi)機(jī)后的一級(jí)目錄,同時(shí)把/dev/sdb2掛載至/mnt/sysroot,使該目錄作為根目錄:
1 [root@localhost ~]# mkdir /mnt/sysroot 2 [root@localhost ~]# 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/opt' 10 mkdir: created directory `/mnt/sysroot/home' 11 mkdir: created directory `/mnt/sysroot/root' 12 mkdir: created directory `/mnt/sysroot/dev' 13 mkdir: created directory `/mnt/sysroot/mnt' 14 mkdir: created directory `/mnt/sysroot/media' ?
復(fù)制文件,復(fù)制文件我們通過(guò)腳本執(zhí)行,復(fù)制我們平時(shí)常用的命令即可,小編這里復(fù)制了ls,ifconfig,bash,reboot,rm,modprobe,mount,ip,mkdir,touch,cat,vi,less,shutdown,insmod.我們可以用tree查看一下這些命令的復(fù)制環(huán)境:
1 [root@localhost 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 ?
很明顯我們都復(fù)制勝利了~
附:復(fù)制命令的劇本源代碼
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:復(fù)制命令到指定目錄 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 $"復(fù)制完成!" 26 $SETCOLOR_NORMAL 27 } 28 29 #定義函數(shù) 30 #復(fù)制命令 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 #復(fù)制庫(kù)文件 判斷庫(kù)文件是否存在,若存在,跳過(guò)該次循環(huán);如不存在,判斷庫(kù)文件所在目錄是否存在,若存在,復(fù)制庫(kù)文件;若不存在,則新建目錄并復(fù)制庫(kù)文件 cp -v 顯示命令執(zhí)行的詳細(xì)操作 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不存在,則創(chuàng)立 61 if [ ! d $destdir ];then 62 mkdir $destdir 63 fi 64 65 #死循環(huán),清空屏幕 66 while true ; do 67 tput clear 68 #正式: 69 cat <<-EOF 70 ********************************************************************** 71 *** 命令復(fù)制腳本 *** 72 *** 請(qǐng)輸入一個(gè)命令 *** 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、復(fù)制網(wǎng)卡驅(qū)動(dòng)
? ? 我們基本工作已經(jīng)完成了,如果想使這個(gè)虛擬機(jī)帶有網(wǎng)卡功能,我們就必需把網(wǎng)卡驅(qū)動(dòng)拷過(guò)來(lái),具體操作如下:
1)查詢網(wǎng)卡具體信息:
1 [root@localhost 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, <linux.nics@intel.com> 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)把網(wǎng)卡模塊的路徑復(fù)制到/mnt/sysroot的庫(kù)文件下:
1 [root@localhost sysroot]# cp /lib/modules/2.6.32-696.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib64/
? ? 以上,我們的操作全體完成.現(xiàn)在我們就可以關(guān)機(jī),然后把/dev/sdb這個(gè)硬盤(pán)拆下來(lái),放到新的虛擬機(jī)上運(yùn)行了~
? ? 我們創(chuàng)建一個(gè)新的虛擬機(jī),啟動(dòng)的時(shí)候會(huì)帶一個(gè)硬盤(pán),我們不用它的,刪掉再把我們本身定義的硬盤(pán)加進(jìn)去:
? ? 此時(shí),我們做好的硬盤(pán)已經(jīng)加進(jìn)去了.我們可以試試能不克不及啟動(dòng)了,如果虛擬機(jī)可以正常開(kāi)啟,就說(shuō)明我們的實(shí)驗(yàn)成功~
? ? 由于復(fù)制命令的時(shí)候忘記復(fù)制ping了……所以我們用另一臺(tái)機(jī)械來(lái)ping一下這個(gè)ip地址:
? ? 可以ping通~
? ? 至此,我們已經(jīng)完成了私人訂制Linux的全體操作,同時(shí)我們的自制Linux也可以聯(lián)網(wǎng)啦~
? ? 所有實(shí)驗(yàn)圓滿勝利!撒花??ヽ(°▽°)ノ?
本文永遠(yuǎn)更新鏈接地址:
更多LINUX教程,盡在維易PHP學(xué)院專欄。歡迎交流!
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/6700.html