一、为何需要本地安装Alibaba Cloud Linux?
据说:CentOS 官网正式宣布,将停止维护 CentOS Linux,并将更多资金和人力投入到 CentOS Stream 中。CentOS Linux 8 将在 2021 年底停止维护,CentOS Linux 7 将在 2024 年 6 月底停止维护(https://access.redhat.com/announcements/5634831)。
很多在本地CentOS系统中测试的项目,最终会上线到阿里云。虽然阿里云镜像有CentOS的若干版本、有具有性能优势且兼容前者的Alibaba Cloud Linux的若干版本,但线上线下两端操作系统的细微差异、源差异,还是会给运维多少带来一些混乱。随着CentOS未来可能不靠谱,将有阿里官方长期支持维护的Alibaba Cloud Linux本地化安装,是个不错的选择。
二、Alibaba Cloud Linux资源
Alibaba Cloud Linux产品页,Alibaba Cloud Linux 2、Alibaba Cloud Linux 3,这些丰富的官方文档,介绍了其产品优势和功能、应用场景、产品动态、文档与工具,但官方只给出了KVM虚拟机的本地化步骤:在本地使用Alibaba Cloud Linux 2镜像、在本地使用Alibaba Cloud Linux 3镜像。下面给出在本地物理实体机安装Alibaba Cloud Linux的方法。此方法适当修改也可用于各种版本的虚拟机。
首先在https://mirrors.aliyun.com/alinux/image/下载Alibaba Cloud Linux镜像,选型为aliyun_2_1903_x64_20G_nocloud_alibase_20210726.qcow2,也即阿里云长期支持版的基础镜像,此文写作时为20210726。
三、本地化安装Alibaba Cloud Linux的步骤
1)安装在物理实体机
思路说明,将镜像打包至现成的linux live cd或者rescue cd,在rescue模式下像ghost或win的WIM一样,用dd做目的盘恢复。
1、阿里云官方镜像qcow2格式转换
可使用qemu-img,我为Win工作台,下载地址为https://cloudbase.it/qemu-img-windows/。Linux或macOS环境可在线安装。转换命令:
qemu-img convert -f qcow2 aliyun_2_1903_x64_20G_nocloud_alibase_20210726.qcow2 -O raw aliyun_2_1903_x64_20G_nocloud_alibase_20210726.raw
此格式即dd if/of的格式。
2、制作安装盘
aliyun_2_1903_x64_20G_nocloud_alibase_20210726.raw有20G。将20G文件打包到安装盘,若不用U盘而是刻录光盘,光盘容量不够,即便容量不是问题,也不利分发,所以应该无损收缩(shrink)该文件。
我尝试过三种可能,或失败或其它原因放弃(提及这些,供有意者参考):
①压缩再dd:
gzip -dv aliyun_2_1903_x64_20G_nocloud_alibase_20210726.raw.gz | dd of=/dev/sda bs=256M
gzip需要20G空间才能完整解压缩,而安装盘无论U盘还是光盘还是挂载.iso都为模拟CDROM,引导后tmpfs只有2G。
②安装盘集成qemu-img后转换镜像和写盘:
qemu-img convert aliyun_2_1903_x64_20G_nocloud_alibase_20210726.qcow2 -O raw /dev/sda
现成的linux live或rescue环境一般都缺乏qemu-img及其运行库,集成过程繁琐,放弃。
③resize2fs aliyun_2_1903_x64_20G_nocloud_alibase_20210726.raw 2.41G
raw文件里,系统实际只占用2.41G,其余为用00或random填充的稀疏(sparse)空间,系统和稀疏并非泾渭分明的连续存储,而是碎片状态,见下图:
而resize2fs会按命令行给定的参数无脑截断,这无疑会导致系统数据丢失。
若将系统和稀疏做碎片整理,或许resize2fs截断后不会丢失数据。我未作验证。
成功的方法:
①用某种磁盘工具调整分区。
也即碎片整理使raw文件里的系统和稀疏分离的过程。我用的是Diskgenius。linux下可用GParted。
红框:可见系统实际只占用了2.41G。
蓝框:aliyun_2_1903_x64_20G_nocloud_alibase_20210726这个版本,无损调整后的扇区极限是5058007。此数值后续有用。
绿框:分区前空间992K不要调整,否则磁盘恢复后的系统将不可引导。
注意:此时raw文件仍然是20G。因为raw此时是挂载的虚拟磁盘,做虚拟磁盘的参数修改,扇区截止至5058007,对文件本身大小无影响。
②用truncate截断获得无损收缩后的raw文件。
将调整分区后raw文件传至可用的linux系统,执行截断:
truncate --size=$[(5058007+1)*512] aliyun_2_1903_x64_20G_nocloud_alibase_20210726.raw
+1是因为扇区从0开始计数;512是因为每扇区512字节。
据说win系统api有fileapi.h的SetEndOfFile功能也可截断,我未尝试。
③将无损收缩后的raw文件(2.41G)打包至linux live或rescue cd。
我选用CentOS-7-x86_64-NetInstall-2009.iso,因为CentOS7同Alibaba Cloud Linux兼容性最好。打包后最终安装盘文件为3.03G。打包.iso的工具很多,随喜。
3、用此安装盘安装系统
是否刻录U盘、光盘,随喜。以下我用虚拟机模拟物理实体机。真实环境操作雷同。
①建立有空硬盘的虚拟机,cd挂载CentOS-7-x86_64-NetInstall-2009-aliyun20210726.iso,BIOS选择cd启动。
②借用CentOS7安装盘功能,从Troubleshooting进入Rescue模式。
③选择硬盘没有挂载的shell,即3
④挂载安装盘,恢复系统。依次执行
mkdir /mnt/cdrom
mount /dev/cdrom /mnt/cdrom
dd if=/mnt/cdrom/aliyun_2_1903_x64_20G_nocloud_alibase_20210726.raw of=/dev/sda bs=256M
输出为sda而不是sda1,因为raw是磁盘镜像而非分区镜像;256M可根据主机内存大小调整,我为2G。如图可见恢复速度和时间。
⑤将系统所在的sda1分区,扩展至主机硬盘实际可用的空间大小。否则,sda1分区将是raw的2.4G。
可用fdisk删建大法:
fdisk /dev/sda
,依次d
、n
、回车4次选择默认、w
。
(我没有4T以上硬盘,估计在GPT分区就是用gdisk,或者通用的parted,同理删建操作)
e2fsck -f /dev/sda1
resize2fs /dev/sda1
重启系统使如上修改生效。
⑥选择硬盘挂载到目录的shell,即1
切换根:chroot /mnt/sysimage
在/boot下创建initramfs文件:
cd boot
dracut -f initramfs-4.19.91-24.1.al7.x86_64.img 4.19.91-24.1.al7.x86_64
修改root登录口令:passwd root
,两次输入无回显口令;
使用户可以口令登录:sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
重启,用本地硬盘引导。
说明:
Alibaba Cloud Linux系统本来设计为根据用户在阿里云平台购买ECS时提交的信息(如机器名、口令、cpu和内存)生成元数据,通过cloud-init-local、dracut-initqueue初始化操作系统的环境。我们不需要这些元数据,所以做如上操作,手动创建initramfs文件、生成root口令且使其可登录。知其目的,这些操作亦可随喜改变。
如第⑤完成后可直接重启,如下操作,
rw init=/bin/bash crashkernel=auto
这样也可进入系统。
4、优化系统
进入系统后的操作与CentOS或Alibaba Cloud Linux相同,配置网络
vi /etc/sysconfig/network-scripts/ifcfg-eth0
BOOTPROTO = static
IPADDR =
GATEWAY =
NETMASK =
DNS1 =
systemctl restart network
systemctl restart sshd
之后即可远程。
我这里无软驱出现报错,禁用即可:
echo "blacklist floppy" | tee /etc/modprobe.d/blacklist-floppy.conf
除此,网上搜来停用和删除云上才有有关服务:
/usr/local/share/assist-daemon/assist_daemon --stop
/usr/local/share/assist-daemon/assist_daemon --delete
rm -rf /usr/local/share/assist-daemon
wget
http://update.aegis.aliyun.com/download/uninstall.sh
chmod +x uninstall.sh
./uninstall.sh
wget
http://update.aegis.aliyun.com/download/quartz_uninstall.sh
chmod +x quartz_uninstall.sh
./quartz_uninstall.sh
pkill aliyun-service
rm -fr /etc/init.d/agentwatch /usr/sbin/aliyun-service
rm -rf /usr/local/aegis*
sudo systemctl stop aegis.service
sudo systemctl disable aegis.service
sudo rm /lib/systemd/system/aegis.service
sudo systemctl stop aliyun.service
sudo systemctl disable aliyun.service
sudo rm /lib/systemd/system/aliyun.service
sudo systemctl stop agentwatch.service
sudo systemctl disable agentwatch.service
sudo rm /lib/systemd/system/agentwatch.service
sudo systemctl stop accounts-daemon.service
sudo systemctl disable accounts-daemon.service
sudo rm /lib/systemd/system/accounts-daemon.service
sudo systemctl stop aliyun-util.service
sudo systemctl disable aliyun-util.service
sudo rm /etc/systemd/system/aliyun-util.service
sudo systemctl stop cloud-config.service
sudo systemctl disable cloud-config.service
sudo rm /lib/systemd/system/cloud-config.service
sudo systemctl stop cloud-final.service
sudo systemctl disable cloud-final.service
sudo rm /lib/systemd/system/cloud-final.service
sudo systemctl stop cloud-init-local.service
sudo systemctl disable cloud-init-local.service
sudo rm /lib/systemd/system/cloud-init-local.service
sudo systemctl stop cloud-init-upgrade.service
sudo systemctl disable cloud-init-upgrade.service
sudo rm /lib/systemd/system/cloud-init-upgrade.service
sudo systemctl stop cloud-init.service
sudo systemctl disable cloud-init.service
sudo rm /lib/systemd/system/cloud-init.service
sudo systemctl stop kdump.service
sudo systemctl disable kdump.service
systemctl daemon-reload
systemctl reset-failed
重启后,systemd-analyze blame
看看效果。
2)安装在虚拟机
上面是用虚拟机模拟物理实体机,现在也是虚拟机,区别在于创建硬盘的模式。前者是空白硬盘、裸机启动安装盘;后者是将阿里云镜像转换成虚拟机硬盘格式,以此为系统硬盘的启机。
1、vm workstation
qemu-img.exe convert -f qcow2 aliyun_2_1903_x64_20G_nocloud_alibase_20210726.qcow2 -O vmdk aliyun_2_1903_x64_20G_nocloud_alibase_20210726.vmdk
创建虚拟机时使用这个文件作为现成硬盘启机即可
2、qemu-kvm
阿里云镜像发布即为qemu-kvm格式,直接启机即可。
qemu-system-x86_64 -accel hax -name alinux -m 2048M -smp 1 -hda aliyun_2_1903_x64_20G_nocloud_alibase_20210726.qcow2 -cdrom CentOS-7-x86_64-NetInstall-2009.iso -boot c -vga std -net nic -nic tap,ifname=tap0
注意:-accel hax
是win平台对qemu的加速器,可参考https://github.com/intel/haxm 其他系统无此参数。
3、Hyper-V
按理应该qemu-img convert -f qcow2 aliyun_2_1903_x64_20G_nocloud_alibase_20210726.qcow2 -O vhdx aliyun_2_1903_x64_20G_nocloud_alibase_20210726.vhdx
或者
qemu-img convert -f qcow2 aliyun_2_1903_x64_20G_nocloud_alibase_20210726.qcow2 -O vpc aliyun_2_1903_x64_20G_nocloud_alibase_20210726.vhd
转换成功后创建虚拟机时使用这个文件作为现成硬盘启机,并没有成功,解决方法见下面4、ESXi
4、ESXi
qemu-img转换的vmdk在esxi启机并未成功,在vm workstation启机正常的vmdk再转换兼容esxi,启机也未成功。后来我找到了StarWind V2V Converter
先按"1、vm workstation"将qcow2转换成的vmdk,如上图"Local file"选定此vmdk,按此软件操作向导即可向远程ESXi或Hyper-V直接部署生成虚拟机。
此软件还支持Azure和AWS,我未测试。
5、virtualbox、parallels…
未测试。虚拟机有很多选择,每种虚拟机有很多版本,支持的虚拟硬盘格式各不相同,还有叫做growable或thin的模式,这涉及远程部署时文件大小的传输耗时问题……总之都是把阿里云原始qcow2文件用适合的工具软件做格式转换的问题,参考如上举一反三。
BTW,我的win平台下,Hyper-V性能最好。
6、生成虚拟机后
操作步骤同三-1)-3-⑥和4,略。
四、完
纠正排错和更优化合理的方案请发arkue@qq