目录
前文回顾:
我们上一章《系统裁剪之旅(1)——虚拟机环境搭建》中详细描述了如何创建了虚拟机,并安装了Centos7操作系统。
本章内容:
对Centos7系统的“根目录”和“boot”目录进行拷贝。
原理解析:
在Linux中,所谓“系统裁剪”或者“系统拷贝”其实都是对文件目录的操作。Centos7中主要设计的目录结构有“boot”和“rootfs”。
boot:一般放在根目录(“/”)下,系统启动时会用到,主要功能是完成系统引导。
rootfs:其实就可以理解为根目录(“/”)下,除了“boot”目录外的其他目录结构和文件。
我们复制系统就只要把这两个目录的结构和里面的文件都原封不动的复制到另一块硬盘上。
操作流程:
- 系统启动后登陆到“root”用户下。
- 在根目录下新建文件夹“mysys”目录。
mkdir /mysys/
配置临时ip地址,具体方法参考:《最小化安装Centos 7快速设置临时IP(无ifconfig)》
- 将syscopy.sh脚本放到“/mysys”目录下,脚本内容如下:
syscopy.sh
#!/bin/sh
unalias cp
rootdir=`pwd`
rm -rf ${rootdir}/centos*
KERNEL_DIR=${rootdir}/kernel
ROOTFS_DIR=${rootdir}/rootfs
if [ -d ${KERNEL_DIR} ]; then
echo "remove kernel dir"
rm -rf ${KERNEL_DIR}
fi
echo "mkdir kernel dir"
mkdir ${KERNEL_DIR}
if [ -d ${ROOTFS_DIR} ]; then
echo "remove rootfs dir"
rm -rf ${ROOTFS_DIR}
fi
echo "mkdir rootfs dir"
mkdir ${ROOTFS_DIR}
rm -rf centos7_*
#-------- reduce /var/lib/rpm/Packages----------
rpm --rebuilddb
echo "--run:yum clean all"
yum clean all
echo "Begin to copy kernel ...."
kernel_version=`uname -r`
cp -cpR /boot/*${kernel_version}* ${KERNEL_DIR}
cp -cpR /boot/grub ${KERNEL_DIR}
mkdir -p ${KERNEL_DIR}/grub2
cp -cpR /boot/grub2/grub.cfg ${KERNEL_DIR}/grub2
echo "Copy kernel finish..."
echo "Begin to copy rootfs..."
cp -cpR /bin ${ROOTFS_DIR}
cp -cpR /dev ${ROOTFS_DIR}
cp -cpR /etc ${ROOTFS_DIR}
cp -cpR /lib ${ROOTFS_DIR}
cp -cpR /lib64 ${ROOTFS_DIR}
cp -cpR /opt ${ROOTFS_DIR}
cp -cpR /root ${ROOTFS_DIR}
cp -cpR /run ${ROOTFS_DIR}
cp -cpR /sbin ${ROOTFS_DIR}
cp -cpR /srv ${ROOTFS_DIR}
cp -cpR /tmp ${ROOTFS_DIR}
cp -cpR /usr ${ROOTFS_DIR}
cp -cpR /var ${ROOTFS_DIR}
mkdir -p ${ROOTFS_DIR}/boot
mkdir -p ${ROOTFS_DIR}/bootloader
mkdir -p ${ROOTFS_DIR}/ftp
mkdir -p ${ROOTFS_DIR}/media
mkdir -p ${ROOTFS_DIR}/proc
mkdir -p ${ROOTFS_DIR}/sys
mkdir -p ${ROOTFS_DIR}/tar
mkdir -p ${ROOTFS_DIR}/system
mkdir -p ${ROOTFS_DIR}/home
rm -rf ${ROOTFS_DIR}/usr/share/man/*
rm -rf ${ROOTFS_DIR}/usr/share/doc/*
rm -rf ${ROOTFS_DIR}/usr/share/locale/*
cp -cpR /usr/share/locale/zh_[C]* ${ROOTFS_DIR}/usr/share/locale/
cp -cpR /usr/share/locale/zh ${ROOTFS_DIR}/usr/share/locale/
cp -cpR /usr/share/locale/en ${ROOTFS_DIR}/usr/share/locale/
cp -cpR /usr/share/locale/en_US ${ROOTFS_DIR}/usr/share/locale/
#--------rm yum(yum can use)-----------
rm -rf ${ROOTFS_DIR}/var/lib/yum/yumdb/*
rm -rf ${ROOTFS_DIR}/var/lib/yum/history*
echo "--------all is finish-------------"
echo "----------------------------"
du -sh ${rootdir}/
du -sh ${rootdir}/*
echo "----------------------------"
echo
- 到“/mysys/”目录下执行syscompy.sh脚本
cd /mysys
bash ./syscopy.sh
脚本执行完毕后再“/mysys/”目录下会出现如下文件:
其中“boot”和“rootfs”分别对用“引导”与“文件系统”。
- 对“./boot/grub2/grub.cfg”进行编辑:
vi ./boot/grub2/grub.cfg
第88行附近,改成下面的样子。主要是把“root”指向的磁盘位置改成相对路径的盘符,这里用“/dev/sda3”是因为后续我们在新虚拟机上挂载的硬盘打概率会是“sda”,而按照我们现在的分区方式,“rootfs”就会是“/dev/sda3”。
### BEGIN /etc/grub.d/10_linux ###
menuentry 'CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-1160.el7.x86_64-advanced-81bc4148-6cad-4881-b52f-2606f63c95f3' {
load_video
set gfxpayload=keep
insmod gzio
insmod part_msdos
insmod xfs
set root='hd0,msdos1'
#if [ x$feature_platform_search_hint = xy ]; then
# search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1' cc33a24e-4219-4265-881c-0bb799c045b3
#else
# search --no-floppy --fs-uuid --set=root cc33a24e-4219-4265-881c-0bb799c045b3
#fi
#linux16 /vmlinuz-3.10.0-1160.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=zh_CN.UTF-8
linux16 /vmlinuz-3.10.0-1160.el7.x86_64 root=/dev/sda3 rhgb quiet LANG=zh_CN.UTF-8
initrd16 /initramfs-3.10.0-1160.el7.x86_64.img
}
- 对“./rootfs/etc/fstab”进行编辑:
vi ./rootfs/etc/fstab
改成如下样子:
#
# /etc/fstab
# Created by anaconda on Thu Sep 16 00:03:17 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/sda3 / xfs defaults 0 0
/dev/sda1 /boot xfs defaults 0 0
/dev/sda2 swap swap defaults 0 0
- 将“boot”和“rootfs”打成压缩包:
cd ./kernel/ tar -zcvf centos7_boot.tar.gz * mv centos7_boot.tar.gz ../ cd ../rootfs tar -zcvf centos7_rootfs.tar.gz * mv centos7_rootfs.tar.gz ../ cd ..
压缩后的结果如下:
下一章:系统裁剪之旅(3)——克隆系统