背景
目前网络上关于定制镜像的说明很分散,需要搜寻很多文章才能完成镜像的定制任务。所以我尝试提供一个全面而系统的指南,遵循本指南,用户可以方便的完成镜像的定制。
实施步骤
一、环境配置
1、准备软件
mac pro、VmWare fusion、CentOS-7-x86_64-DVD-1708.iso、CentOS-7-x86_64-GenericCloud-1708-20180123.qcow2
2、安装嵌套CentOs环境
由于MacOs不支持Kvm,故需要在嵌套的操作系统中安装云镜像需要的软件,使用Fusion很容易在MacOs中虚拟出一个CentOs的环境。
3、修改嵌套操作系统配置
在centos关闭的情况下打开虚拟机“处理器和内存”配置,选择“高级配置”,选中“在此虚拟机中启用虚拟化管理程序”和“在此虚拟机中启用代码分析应用程序”,如无这步操作,则在启动virt-manager时会报:“
virt-manager 报 WARNING : KVM不可用.这可能是因为没有安装KVM软件包,或者没有载入KVM内核模块.您的虚拟机可能性很差。”的错误,启动虚拟机。以下操作如无特殊说明都是在嵌套操作系统中执行。
4、安装依赖
yum install qemu-kvm qemu-img qemu-kvm-tools qemu-kvm-common yum install libvirt-admin libvirt-client libvirt-daemon libvirt-devel libvirt yum install libguestfs libguestfs-tools libguestfs-bash-completion
5、编译nbd内核模块(如不使用“nbd挂载方式修改镜像”则不需要安装此模块)
执行命令,出现以下报错时,说明没有nbd模块,需要自己手动安装
执行下面的命令安装hbd模块
[@xx] # cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [@xx] # uname -a Linux localhost 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux [] # uname -r 3.10.0-693.el7.x86_64
安装kernel组件
[@xx] sudo yum install kernel-devel kernel-headers
编译安装hbd组件
# 下载对应的内核源码包 [@xx] # wget http://vault.centos.org/7.4.1708/os/Source/SPackages/kernel-3.10.0-693.el7.src.rpm [@xx] # rpm -ihv kernel-3.10.0-693.el7.src.rpm [@xx] # cd /root/rpmbuild/SOURCES/ [@xx] # tar Jxvf linux-3.10.0-123.el7.tar.xz -C /usr/src/kernels/ [@xx] # cd /usr/src/kernels/ # 配置源码 [@xx] # mv $(uname -r) $(uname -r)-old [@xx] # mv linux-3.10.0-693.el7 $(uname -r) # 编译安装 [@xx 3.10.0-693.el7.x86_64] # cd $(uname -r) [@xx 3.10.0-693.el7.x86_64] # make mrproper [@xx 3.10.0-693.el7.x86_64] # cp ../$(uname -r)-old/Module.symvers ./ [@xx 3.10.0-693.el7.x86_64] # cp /boot/config-$(uname -r) ./.config [@xx 3.10.0-693.el7.x86_64] # make oldconfig [@xx 3.10.0-693.el7.x86_64] # make prepare [@xx 3.10.0-693.el7.x86_64] # make scripts [@xx 3.10.0-693.el7.x86_64] # make CONFIG_BLK_DEV_NBD=m M=drivers/block [@xx 3.10.0-693.el7.x86_64] # cp drivers/block/nbd.ko /lib/modules/$(uname -r)/kernel/drivers/block/ [@xx 3.10.0-693.el7.x86_64] # depmod -a # 查看nbd模块 [@xx 3.10.0-693.el7.x86_64]$ modinfo nbd filename: /lib/modules/3.10.0-693.el7.x86_64/kernel/drivers/block/nbd.ko license: GPL description: Network Block Device rhelversion: 7.4 srcversion: EDE909A294AC5FE08E81957 depends: vermagic: 3.10.0 SMP mod_unload modversions parm: nbds_max:number of network block devices to initialize (default: 16) (int) parm: max_part:number of partitions per device (default: 0) (int) parm: debugflags:flags for controlling debug output (int)
编译安装时的错误处理
阶段:make CONFIG_BLK_DEV_NBD=m M=drivers/block
drivers/block/nbd.c: 在函数‘__nbd_ioctl’中: drivers/block/nbd.c:619:19: 错误:‘REQ_TYPE_SPECIAL’未声明(在此函数内第一次使用) sreq.cmd_type = REQ_TYPE_SPECIAL; ^ drivers/block/nbd.c:619:19: 附注:每个未声明的标识符在其出现的函数内只报告一次 make[1]: *** [drivers/block/nbd.o] 错误 1 make: *** [_module_drivers/block] 错误 2
处理:
[@xx 3.10.0-693.el7.x86_64] # vim include/linux/blkdev.h # 由代码可知 REQ_TYPE_SPECIAL = 7 /* * request command types */ enum rq_cmd_type_bits { REQ_TYPE_FS = 1, /* fs request */ REQ_TYPE_BLOCK_PC, /* scsi command */ REQ_TYPE_SENSE, /* sense request */ REQ_TYPE_PM_SUSPEND, /* suspend request */ REQ_TYPE_PM_RESUME, /* resume request */ REQ_TYPE_PM_SHUTDOWN, /* shutdown request */ #ifdef __GENKSYMS__ REQ_TYPE_SPECIAL, /* driver defined type */ #else REQ_TYPE_DRV_PRIV, /* driver defined type */ #endif /* * for ATA/ATAPI devices. this really doesn">cmd[0] with the range of driver * private REQ_LB opcodes to differentiate what type of request this is */ REQ_TYPE_ATA_TASKFILE, REQ_TYPE_ATA_PC, }; # 修改nbd.c文件 [@xx 3.10.0-693.el7.x86_64] # vim drivers/block/nbd.c # sreq.cmd_type = REQ_TYPE_SPECIAL; sreq.cmd_type = 7; # 重新执行命令 [@xx 3.10.0-693.el7.x86_64] # make CONFIG_BLK_DEV_NBD=m M=drivers/block
二、设置镜像共享
设置嵌套虚拟机文件夹共享
qcow2文件放置在mac本地文件夹中,嵌套虚拟机通过文件共享的方式使用qcow2文件。需要注意的是qcow2文件权限需要在macos中设置为可读写,否则在嵌套虚拟机中无法更新配置。
[mac@] # chmod 755 ./CentOS-7-x86_64-GenericCloud-1708-20180123.qcow2
嵌套虚拟机中,需要要关闭SeLinux否则同样无法更新镜像内容
sudo /usr/sbin/setenforce 0
三、guestfish工具使用
1、示例程序:获取镜像ip地址
guestfish --rw -a ./CentOS-7-x86_64-GenericCloud-1708-20180123.qcow2 # run # list-filesystems /dev/sda1: xfs # mount /dev/sda1 / # vi /var/log/cloud-init.log
2、示例程序:配置用户访问权限
guestfish --rw -a ./CentOS-7-x86_64-GenericCloud-1708-20180123.qcow2 # run # list-filesystems /dev/sda1: xfs # mount /dev/sda1 / # mkdir /home/dc2-user/.ssh # 注意guestfish与shell的区别,权限位是四位 # chown 1001 1001 /home/dc2-user/.ssh # chmod 0700 /home/dc2-user/.ssh # touch /home/dc2-user/.ssh/authorized_keys # chmod 0600 /home/dc2-user/.ssh/authorized_keys # chown 1001 1001 /home/dc2-user/.ssh/authorized_keys # ll /home/dc2-user/.ssh/authorized_keys -rw------- 1 1001 1001 0 Mar 1 10:05 /sysroot/home/dc2-user/.ssh/authorized_keys # vi /home/dc2-user/.ssh/authorized_keys # 添加公钥... # quit
四、nbd挂载方式修改镜像(qemu-nbd)
1、确保已安装nbd模块,加载模块
# modinfo nbd # insmod /lib/modules/3.10.0-693.el7.x86_64/kernel/drivers/block/nbd.ko max_part=8
3、建立nbd连接,挂载到目录
# qemu-nbd -c /dev/nbd0 ./CentOS-7-x86_64-GenericCloud-1708-20180123.qcow2 # mkdir -p /mnt/qcows/qcow0 # mount /dev/nbd0p1 /mnt/qcows/qcow0
4、执行chroot
# chroot /mnt/qcows/qcow0/
5、执行修改,比如
$ passwd dc2-user # 或其它操作
6、修改完毕后解除挂载点,解除连接
# umount /mnt/qcows/qcow0 # qemu-nbd -d /dev/nbd0p1
五、通过virt-manager挂载虚拟机
1、执行
virt-manager
2、新建虚拟机
选择“导入现有磁盘”,“使用ISO镜像”,选择qcow2文件…
如果报:“WARNING : KVM不可用.这可能是因为没有安装KVM软件包,或者没有载入KVM内核模块.您的虚拟机可能性很差。”的警告相应的解决方案是:
- 关闭虚拟机
- 进入虚拟机设置(可以配置网卡,硬盘,光驱的地方)
- 点击“处理器和内存”,勾选虚拟化Inter VT-x/EPT 或AMD-V/RVI(V)
3、登录机器,修改
IP地址和密码、公钥方式登录,在前面已说明如何操作
六、清理痕迹
1、清理/var/log/文件夹
2、删除cloud-init执行记录
cloud-init是专门为云环境的虚拟机初始化而开发的工具,通过读取相应的数据,对虚拟机进行配置。其执行完毕后会在一个叫 sem 的目录下创建信号文件,以便下次启动模块时不再重复执行语句。其目录位置为:/var/lib/cloud/instances/实例ID/sem
sudo rm -rf /var/lib/cloud/instances sudo rm -rf /var/lib/cloud/instance
3、清理history和.ssh目录等
rm -rf /home/xxx/.ssh echo '' # /home/xxx/.bash_history echo '' # /root/.bash_history rm -rf /root/.oracle_jre_usage
七、去除磁盘空洞
# 创建同样大小的镜像 $ qemu-img create -f qcow2 CentOS-7-x86_64-GenericCloud-1708-20180329.qcow2 40G $ virt-sparsify -x ./CentOS-7-x86_64-GenericCloud-1708-20180123.qcow2 --convert qcow2 ./CentOS-7-x86_64-GenericCloud-1708-20180329.qcow2 $ du -sh * 7.3G CentOS-7-x86_64-GenericCloud-1708-20180123.qcow2 5.3G CentOS-7-x86_64-GenericCloud-1708-20180329.qcow2