寫在前面,這篇博文隻能讓裁剪的系統能夠使用簡單的bash指令
在裁剪系統之前,先了解能啟動系統時,所必需的檔案和程式。
1、開機所必需的的bootloader(grub)
2、核心檔案、核心鏡像檔案
3、能執行/sbin/init、有一個能執行指令的bash環境
4、能執行指令時所需的庫檔案
5、有inittab檔案、rc.sysinit執行腳本檔案
RHEL 5.x的裁剪
先添加一塊硬碟,把裁剪的系統放到新添加的硬碟上,然後用這塊新添加的硬碟當啟動盤,能夠實作裁剪系統的正常啟動,則表示裁剪成功。本實驗是用vmworkstation虛拟機完成的。
1)添加硬碟,分兩個區,一個boot,一個根檔案(rootfs)
添加硬碟步驟:VM--->Settings--->Add--->Hard Disk--->next--->Create a new virtual disk--->next---SCSI--->next--->
<a href="http://blog.51cto.com/attachment/201308/115110841.png" target="_blank"></a>
<a href="http://blog.51cto.com/attachment/201308/115128131.png" target="_blank"></a>
添加磁盤後重新開機電腦,然後對磁盤分區。
<a href="http://blog.51cto.com/attachment/201308/133454638.png" target="_blank"></a>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<code>[root@localhost ~]</code><code># fdisk /dev/sdb</code>
<code>Command (m </code><code>for</code> <code>help): n</code>
<code>Command action</code>
<code> </code><code>e extended</code>
<code> </code><code>p primary partition (1-4)</code>
<code>p</code>
<code>Partition number (1-4): 1</code>
<code>First cylinder (1-2610, default 1):</code>
<code>Using default value 1</code>
<code>Last cylinder or +size or +sizeM or +sizeK (1-2610, default 2610): +30M</code>
<code>Partition number (1-4): 2</code>
<code>First cylinder (6-2610, default 6):</code>
<code>Using default value 6</code>
<code>Last cylinder or +size or +sizeM or +sizeK (6-2610, default 2610): +200M</code>
<code>Command (m </code><code>for</code> <code>help): w</code>
<code>[root@localhost ~]</code><code>#partprobe</code>
<code>[root@localhost ~]</code><code>#mkfs -t ext3 /dev/sdb1 &>/dev/null</code>
<code>[root@localhost ~]</code><code>#mkfs -t ext3 /dev/sdb2 &>/dev/null</code>
2)為新添加的磁盤的第一個分區建立grub檔案
<a href="http://blog.51cto.com/attachment/201308/133513464.png" target="_blank"></a>
3)copy核心檔案和生成核心鏡像檔案
<a href="http://blog.51cto.com/attachment/201308/133536175.png" target="_blank"></a>
<a href="http://blog.51cto.com/attachment/201308/133603189.png" target="_blank"></a>
<code>[root@localhost opt]</code><code># pwd</code>
<code>/opt</code>
<code>[root@localhost opt]</code><code>#find . | cpio -H newc --quiet -o |gzip -9 > /mnt/boot/initrd.gz #把opt目錄的所有檔案利用cpio打包,然後用gzip指令壓縮後,輸出到/mnt/boot目錄下,檔案名為initrd.gz</code>
4)複制init和bash等其它指令以及指令的庫檔案到新添加硬碟的sysroot目錄
思路:複制指令時,指令如果要執行,需要依賴該指令所需的庫檔案,所有在複制指令時,必須把指令依賴的庫檔案也複制到相應的目錄,init的指令位于/sbin/init,庫檔案位于/lib64(系統為x86_64)下,要将/sbin/init 複制到新硬碟的/mnt/sysroot/sbin目錄下,init所依賴的庫,也應該複制/mnt/sysroot/lib64目錄下
<code>#!/bin/bash</code>
<code>DestDir=</code><code>/mnt/sysroot</code>
<code>bincp() {</code>
<code> </code><code>[ -d ${DestDir}${CmdDir} ] || </code><code>mkdir</code> <code>-p ${DestDir}${CmdDir}</code>
<code> </code><code>[ ! -f ${DestDir}${Cmd} ] && </code><code>cp</code> <code>$Cmd ${DestDir}${Cmd} && </code><code>echo</code> <code>"copy $Cmd command to $DestDir finished."</code>
<code>}</code>
<code>libcp() {</code>
<code> </code><code>for</code> <code>Lib </code><code>in</code> <code>`ldd $Cmd | </code><code>grep</code> <code>-o </code><code>"[^[:space:]]*/lib[^[:space:]]*"</code><code>`;</code><code>do</code>
<code> </code><code>LibDir=${Lib%/*}</code>
<code> </code><code>[ -d ${DestDir}${LibDir} ] || </code><code>mkdir</code> <code>-p ${DestDir}${LibDir}</code>
<code> </code><code>[ ! -f ${DestDir}${Lib} ] && </code><code>cp</code> <code>$Lib ${DestDir}${Lib} && </code><code>echo</code> <code>"copy $Lib to $DestDir finished."</code>
<code>done</code>
<code>read</code> <code>-p </code><code>"input a command:"</code> <code>Cmd</code>
<code>while</code> <code>[ $Cmd != </code><code>'q'</code> <code>-a $Cmd != </code><code>'Q'</code> <code>];</code><code>do</code>
<code>Cmd=`</code><code>which</code> <code>$Cmd | </code><code>grep</code> <code>-</code><code>v</code> <code>"alias"</code> <code>| </code><code>sed</code> <code>'s@[[:space:]]@@g'</code><code>`</code>
<code>CmdDir=${Cmd%/*}</code>
<code>bincp</code>
<code>libcp</code>
<code>printf</code> <code>"=======Copy command is OK=========\n"</code>
腳本的内容
<a href="http://blog.51cto.com/attachment/201308/140033818.png" target="_blank"></a>
5)建立系統所需的檔案和腳本 grub配置檔案、inittab檔案和rc.sysinit腳本檔案
<code>#grub配置檔案</code>
<code>cat >> /mnt/boot/grub/grub.conf <<EOF</code>
<code>default</code><code>=</code><code>0</code>
<code>timeout=</code><code>6</code>
<code>title My Litter Linux (RHEL </code><code>5</code><code>.x)</code>
<code> </code><code>root (hd0,</code><code>0</code><code>)</code>
<code> </code><code>kernel /vmlinuz</code>
<code> </code><code>initrd /initrd.gz</code>
<code>EOF </code>
<code> </code>
<code> </code><code>#inittab檔案</code>
<code>cat >> /mnt/sysroot/etc/inittab << EOF</code>
<code>id:</code><code>3</code><code>:initdefault:</code>
<code>si::sysinit:/etc/rc.d/rc.sysinit</code>
<code>EOF</code>
<code>#rc.sysinit腳本檔案,/bin/bash,表示開機自動運作bash,生成一個bash環境</code>
<code>cat >> /mnt/sysroot/etc/rc.d/rc.sysinit <<EOF</code>
<code>echo -e </code><code>"\033[31m Welcome My Little RHEL 5.x\033[0m"</code>
<code>/bin/bash</code>
<code>chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit</code>
把系統關機,然後把新添加的硬碟作為一個裁剪的系統看能否啟動
在虛拟機裡面建立一個虛拟機,安裝之前裁剪的系統,看是否能正常運作
<a href="http://blog.51cto.com/attachment/201308/144826572.png" target="_blank"></a>
<a href="http://blog.51cto.com/attachment/201308/144844691.png" target="_blank"></a>
<a href="http://blog.51cto.com/attachment/201308/144935640.png" target="_blank"></a>
<a href="http://blog.51cto.com/attachment/201308/144953479.png" target="_blank"></a>
RHEL 5.x的裁剪的腳本,該腳本能自動化的完成上述的操作
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<code>echo</code> <code>-e </code><code>"\033[31m=======Frist:Formatting a disk partition======\033[0m"</code>
<code>echo</code> <code>"Inital a disk..."</code>
<code>echo</code> <code>-e </code><code>"\033[31m Warning:\033[0m"</code>
<code>fdisk</code> <code>-l 2></code><code>/dev/null</code> <code>| </code><code>grep</code> <code>-o </code><code>"^Disk /dev/[sh]d[a-z]"</code>
<code>read</code> <code>-p </code><code>"Pls choice a disk:"</code> <code>DiskPart</code>
<code>if</code> <code>[ </code><code>"$DiskPart"</code> <code>== </code><code>'quit'</code> <code>];</code><code>then</code>
<code> </code><code>echo</code> <code>"you choice quit."</code>
<code> </code><code>exit</code> <code>3</code>
<code>fi</code>
<code>until</code> <code>fdisk</code> <code>-l 2></code><code>/dev/null</code> <code>| </code><code>grep</code> <code>-o </code><code>"^Disk /dev/[sh]d[a-z]"</code> <code>| </code><code>grep</code> <code>"^Disk $DiskPart"</code><code>&></code><code>/dev/null</code> <code>;</code><code>do</code>
<code> </code><code>read</code> <code>-p </code><code>"you choice is wrong,choice again:"</code> <code>DiskPart</code>
<code>read</code> <code>-p </code><code>"Your choice will destory all data,continue:"</code> <code>Choice</code>
<code>until</code> <code>[ $Choice == </code><code>'y'</code> <code>-o $Choice == </code><code>'n'</code> <code>];</code><code>do</code>
<code> </code><code>read</code> <code>-p </code><code>"Your choice will destory all data,continue:"</code> <code>Choice</code>
<code>if</code> <code>[ $Choice == </code><code>'n'</code> <code>];</code><code>then</code>
<code> </code><code>echo</code> <code>"you Choice quit."</code>
<code> </code><code>exit</code> <code>4</code>
<code>else</code>
<code> </code><code>dd</code> <code>if</code><code>=</code><code>/dev/zero</code> <code>of=$DiskPart bs=512 count=1 &></code><code>/dev/null</code>
<code> </code><code>sync</code>
<code> </code><code>sleep</code> <code>3</code>
<code>echo</code> <code>'n</code>
<code>1 </code><code>#後面有一行空格</code>
<code>+30M</code>
<code>n</code>
<code>2 </code><code>#後面有一行空格</code>
<code>+200M</code>
<code>w'| </code><code>fdisk</code> <code>$DiskPart &></code><code>/dev/null</code>
<code>partprobe</code>
<code>mkfs -t ext3 ${DiskPart}1 &></code><code>/dev/null</code>
<code>mkfs -t ext3 ${DiskPart}2 &></code><code>/dev/null</code>
<code>printf</code> <code>"===============Partition is OK=========\n"</code> <code>#以上是分區的腳本</code>
<code>echo</code> <code>-e </code><code>"\033[31m=======Second:Mount the Partition======\033[0m"</code>
<code>[ -d </code><code>/mnt/boot</code> <code>] || </code><code>mkdir</code> <code>-p </code><code>/mnt/boot</code>
<code>[ -d </code><code>/mnt/sysroot</code> <code>] || </code><code>mkdir</code> <code>-p </code><code>/mnt/sysroot</code>
<code>if</code> <code>mount</code> <code>| </code><code>grep</code> <code>"/dev/sdb1"</code> <code>&></code><code>/dev/null</code><code>;</code><code>then</code>
<code> </code><code>echo</code> <code>"/dev/sdb1 is mounted..."</code>
<code> </code><code>mount</code> <code>/dev/sdb1</code> <code>/mnt/boot</code>
<code>if</code> <code>mount</code> <code>| </code><code>grep</code> <code>"/dev/sdb2"</code> <code>&></code><code>/dev/null</code><code>;</code><code>then</code>
<code> </code><code>echo</code> <code>"/dev/sdb2 is mounted...."</code>
<code> </code><code>mount</code> <code>/dev/sdb2</code> <code>/mnt/sysroot</code>
<code>printf</code> <code>"===============Mount is OK=========\n"</code>
<code>echo</code> <code>-e </code><code>"\033[31m=======Third: Create boot partition======\033[0m"</code>
<code>[ -d </code><code>/mnt/boot/grub</code> <code>]|| grub-</code><code>install</code> <code>--root-directory=</code><code>/mnt</code> <code>/dev/sdb</code> <code>&></code><code>/dev/null</code><code>;</code><code>echo</code> <code>"grub is ok"</code>
<code>printf</code> <code>"========Boot partition is OK============\n"</code>
<code>echo</code> <code>-e </code><code>"\033[31m=======Fourth:Copy the kernel and make the kernel image file======\033[0m"</code>
<code>cp</code> <code>/boot/vmlinuz-2</code><code>.6.18-308.el5 </code><code>/mnt/boot/vmlinuz</code>
<code>rm</code> <code>-rf </code><code>/opt/</code><code>*</code>
<code>cd</code> <code>/opt</code>
<code>mkinitrd </code><code>/opt/initrd-</code><code>`</code><code>uname</code> <code>-r`.img `</code><code>uname</code> <code>-r`</code>
<code>zcat </code><code>/opt/initrd-</code><code>`</code><code>uname</code> <code>-r`.img | cpio -</code><code>id</code> <code>&></code><code>/dev/null</code>
<code>rm</code> <code>-rf </code><code>/opt/initrd-</code><code>`</code><code>uname</code> <code>-r`.img</code>
<code>sed</code> <code>-i </code><code>'/resume/s@resume@#resume@g'</code> <code>/opt/init</code> <code>#把resume那行的前面添加#,即注釋掉resume開頭的行</code>
<code>sed</code> <code>-i </code><code>'s/mkrootdev/# &/'</code> <code>/opt/init</code> <code>#先把mkrootdev開頭的行注釋</code>
<code>sed</code> <code>-i </code><code>'/mkrootdev/a\mkrootdev -t ext3 -o defaults,ro /dev/sda2'</code> <code>/opt/init</code> <code>#然後在mkrootdev那行下面添加一行mkrootdev -t ext3 -o defaults,ro /dev/sda2</code>
<code>find</code> <code>. | cpio -H newc --quiet -o |</code><code>gzip</code> <code>-9 > </code><code>/mnt/boot/initrd</code><code>.gz</code>
<code>printf</code> <code>"========Kernel and kernel image file is OK========\n"</code>
<code>echo</code> <code>-e </code><code>"\033[31m=======Fifth:Edit grub configuration file======\033[0m"</code>
<code>cat</code> <code>>> </code><code>/mnt/boot/grub/grub</code><code>.conf <<EOF</code>
<code>default=0</code>
<code>timeout=6</code>
<code>title My Litter Linux (RHEL 5.x)</code>
<code> </code><code>root (hd0,0)</code>
<code> </code><code>kernel </code><code>/vmlinuz</code>
<code> </code><code>initrd </code><code>/initrd</code><code>.gz</code>
<code>printf</code> <code>"=========Grub configuration file is OK========\n"</code>
<code>mkdir</code> <code>-p </code><code>/mnt/sysroot/</code><code>{proc,sys,dev,etc</code><code>/rc</code><code>.d,lib</code><code>/modules</code><code>,bin,sbin,home,var,tmp}</code>
<code>echo</code> <code>-e </code><code>"\033[31m=======Sixth:Copy system running program=====\033[0m"</code>
<code>echo</code> <code>-e </code><code>"\033[31m You can input this command\033[0m"</code>
<code>cat</code> <code><< EOF</code>
<code>init</code>
<code>bash</code>
<code>lsmod</code>
<code>insmod</code>
<code>cp</code>
<code>mv</code>
<code>ls</code>
<code>vim</code>
<code>cat</code>
<code>echo</code> <code>-e </code><code>"\033[31m=======Seventh:Create inittab file and rc.sysinit script file======\033[0m"</code>
<code>cat</code> <code>>> </code><code>/mnt/sysroot/etc/inittab</code> <code><< EOF</code>
<code>id</code><code>:3:initdefault:</code>
<code>si::sysinit:</code><code>/etc/rc</code><code>.d</code><code>/rc</code><code>.sysinit</code>
<code>cat</code> <code>>> </code><code>/mnt/sysroot/etc/rc</code><code>.d</code><code>/rc</code><code>.sysinit <<EOF</code>
<code>echo</code> <code>-e </code><code>"\033[31m Welcome My Little RHEL 5.x\033[0m"</code>
<code>chmod</code> <code>+x </code><code>/mnt/sysroot/etc/rc</code><code>.d</code><code>/rc</code><code>.sysinit</code>
<code>sync</code>
運作腳本的過程
<a href="http://blog.51cto.com/attachment/201308/143833751.png" target="_blank"></a>
<a href="http://blog.51cto.com/attachment/201308/143904618.png" target="_blank"></a>
RHEL 6.x系統的裁剪步驟就較長的描述了,直接寫腳本
<code>1</code>
<code>2</code>
<code>partx -a ${DiskPart}1 $DiskPart</code>
<code>partx -a ${DiskPart}2 $DiskPart</code>
<code>mkfs -t ext4 ${DiskPart}1 &></code><code>/dev/null</code>
<code>mkfs -t ext4 ${DiskPart}2 &></code><code>/dev/null</code>
<code>printf</code> <code>"===============Partition is OK=========\n"</code>
<code>cp</code> <code>/boot/vmlinuz-2</code><code>.6.32-358.el6.x86_64 </code><code>/mnt/boot/vmlinuz</code>
<code>mkinitrd </code><code>/opt/initramfs-</code><code>`</code><code>uname</code> <code>-r`.img `</code><code>uname</code> <code>-r`</code>
<code>cp</code> <code>/opt/initramfs-2</code><code>.6.32-358.el6.x86_64.img </code><code>/mnt/boot/initrd</code><code>.gz</code>
<code>title My Litter Linux (RHEL 6.x)</code>
<code> </code><code>kernel </code><code>/vmlinuz</code> <code>ro root=</code><code>/dev/sda2</code>
<code>echo</code> <code>-e </code><code>"\033[31m Welcome My Little RHEL 6.x\033[0m"</code>
本文轉自 jie783213507 51CTO部落格,原文連結:http://blog.51cto.com/litaotao/1266771,如需轉載請自行聯系原作者