centos6系统裁剪
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了centos6系统裁剪相关的知识,希望对你有一定的参考价值。
参考技术A1、系统裁剪要求:有GRUB引导系统,并且使用init脚本实现网卡驱动的装载,以及IP地址的配置,添加tserver服务,并在系统启动时启动此服务并显示。
2、操作环境的目标
(1)在virtual box中操作,系统为Centos6.5
(2)基于宿主机(Host)制作一个简单可启动的Linux
3、流程概括
(1)为虚拟机添加一块新硬盘,并为其分区,安装GRUB
(2)复制内核文件(vmllinuz)和initrd文件至新硬盘中。
(3)移植bash,网络相关命令ifconfig、ip、ping命令,文件列表命令ls,服务管理命令chkconfig,模块装载卸载命令insmod、rmmod,挂载卸载命令mount、umount,文件查看命令cat至目标主机(Target)的/文件系统中。
(4)为grub提供配置文件。
(5)为目标主机配置/sbin/init文件启动网络服务和其他服务。 (6)将目标主机的硬盘装载在其他虚拟机上。
4、添加新硬盘并分区、格式化和挂载
(1)在虚拟机上添加一块1G的硬盘,名为TinyLinux。
裁剪过程 :
(1)内核文件为宿主机中的/boot/vmlinuz-VERSION
(2)initrd文件为宿主机的/boot/initramfs-VERSION.img
根文件系统一般包含的目录: etc/rc.d,usr,var,proc,sys,dev,lib,lib64,bin,sbin,boot,srv,mnt,media,root
(1)移植的时候需要把命令的可执行文件以及所依赖的库文件复制,命令才能被执行。 (2)可执行文件位于/bin目录下,库文件在/lib目录 或者/lib64目录下。
(3)用which COMMAND 命令可查看命令的执行文件在哪个位置 用 ldd which COMMAND 命令可查看命令所依赖的库文件在哪个位置。
(4)用一个脚本实现将命令的可执行文件以及其所依赖的库文件复制到目标主机根文件系统中
执行脚本,复制命令:
字段解释:
default =# :指定默认启动的内核或者OS(Operating System)
timeout=# :等待用户选择要启动的内核或OS的时长,单位为秒。
splashimage=/path/to/splashimage_file :指定使用的背景图片
hiddenmenu:隐藏菜单
tittle
先umount 分区,在关闭虚拟机centos6
启动Tinylinux,若有grub引导并出现如下界面,并且命令正确,证明TinyLinux小系统能成功运行。
这个时候,我们TinyLinux系统只能执行简单的命令,也没有网络,文件系统也没有挂载。接下来,我们复制网卡,挂载文件系统。
先把TinyLinux系统关机,启动centos6
网卡模块所在路径: /lib/modules/2.6.32-431.el6.x86_64/kernel/drivers/net/e1000/e1000.ko
创建/mnt/sysroot/lib/modules目录
复制网卡模块至/mnt/sysroot/lib/modules目录下
编辑/mnt/sysroot/sbin/init文件
编辑/mnt/boot/grub/grub.conf文件,将init指定为sbin目录下的init
卸载硬盘FS,并关机
如果目标主机启动时候显示绿色OK字样,证明网卡模块已经被装载。
我们继续检查一下,ip , 文件系统
手工挂载一下
ip设置,如下
此时,ctrl+c按键并不能中断ping命令,因为该小系统并没有配置ctrl+c热键。 建议使用以下命令限定ping次数和时间检测:
至此,centos6系统裁剪已经完成。
系统裁剪centos6.8具有网络功能
安装环境:centos6.8,kernel:2.6.32-642.4.2.el6.x86_64
目标主机:最小化的自制的linux主机
宿主机:在那台linux主机中制作的自制最小化的linux主机,以下皆在宿主机中进行
新添加的磁盘配置信息如下:
1、在虚拟机中新添加一个硬盘,并且记住该硬盘存放位置,以便待会使用,分两个区,分别用于boot和/
# echo -n"
n
p
1
+500M
n
p
2
+5G
w"|fdisk /dev/sdb
mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb2
2、挂载分区,挂载位置没有应先创建
# mount /dev/sdb1 /mnt/boot
# mount /dev/sdb2 /mnt/sysroot
3、复制linux内核,和initramfs.img至/mnt/boot/下
# cp /boot/vmlinuz-`uname -r`/mnt/boot/vmlinuz
# cp /boot/initramfs-`uname -r`.img /mnt/boot/initramfs.img
4、安装grub至/dev/sdb中
# grub-install --root-directory=/mnt /dev/sdb
注:因为这里是挂载至/mnt目录下,所以将mnt当成grub的根
5、复制一些命令至裁剪的系统中,通过bincp.sh脚本
# bash /root/scripts/bincp.sh
bash
mount
insmod
cat
vim
ls
cd
ifconfig
mkdir
touch
umount
ping
tree
quit
6、将网卡驱动复制过去
查看所有驱动,e1000则是网卡驱动
# lsmod
查看e1000驱动的详细信息,查看该驱动文件位置
# modinfo e1000
# mkdir /mnt/sysroot/lib/modules/ -pv
# cp /lib/modules/`uname -r`/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib/modules/
注:lib/modules文件夹没有应事先创建
7、创建目标主机根下相应目录
# mkdir -pv /mnt/sysroot/{etc,etc/rc.d,boot,dev,bin,lib,sbin,home,root,var,usr,tmp,mnt,media,proc,sys}
8、为目标主机建立grub配置文件,让系统能够引导
# vim /mnt/boot/grub/grub.conf
default=0
timeout=3
title siyu
root (hd0,0)
kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/sbin/init
initrd initramfs.img
注:这里initrd指令和kernel的值应该与第4步的文件名相同,因为这里init值是/sbin/init,所以需要创建/sbin/init文件并添加相应系统初始化命令,如果不想使用init文件,则改为init=/bin/bash即可,但无法实现网络功能
9、初始化系统文件init,并且赋予执行权限
# vim /mnt/sysroot/sbin/init
#!/bin/bash
echo -e "\t \033[34m linux \033[3m"
mount -n -t proc proc /proc
mount -n -t sysfs sysfs /sys
insmod /lib/modules/e1000.ko
ifconfig eth0 192.168.1.4/24
ifconfig lo 127.0.0.0/8
mount -n -t remount,rw /dev/sda2 /
/bin/bash
# chmod +x /mnt/sysroot/sbin/init
10、将sdb硬盘移植进入别的虚拟机中测试
新建一个虚拟机,结果如下,磁盘文件要与host主机新添加的磁盘相同
11、使用init配置文件并且网络配置成功
使用脚本一键执行
这里使用的宿主机根目录为sysroot,挂载至mnt下;boot分区为boot,挂载至/mnt/boot
# vim createsys.sh
#!/bin/bash
disk() {
echo -n ‘
n
p
1
+500M
n
p
2
+5G
wq‘| fdisk "$1"
sleep 3
kpartx -l "$1"
kpartx -af "$1"
partx -a "$1"
dmsetup remove_all
mke2fs -t ext4 "$1"1
mke2fs -t ext4 "$1"2
}
mounts() {
[ -d /mnt/boot/ ] || mkdir /mnt/boot
[ -d /mnt/sysroot/ ] || mkdir /mnt/sysroot
mount "$disk"1 /mnt/boot
mount "$disk"2 /mnt/sysroot
}
cpkernel() {
cp /boot/vmlinuz-`uname -r` /mnt/boot/vmlinuz
cp /boot/initramfs-`uname -r`.img /mnt/boot/initramfs.img
grub-install --root-directory=/mnt /dev/sdb
}
cpcmd() {
bash /root/scripts/bincp.sh #bincp.sh In the /root/scripts/ Next
}
cpnetwork() {
[ -d /mnt/sysroot/lib/modules/ ] || mkdir /mnt/sysroot/lib/modules/ -pv
cp /lib/modules/`uname -r`/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib/modules/e1000.ko
}
mkdirs() {
mkdir -pv /mnt/sysroot/{etc,etc/rc.d,boot,dev,bin,lib,sbin,home,root,var,usr,tmp,mnt,media,proc,sys}
}
creategrub() {
echo "
default=0
timeout=3
title siyu
root (hd0,0)
kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/sbin/init
initrd /initramfs.img" >> /mnt/boot/grub/grub.conf
}
inits(){
cat >> /mnt/sysroot/sbin/init << EOF
#!/bin/bash
echo -e "\t \033[34m linux \033[0m"
mount -n -t proc proc /proc
mount -n -t sysfs sysfs /sys
insmod /lib/modules/e1000.ko
ifconfig eth0 $1
ifconfig lo 127.0.0.0/8
mount -n -t remount,rw /dev/sda2 /
/bin/bash
EOF
chmod +x /mnt/sysroot/sbin/init
}
read -p "input a disk : " disk
disk "$disk"
mounts
cpkernel
cpcmd
mkdirs
cpnetwork
creategrub
read -p "input a ip/netmask: " network
inits "$network"
bincp脚本如下:
#!/bin/bash
#copy command and need so ---> /mnt/sysroot
target=/mnt/sysroot
main() {
if which $1 &> /dev/null ; then
echo "command such "
else
echo "no such command"
return 4
fi
}
bincommand() {
cmdpath=`which --skip-alias $1`
dirpath=`dirname $cmdpath`
[ -d $target ] || mkdir -p $target
[ -d ${target}${dirpath} ] || mkdir -p ${target}${dirpath}
[ -f ${target}${cmdpath} ] || cp $cmdpath ${target}${dirpath}
}
binlib() {
for i in `ldd $cmdpath | grep -o "/[^[:space:]]\{1,\}"` ; do
libdir=`dirname $i`
[ -d ${target}${libdir} ] || mkdir -p ${target}${libdir}
[ -f ${target}${i} ] || cp $i ${target}${libdir}
done
}
while true ; do
read -p "input a command: " cmd
if [[ "$cmd" == ‘quit‘ ]]; then
echo "quitting"
exit 0
fi
if [ $? -ne 0 ] ; then
echo "worng command"
continue
fi
main $cmd
bincommand $cmd
binlib
done
本文出自 “grep及正则详解” 博客,请务必保留此出处http://tingfengsiyu.blog.51cto.com/10042389/1877620
以上是关于centos6系统裁剪的主要内容,如果未能解决你的问题,请参考以下文章
全志Tina Linux 系统裁剪 boot0裁剪 uboot裁剪 内核裁剪 文件系统裁剪 C库裁剪 文件系统压缩
全志Tina Linux 系统裁剪 boot0裁剪 uboot裁剪 内核裁剪 文件系统裁剪 C库裁剪 文件系统压缩