写在前面,这篇博文只能让裁剪的系统能够使用简单的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--->
添加磁盘后重启电脑,然后对磁盘分区。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
[root@localhost ~]
# fdisk /dev/sdb
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 or +size or +sizeM or +sizeK (1-2610, default 2610): +30M
Command (m
for
help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (6-2610, default 6):
Using default value 6
Last cylinder or +size or +sizeM or +sizeK (6-2610, default 2610): +200M
Command (m
for
help): w
[root@localhost ~]
#partprobe
[root@localhost ~]
#mkfs -t ext3 /dev/sdb1 &>/dev/null
[root@localhost ~]
#mkfs -t ext3 /dev/sdb2 &>/dev/null
|
2)为新添加的磁盘的第一个分区创建grub文件
3)copy内核文件和生成内核镜像文件
1
2
3
|
[root@localhost opt]
# pwd
/opt
[root@localhost opt]
#find . | cpio -H newc --quiet -o |gzip -9 > /mnt/boot/initrd.gz #把opt目录的所有文件利用cpio打包,然后用gzip命令压缩后,输出到/mnt/boot目录下,文件名为initrd.gz
|
4)复制init和bash等其它命令以及命令的库文件到新添加硬盘的sysroot目录
思路:复制命令时,命令如果要执行,需要依赖该命令所需的库文件,所有在复制命令时,必须把命令依赖的库文件也复制到相应的目录,init的命令位于/sbin/init,库文件位于/lib64(系统为x86_64)下,要将/sbin/init 复制到新硬盘的/mnt/sysroot/sbin目录下,init所依赖的库,也应该复制/mnt/sysroot/lib64目录下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#!/bin/bash
DestDir=
/mnt/sysroot
bincp() {
[ -d ${DestDir}${CmdDir} ] ||
mkdir
-p ${DestDir}${CmdDir}
[ ! -f ${DestDir}${Cmd} ] &&
cp
$Cmd ${DestDir}${Cmd} &&
echo
"copy $Cmd command to $DestDir finished."
}
libcp() {
for
Lib
in
`ldd $Cmd |
grep
-o
"[^[:space:]]*/lib[^[:space:]]*"
`;
do
LibDir=${Lib%/*}
[ -d ${DestDir}${LibDir} ] ||
mkdir
-p ${DestDir}${LibDir}
[ ! -f ${DestDir}${Lib} ] &&
cp
$Lib ${DestDir}${Lib} &&
echo
"copy $Lib to $DestDir finished."
done
}
read
-p
"input a command:"
Cmd
while
[ $Cmd !=
'q'
-a $Cmd !=
'Q'
];
do
Cmd=`
which
$Cmd |
grep
-
v
"alias"
|
sed
's@[[:space:]]@@g'
`
CmdDir=${Cmd%/*}
bincp
libcp
read
-p
"input a command:"
Cmd
done
printf
"=======Copy command is OK=========\n"
|
脚本的内容
5)建立系统所需的文件和脚本 grub配置文件、inittab文件和rc.sysinit脚本文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#grub配置文件
cat >> /mnt/boot/grub/grub.conf <<EOF
default
=
0
timeout=
6
title My Litter Linux (RHEL
5
.x)
root (hd0,
0
)
kernel /vmlinuz
initrd /initrd.gz
EOF
#inittab文件
cat >> /mnt/sysroot/etc/inittab << EOF
id:
3
:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
EOF
#rc.sysinit脚本文件,/bin/bash,表示开机自动运行bash,生成一个bash环境
cat >> /mnt/sysroot/etc/rc.d/rc.sysinit <<EOF
#!/bin/bash
echo -e
"\033[31m Welcome My Little RHEL 5.x\033[0m"
/bin/bash
EOF
chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit
|
把系统关机,然后把新添加的硬盘作为一个裁剪的系统看能否启动
在虚拟机里面新建一个虚拟机,安装之前裁剪的系统,看是否能正常运行
RHEL 5.x的裁剪的脚本,该脚本能自动化的完成上述的操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
|
#!/bin/bash
echo
-e
"\033[31m=======Frist:Formatting a disk partition======\033[0m"
echo
"Inital a disk..."
echo
-e
"\033[31m Warning:\033[0m"
fdisk
-l 2>
/dev/null
|
grep
-o
"^Disk /dev/[sh]d[a-z]"
read
-p
"Pls choice a disk:"
DiskPart
if
[
"$DiskPart"
==
'quit'
];
then
echo
"you choice quit."
exit
3
fi
until
fdisk
-l 2>
/dev/null
|
grep
-o
"^Disk /dev/[sh]d[a-z]"
|
grep
"^Disk $DiskPart"
&>
/dev/null
;
do
read
-p
"you choice is wrong,choice again:"
DiskPart
done
read
-p
"Your choice will destory all data,continue:"
Choice
until
[ $Choice ==
'y'
-o $Choice ==
'n'
];
do
read
-p
"Your choice will destory all data,continue:"
Choice
done
if
[ $Choice ==
'n'
];
then
echo
"you Choice quit."
exit
4
else
dd
if
=
/dev/zero
of=$DiskPart bs=512 count=1 &>
/dev/null
sync
sync
sleep
3
echo
'n
p
1
#后面有一行空格
+30M
n
p
2
#后面有一行空格
+200M
w'|
fdisk
$DiskPart &>
/dev/null
fi
partprobe
mkfs -t ext3 ${DiskPart}1 &>
/dev/null
mkfs -t ext3 ${DiskPart}2 &>
/dev/null
printf
"===============Partition is OK=========\n"
#以上是分区的脚本
echo
-e
"\033[31m=======Second:Mount the Partition======\033[0m"
[ -d
/mnt/boot
] ||
mkdir
-p
/mnt/boot
[ -d
/mnt/sysroot
] ||
mkdir
-p
/mnt/sysroot
if
mount
|
grep
"/dev/sdb1"
&>
/dev/null
;
then
echo
"/dev/sdb1 is mounted..."
else
mount
/dev/sdb1
/mnt/boot
fi
if
mount
|
grep
"/dev/sdb2"
&>
/dev/null
;
then
echo
"/dev/sdb2 is mounted...."
else
mount
/dev/sdb2
/mnt/sysroot
fi
printf
"===============Mount is OK=========\n"
echo
-e
"\033[31m=======Third: Create boot partition======\033[0m"
[ -d
/mnt/boot/grub
]|| grub-
install
--root-directory=
/mnt
/dev/sdb
&>
/dev/null
;
echo
"grub is ok"
printf
"========Boot partition is OK============\n"
echo
-e
"\033[31m=======Fourth:Copy the kernel and make the kernel image file======\033[0m"
cp
/boot/vmlinuz-2
.6.18-308.el5
/mnt/boot/vmlinuz
rm
-rf
/opt/
*
cd
/opt
mkinitrd
/opt/initrd-
`
uname
-r`.img `
uname
-r`
zcat
/opt/initrd-
`
uname
-r`.img | cpio -
id
&>
/dev/null
rm
-rf
/opt/initrd-
`
uname
-r`.img
sed
-i
'/resume/s@resume@#resume@g'
/opt/init
#把resume那行的前面添加#,即注释掉resume开头的行
sed
-i
's/mkrootdev/# &/'
/opt/init
#先把mkrootdev开头的行注释
sed
-i
'/mkrootdev/a\mkrootdev -t ext3 -o defaults,ro /dev/sda2'
/opt/init
#然后在mkrootdev那行下面添加一行mkrootdev -t ext3 -o defaults,ro /dev/sda2
find
. | cpio -H newc --quiet -o |
gzip
-9 >
/mnt/boot/initrd
.gz
printf
"========Kernel and kernel image file is OK========\n"
echo
-e
"\033[31m=======Fifth:Edit grub configuration file======\033[0m"
cat
>>
/mnt/boot/grub/grub
.conf <<EOF
default=0
timeout=6
title My Litter Linux (RHEL 5.x)
root (hd0,0)
kernel
/vmlinuz
initrd
/initrd
.gz
EOF
printf
"=========Grub configuration file is OK========\n"
mkdir
-p
/mnt/sysroot/
{proc,sys,dev,etc
/rc
.d,lib
/modules
,bin,sbin,home,var,tmp}
echo
-e
"\033[31m=======Sixth:Copy system running program=====\033[0m"
echo
-e
"\033[31m You can input this command\033[0m"
cat
<< EOF
init
bash
lsmod
insmod
cp
mv
ls
vim
cat
EOF
DestDir=
/mnt/sysroot
bincp() {
[ -d ${DestDir}${CmdDir} ] ||
mkdir
-p ${DestDir}${CmdDir}
[ ! -f ${DestDir}${Cmd} ] &&
cp
$Cmd ${DestDir}${Cmd} &&
echo
"copy $Cmd command to $DestDir finished."
}
libcp() {
for
Lib
in
`ldd $Cmd |
grep
-o
"[^[:space:]]*/lib[^[:space:]]*"
`;
do
LibDir=${Lib%/*}
[ -d ${DestDir}${LibDir} ] ||
mkdir
-p ${DestDir}${LibDir}
[ ! -f ${DestDir}${Lib} ] &&
cp
$Lib ${DestDir}${Lib} &&
echo
"copy $Lib to $DestDir finished."
done
}
read
-p
"input a command:"
Cmd
while
[ $Cmd !=
'q'
-a $Cmd !=
'Q'
];
do
Cmd=`
which
$Cmd |
grep
-
v
"alias"
|
sed
's@[[:space:]]@@g'
`
CmdDir=${Cmd%/*}
bincp
libcp
read
-p
"input a command:"
Cmd
done
printf
"=======Copy command is OK=========\n"
echo
-e
"\033[31m=======Seventh:Create inittab file and rc.sysinit script file======\033[0m"
cat
>>
/mnt/sysroot/etc/inittab
<< EOF
id
:3:initdefault:
si::sysinit:
/etc/rc
.d
/rc
.sysinit
EOF
cat
>>
/mnt/sysroot/etc/rc
.d
/rc
.sysinit <<EOF
#!/bin/bash
echo
-e
"\033[31m Welcome My Little RHEL 5.x\033[0m"
/bin/bash
EOF
chmod
+x
/mnt/sysroot/etc/rc
.d
/rc
.sysinit
sync
sync
sync
sync
|
运行脚本的过程
RHEL 6.x系统的裁剪步骤就详细描述了,直接写脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
|
#!/bin/bash
echo
-e
"\033[31m=======Frist:Formatting a disk partition======\033[0m"
echo
"Inital a disk..."
echo
-e
"\033[31m Warning:\033[0m"
fdisk
-l 2>
/dev/null
|
grep
-o
"^Disk /dev/[sh]d[a-z]"
read
-p
"Pls choice a disk:"
DiskPart
if
[
"$DiskPart"
==
'quit'
];
then
echo
"you choice quit."
exit
3
fi
until
fdisk
-l 2>
/dev/null
|
grep
-o
"^Disk /dev/[sh]d[a-z]"
|
grep
"^Disk $DiskPart"
&>
/dev/null
;
do
read
-p
"you choice is wrong,choice again:"
DiskPart
done
read
-p
"Your choice will destory all data,continue:"
Choice
until
[ $Choice ==
'y'
-o $Choice ==
'n'
];
do
read
-p
"Your choice will destory all data,continue:"
Choice
done
if
[ $Choice ==
'n'
];
then
echo
"you Choice quit."
exit
4
else
dd
if
=
/dev/zero
of=$DiskPart bs=512 count=1 &>
/dev/null
sync
sync
sleep
3
echo
'n
p
1
+30M
n
p
2
+200M
w'|
fdisk
$DiskPart &>
/dev/null
fi
partx -a ${DiskPart}1 $DiskPart
partx -a ${DiskPart}2 $DiskPart
mkfs -t ext4 ${DiskPart}1 &>
/dev/null
mkfs -t ext4 ${DiskPart}2 &>
/dev/null
printf
"===============Partition is OK=========\n"
echo
-e
"\033[31m=======Second:Mount the Partition======\033[0m"
[ -d
/mnt/boot
] ||
mkdir
-p
/mnt/boot
[ -d
/mnt/sysroot
] ||
mkdir
-p
/mnt/sysroot
if
mount
|
grep
"/dev/sdb1"
&>
/dev/null
;
then
echo
"/dev/sdb1 is mounted..."
else
mount
/dev/sdb1
/mnt/boot
fi
if
mount
|
grep
"/dev/sdb2"
&>
/dev/null
;
then
echo
"/dev/sdb2 is mounted...."
else
mount
/dev/sdb2
/mnt/sysroot
fi
printf
"===============Mount is OK=========\n"
echo
-e
"\033[31m=======Third: Create boot partition======\033[0m"
[ -d
/mnt/boot/grub
]|| grub-
install
--root-directory=
/mnt
/dev/sdb
&>
/dev/null
;
echo
"grub is ok"
printf
"========Boot partition is OK============\n"
echo
-e
"\033[31m=======Fourth:Copy the kernel and make the kernel image file======\033[0m"
cp
/boot/vmlinuz-2
.6.32-358.el6.x86_64
/mnt/boot/vmlinuz
mkinitrd
/opt/initramfs-
`
uname
-r`.img `
uname
-r`
cp
/opt/initramfs-2
.6.32-358.el6.x86_64.img
/mnt/boot/initrd
.gz
printf
"========Kernel and kernel image file is OK========\n"
echo
-e
"\033[31m=======Fifth:Edit grub configuration file======\033[0m"
cat
>>
/mnt/boot/grub/grub
.conf <<EOF
default=0
timeout=6
title My Litter Linux (RHEL 6.x)
root (hd0,0)
kernel
/vmlinuz
ro root=
/dev/sda2
initrd
/initrd
.gz
EOF
printf
"=========Grub configuration file is OK========\n"
mkdir
-p
/mnt/sysroot/
{proc,sys,dev,etc
/rc
.d,lib
/modules
,bin,sbin,home,var,tmp}
echo
-e
"\033[31m=======Sixth:Copy system running program=====\033[0m"
echo
-e
"\033[31m You can input this command\033[0m"
cat
<< EOF
init
bash
lsmod
insmod
cp
mv
ls
vim
cat
EOF
DestDir=
/mnt/sysroot
bincp() {
[ -d ${DestDir}${CmdDir} ] ||
mkdir
-p ${DestDir}${CmdDir}
[ ! -f ${DestDir}${Cmd} ] &&
cp
$Cmd ${DestDir}${Cmd} &&
echo
"copy $Cmd command to $DestDir finished."
}
libcp() {
for
Lib
in
`ldd $Cmd |
grep
-o
"[^[:space:]]*/lib[^[:space:]]*"
`;
do
LibDir=${Lib%/*}
[ -d ${DestDir}${LibDir} ] ||
mkdir
-p ${DestDir}${LibDir}
[ ! -f ${DestDir}${Lib} ] &&
cp
$Lib ${DestDir}${Lib} &&
echo
"copy $Lib to $DestDir finished."
done
}
read
-p
"input a command:"
Cmd
while
[ $Cmd !=
'q'
-a $Cmd !=
'Q'
];
do
Cmd=`
which
$Cmd |
grep
-
v
"alias"
|
sed
's@[[:space:]]@@g'
`
CmdDir=${Cmd%/*}
bincp
libcp
read
-p
"input a command:"
Cmd
done
printf
"=======Copy command is OK=========\n"
echo
-e
"\033[31m=======Seventh:Create inittab file and rc.sysinit script file======\033[0m"
cat
>>
/mnt/sysroot/etc/inittab
<< EOF
id
:3:initdefault:
EOF
cat
>>
/mnt/sysroot/etc/rc
.d
/rc
.sysinit <<EOF
#!/bin/bash
echo
-e
"\033[31m Welcome My Little RHEL 6.x\033[0m"
/bin/bash
EOF
chmod
+x
/mnt/sysroot/etc/rc
.d
/rc
.sysinit
sync
sync
sync
sync
|