Kylin v4基于cloud-init实现分区自动扩容

1. 环境

云平台:兼容OpenStack Queens的发行版
HOST OS:Kylin-Server-10-SP1-Release-Build20-20210518-arm64
虚拟机镜像ISO:Kylin-4.0.2-server-sp2-2000-19080414.J1-arm64.iso

这里主要介绍基于Kylin v4一些关键信息,其他相关信息请参考该文章Kylin v10基于cloud-init实现分区自动扩容(LVM分区模式)


2. 定制cloud-init镜像

2.1 分区

安装系统时,自定义分区,未采用LVM模式,故需要建立EFI、boot和根分区,根分区放在最后,千万不要全自动分区,参考如下分区:

Disk /dev/sda: 80 GiB, 85899345920 bytes, 167772160 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xdda3db2f

Device     Boot   Start       End   Sectors  Size Id Type
/dev/sda1  *       2048    976895    974848  476M ef EFI (FAT-12/16/32)
/dev/sda2        976896   1953791    976896  477M 83 Linux
/dev/sda3       1953792 167772126 165818335 79.1G 83 Linux

2.2 配置自动扩容

通过df -hl查看挂载情况,如下:

Filesystem      Size  Used Avail Use% Mounted on
udev            2.0G     0  2.0G   0% /dev
tmpfs           399M   18M  381M   5% /run
/dev/sda3        78G  3.6G   71G   5% /
tmpfs           2.0G  1.0M  2.0G   1% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/sda2       454M  114M  313M  27% /boot
/dev/sda1       476M  592K  476M   1% /boot/efi
tmpfs           399M  448K  398M   1% /run/user/1000

通过blkid查看详情如下所示:

/dev/sda1: SEC_TYPE="msdos" UUID="C46C-65FA" TYPE="vfat" PARTUUID="dda3db2f-01"
/dev/sda2: LABEL="SYSBOOT" UUID="4586bc8e-0334-4357-9a95-dd2c6182a11c" TYPE="ext4" PARTUUID="dda3db2f-02"
/dev/sda3: LABEL="SYSROOT" UUID="f0ed9d30-90ef-4454-b9b1-304e06629d5f" TYPE="ext4" PARTUUID="dda3db2f-03"

根据以上信息,得知我们需要自动扩容sda3分区(growpart)。
创建文件/etc/cloud/cloud.cfg.d/06_growpart.cfg
vim /etc/cloud/cloud.cfg.d/06_growpart.cfg

#cloud-config
growpart:
  mode: auto
  devices: [/dev/sda3]
  ignore_growroot_disabled: false

注意:由于上述分区采用的是scsi模式,故上传云平台这个属性也必须设置为–property hw_disk_bus=scsi。亦可采用virtio模式

2.4 修改cloud-init代码

cloud-init版本如下:

ii  cloud-guest-utils                      0.27-0kord24                           all          cloud guest utilities
ii  cloud-init                             0.7.7~bzr1212-0kord1                   all          Init scripts for cloud instances

通过调试,发现cloud-init有执行时候存在些问题,进行相关代码修改vim /usr/lib/python3/dist-packages/cloudinit/util.py


def del_file(path):
    LOG.debug("Attempting to remove %s", path)
    try:
        if os.path.isdir(path):
            shutil.rmtree(path, ignore_errors=True)
        else:
            os.unlink(path)
    except OSError as e:
        if e.errno != errno.ENOENT:
            raise e

2.3 调整网络接口名称

针对麒麟桌面版本系统,cloud-init会自动生成 /etc/network/interfaces.d/50-cloud-init.cfg,内容如下:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

这样就把网卡名称固定为eth0。

或者执行如下命令删除相关文件:

rm -rf /etc/network/interfaces.d/50-cloud-init.cfg

或者编辑文件/boot/efi/boot/grub/grub.cfg,添加net.ifnames=0 biosdevname=0变更网卡名为eth0,如下

### BEGIN /etc/grub.d/10_linux ###
menuentry 'Kylin 4.0.2 4.4.131-20190726.kylin.server-generic' --class kylin --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-a891d6d3-ba38-4da6-9165-3197f8bba7ab' {
        insmod part_msdos
        insmod ext2
        set root='hd0,msdos2'
        search --no-floppy --fs-uuid --set=root a70cbf0f-8fff-4eba-beca-efbae2bbee5a
        linux   /uImage-ft2000plus root=UUID=f0ed9d30-90ef-4454-b9b1-304e06629d5f quiet splash console=tty1 pcie_aspm=off $vt_handoff console=ttyS0,115200 earlycon=uart8250,mmio32,0x80028001000 rw rootdelay=10 KEYBOARDTYPE=pc KEYTABLE=us net.ifnames=0 biosdevname=0
        initrd  /initramfs.img
        devicetree /dtb/ft2000plus.dtb
}
### END /etc/grub.d/10_linux ###

我们选择第二种办法,调整网卡名

2.4 manage /etc/hosts

新建文件/etc/cloud/cloud.cfg.d/07_manage_etc_hosts.cfg,内容如下:

#cloud-config
manage_etc_hosts: true

/etc/hosts中自动写入ip与hostname对应关系,避免引起unable to resolve host导致sudo慢

2.5 自动调整

若发现自动扩容失败,cd /var/lib/cloud && ls -hl

drwxr-xr-x 2 root root 4.0K Jul  7 10:10 data
drwxr-xr-x 2 root root 4.0K Jul  1 16:34 handlers
lrwxrwxrwx 1 root root   61 Jul  5 10:28 instance -> /var/lib/cloud/instances/b406f5bf-75ea-4470-9c74-cd06efdd8755
drwxr-xr-x 4 root root 4.0K Jul  5 10:28 instances
drwxr-xr-x 6 root root 4.0K Jul  1 16:34 scripts
drwxr-xr-x 2 root root 4.0K Jul  1 16:34 seed
drwxr-xr-x 2 root root 4.0K Jul  1 16:34 sem

删除instance及链接相关内容,rm -rf instance /var/lib/cloud/instances/b406f5bf-75ea-4470-9c74-cd06efdd8755,然后重启系统。

3. 问题记录

  • IsADirectoryError: [Errno 21] Is a directory: ‘/var/lib/cloud/instance’
    查看日志/var/log/cloud-init-output.log
Cloud-init v. 0.7.7 running 'init-local' at Fri, 01 Jul 2022 06:51:45 +0000. Up 6.35 seconds.
Generating locales (this might take a while)...
  en_US.UTF-8... done
Generation complete.
Cloud-init v. 0.7.7 running 'modules:config' at Fri, 01 Jul 2022 06:51:48 +0000. Up 8.54 seconds.
Cloud-init v. 0.7.7 running 'modules:final' at Fri, 01 Jul 2022 06:51:53 +0000. Up 13.67 seconds.
2022-07-01 14:51:53,443 - util.py[WARNING]: Running module ssh-authkey-fingerprints (<module 'cloudinit.config.cc_ssh_authkey_fingerprints' from '/usr/lib/python3/dist-packages/cloudinit/config/cc_ssh_authkey_fingerprints.py'>) failed
Cloud-init v. 0.7.7 finished at Fri, 01 Jul 2022 06:51:53 +0000. Datasource DataSourceNone.  Up 13.96 seconds
2022-07-01 14:51:53,515 - cc_final_message.py[WARNING]: Used fallback datasource
Cloud-init v. 0.7.7 running 'init-local' at Fri, 01 Jul 2022 06:55:50 +0000. Up 5.25 seconds.
2022-07-01 14:55:51,001 - util.py[WARNING]: failed of stage init-local
failed run of stage init-local
------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/bin/cloud-init", line 520, in status_wrapper
    ret = functor(name, args)
  File "/usr/bin/cloud-init", line 250, in main_init
    init.fetch(existing=existing)
  File "/usr/lib/python3/dist-packages/cloudinit/stages.py", line 322, in fetch
    return self._get_data_source(existing=existing)
  File "/usr/lib/python3/dist-packages/cloudinit/stages.py", line 241, in _get_data_source
    util.del_file(self.paths.instance_link)
  File "/usr/lib/python3/dist-packages/cloudinit/util.py", line 1567, in del_file
    raise e
  File "/usr/lib/python3/dist-packages/cloudinit/util.py", line 1564, in del_file
    os.unlink(path)
IsADirectoryError: [Errno 21] Is a directory: '/var/lib/cloud/instance'
------------------------------------------------------------
Cloud-init v. 0.7.7 running 'init-local' at Fri, 01 Jul 2022 07:06:53 +0000. Up 5.32 seconds.
Cloud-init v. 0.7.7 running 'modules:config' at Fri, 01 Jul 2022 07:06:54 +0000. Up 7.13 seconds.
Cloud-init v. 0.7.7 running 'modules:final' at Fri, 01 Jul 2022 07:06:55 +0000. Up 8.26 seconds.
Cloud-init v. 0.7.7 finished at Fri, 01 Jul 2022 07:06:56 +0000. Datasource DataSourceNone.  Up 8.49 seconds
2022-07-01 15:06:56,190 - cc_final_message.py[WARNING]: Used fallback datasource

及 systemctl status cloud-init查看详细日志如下:

● cloud-init.service - Initial cloud-init job (metadata service crawler)
   Loaded: loaded (/lib/systemd/system/cloud-init.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Fri 2022-07-01 15:29:48 CST; 5s ago
  Process: 6548 ExecStart=/usr/bin/cloud-init init (code=exited, status=1/FAILURE)
 Main PID: 6548 (code=exited, status=1/FAILURE)

Jul 01 15:29:48 Kylin cloud-init[6548]:   File "/usr/lib/python3/dist-packages/cloudinit/util.py", line 1565, in del_file
Jul 01 15:29:48 Kylin cloud-init[6548]:     os.removedirs(path)
Jul 01 15:29:48 Kylin cloud-init[6548]:   File "/usr/lib/python3.5/os.py", line 259, in removedirs
Jul 01 15:29:48 Kylin cloud-init[6548]:     rmdir(name)
Jul 01 15:29:48 Kylin cloud-init[6548]: OSError: [Errno 39] Directory not empty: '/var/lib/cloud/instance'
Jul 01 15:29:48 Kylin cloud-init[6548]: ------------------------------------------------------------
Jul 01 15:29:48 Kylin systemd[1]: cloud-init.service: Main process exited, code=exited, status=1/FAILURE
Jul 01 15:29:48 Kylin systemd[1]: Failed to start Initial cloud-init job (metadata service crawler).
Jul 01 15:29:48 Kylin systemd[1]: cloud-init.service: Unit entered failed state.
Jul 01 15:29:48 Kylin systemd[1]: cloud-init.service: Failed with result 'exit-code'.

解决方案:通过修改 /usr/lib/python3/dist-packages/cloudinit/util.py代码解决

  • Cannot find device “enp1s0”
    cloud-init启动失败,通过systemctl status cloud-init查看详细日志如下
● cloud-init.service - Initial cloud-init job (metadata service crawler)
   Loaded: loaded (/lib/systemd/system/cloud-init.service; enabled; vendor preset: enabled)
   Active: inactive (dead)

Jul 01 15:16:51 Kylin systemd[1]: Dependency failed for Initial cloud-init job (metadata service crawler).
Jul 01 15:16:51 Kylin systemd[1]: cloud-init.service: Job cloud-init.service/start failed with result 'dependency'.
root@Kylin:/home/kylin# systemctl start cloud-init
A dependency job for cloud-init.service failed. See 'journalctl -xe' for details.
root@Kylin:/home/kylin# journalctl -xe
Jul 01 15:19:04 Kylin su[5845]: + /dev/pts/0 root:root
Jul 01 15:19:04 Kylin su[5845]: pam_unix(su:session): session opened for user root by kylin(uid=0)
Jul 01 15:19:04 Kylin su[5845]: pam_systemd(su:session): Cannot create session: Already running in a session
Jul 01 15:25:01 Kylin CRON[5878]: pam_unix(cron:session): session opened for user root by (uid=0)
Jul 01 15:25:01 Kylin CRON[5877]: pam_unix(cron:session): session opened for user pcp by (uid=0)
Jul 01 15:25:01 Kylin CRON[5880]: (pcp) CMD ( /usr/lib/pcp/bin/pmlogger_check -C)
Jul 01 15:25:01 Kylin CRON[5879]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Jul 01 15:25:01 Kylin CRON[5878]: pam_unix(cron:session): session closed for user root
Jul 01 15:25:01 Kylin CRON[5877]: (CRON) info (No MTA installed, discarding output)
Jul 01 15:25:01 Kylin CRON[5877]: pam_unix(cron:session): session closed for user pcp
Jul 01 15:28:01 Kylin CRON[5910]: pam_unix(cron:session): session opened for user pcp by (uid=0)
Jul 01 15:28:01 Kylin CRON[5911]: (pcp) CMD ( /usr/lib/pcp/bin/pmie_check -C)
Jul 01 15:28:02 Kylin CRON[5910]: pam_unix(cron:session): session closed for user pcp
Jul 01 15:28:27 Kylin systemd[1]: Starting Raise network interfaces...
-- Subject: Unit networking.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit networking.service has begun starting up.
Jul 01 15:28:27 Kylin dhclient[6451]: Internet Systems Consortium DHCP Client 4.3.3
Jul 01 15:28:27 Kylin ifup[6433]: Internet Systems Consortium DHCP Client 4.3.3
Jul 01 15:28:27 Kylin ifup[6433]: Copyright 2004-2015 Internet Systems Consortium.
Jul 01 15:28:27 Kylin ifup[6433]: All rights reserved.
Jul 01 15:28:27 Kylin ifup[6433]: For info, please visit https://www.isc.org/software/dhcp/
Jul 01 15:28:27 Kylin dhclient[6451]: Copyright 2004-2015 Internet Systems Consortium.
Jul 01 15:28:27 Kylin dhclient[6451]: All rights reserved.
Jul 01 15:28:27 Kylin dhclient[6451]: For info, please visit https://www.isc.org/software/dhcp/
Jul 01 15:28:27 Kylin dhclient[6451]:
Jul 01 15:28:27 Kylin ifup[6433]: Cannot find device "enp1s0"
Jul 01 15:28:27 Kylin dhclient[6451]: Error getting hardware address for "enp1s0": No such device
Jul 01 15:28:27 Kylin ifup[6433]: Error getting hardware address for "enp1s0": No such device
Jul 01 15:28:27 Kylin ifup[6433]: If you think you have received this message due to a bug rather
Jul 01 15:28:27 Kylin ifup[6433]: than a configuration issue please read the section on submitting
Jul 01 15:28:27 Kylin ifup[6433]: bugs on either our web page at www.isc.org or in the README file
Jul 01 15:28:27 Kylin ifup[6433]: before submitting a bug.  These pages explain the proper
Jul 01 15:28:27 Kylin ifup[6433]: process and the information we find helpful for debugging..
Jul 01 15:28:27 Kylin ifup[6433]: exiting.
Jul 01 15:28:27 Kylin dhclient[6451]:
Jul 01 15:28:27 Kylin ifup[6433]: Failed to bring up enp1s0.
Jul 01 15:28:27 Kylin dhclient[6451]: If you think you have received this message due to a bug rather
Jul 01 15:28:27 Kylin dhclient[6451]: than a configuration issue please read the section on submitting
Jul 01 15:28:27 Kylin dhclient[6451]: bugs on either our web page at www.isc.org or in the README file
Jul 01 15:28:27 Kylin dhclient[6451]: before submitting a bug.  These pages explain the proper
Jul 01 15:28:27 Kylin dhclient[6451]: process and the information we find helpful for debugging..
Jul 01 15:28:27 Kylin dhclient[6451]:
Jul 01 15:28:27 Kylin dhclient[6451]: exiting.
Jul 01 15:28:27 Kylin systemd[1]: networking.service: Main process exited, code=exited, status=1/FAILURE
Jul 01 15:28:27 Kylin systemd[1]: Failed to start Raise network interfaces.
-- Subject: Unit networking.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit networking.service has failed.
--
-- The result is failed.
Jul 01 15:28:27 Kylin systemd[1]: Dependency failed for Initial cloud-init job (metadata service crawler).
-- Subject: Unit cloud-init.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit cloud-init.service has failed.
--
-- The result is dependency.
Jul 01 15:28:27 Kylin systemd[1]: cloud-init.service: Job cloud-init.service/start failed with result 'dependency'.
Jul 01 15:28:27 Kylin systemd[1]: networking.service: Unit entered failed state.
Jul 01 15:28:27 Kylin systemd[1]: networking.service: Failed with result 'exit-code'.

解决办法:清理/etc/network/interfaces中不存在网卡信息

参考文献

https://cloud.tencent.com/document/product/213/12587
https://zhuanlan.zhihu.com/p/27664869#:~:text=%E6%88%91%E4%BB%AC%E5%8F%AF%E4%BB%A5%E6%8C%87%E5%AE%9A%E8%87%AA%E5%B7%B1%E7%9A%84%20hostname%EF%BC%8C%E6%96%B9%E6%B3%95%E6%98%AF%E5%B0%86%E4%B8%8B%E9%9D%A2%E7%9A%84%E5%86%85%E5%AE%B9%E4%BC%A0%E7%BB%99%20cloud-init%EF%BC%9A%20%23cloud-config%20hostname%3A%20my1.cloudman.cc%20manage_etc_hosts%3A%20true,my1.cloudman.cc%20%E5%91%8A%E8%AF%89%20cloud-init%20%E5%B0%86%20hostname%20%E8%AE%BE%E7%BD%AE%E4%B8%BA%20my1.cloudman.cc%20%E3%80%82

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值