裁剪RHEL 5.x和RHEL 6.x

写在前面,这篇博文只能让裁剪的系统能够使用简单的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--->

115110841.png

115128131.png

添加磁盘后重启电脑,然后对磁盘分区。

133454638.png

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文件

133513464.png

3)copy内核文件和生成内核镜像文件

133536175.png

133603189.png

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"

脚本的内容

140033818.png

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

把系统关机,然后把新添加的硬盘作为一个裁剪的系统看能否启动


在虚拟机里面新建一个虚拟机,安装之前裁剪的系统,看是否能正常运行

144826572.png


144844691.png

144935640.png

144953479.png

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

运行脚本的过程

143833751.png

143904618.png


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









本文转自 jie783213507 51CTO博客,原文链接:http://blog.51cto.com/litaotao/1266771,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值