写在前面,这篇博文只能让裁剪的系统能够使用简单的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,如需转载请自行联系原作者