根据GitHub前人经验[重置 Ubuntu VM 密码不起作用]和官网文档System preparation for Linux

  1. 执行以下操作:
    最好在创建主机时名称就改为localhost,如为其他则编辑/etc/hosts删除其他主机名。

    Ubuntu

    apt-get update
    apt-get upgrade -y
    apt-get install -y acpid ntp
    hostname localhost
    echo "localhost" > /etc/hostname

    Centos

    yum update -y
    hostname localhost
    echo "localhost" > /etc/hostname

    对于 CentOS,必须从接口配置文件 /etc/sysconfig/network-scripts/ifcfg-eth0中获取唯一标识。任何以 \<VALUE\> 开头的条目都应删除。

    echo "DEVICE=eth0
    TYPE=Ethernet
    BOOTPROTO=dhcp
    ONBOOT=yes" > /etc/sysconfig/network-scripts/ifcfg-eth0
  2. 根据文档Linux with Cloud-init 添加cloud-init 管理程序
    Centos

    yum install -y cloud-init wget

    Ubuntu

    apt-get install -y cloud-init wget

    /etc/cloud/cloud.cfg.d/99_cloudstack.cfg中添加

    datasource_list: [ ConfigDrive, CloudStack, None ]
    datasource:
      CloudStack: {}
      None: {}
  3. 添加cloud-init密码管理程序,每次启动时启用 set_passwords 模块

    sudo sed -i s/" - set[_|-]passwords"/" - [set_passwords, always]"/g /etc/cloud/cloud.cfg
  4. 删除自定义用户,myuser为用户名

    deluser myuser --remove-home

    指定管理用户,编辑 /etc/cloud/cloud.cfg.d/80_user.cfg,添加以下代码

    system_info:
      default_user:
        name: cloud-user
        lock_passwd: false          # disable user password login - true/false
        sudo: [ALL=(ALL) ALL]       # User permissions
    disable_root: 1                 # root remote login is 0 - enabled, 1 - disabled
    ssh_pwauth: 1                   # password login is 0 - disabled, 1- enabled

    name是之后模板启用的用户名,所有系统桌面版不建议设置为root,默认不允许桌面登录。

  5. SSH 密钥管理

    sudo sed -i s/" - ssh$"/" - [ssh, always]"/g /etc/cloud/cloud.cfg
    echo "ssh_deletekeys: false" > /etc/cloud/cloud.cfg.d/49_hostkeys.cfg
  6. 分区管理,如果在安装时没有选择lvm,则此条无法配置,影响扩容后自动分区,可能需要手动分区。
    Centos安装Growpart 模块 yum install cloud-utils-growpart -y

    Ubuntu安装Growpart 模块 apt-get install cloud-initramfs-growroot -y

    检测并扩展 MBR 分区,主要观察pvs里PV项

    **Centos**
    [root@localhost ~]# lvs
    LV   VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
    root centos -wi-ao---- <17.00g
    swap centos -wi-ao----   2.00g
    [root@localhost ~]# vgs
    VG     #PV #LV #SN Attr   VSize   VFree
    centos   1   2   0 wz--n- <19.00g    0
    [root@localhost ~]# pvs
    PV         VG     Fmt  Attr PSize   PFree
    /dev/xvda2 centos lvm2 a--  <19.00g    0
    
    **Ubuntu**
     [root@localhost ~]# pvs
    PV         VG     Fmt  Attr PSize   PFree
    /dev/vda3 ubuntu lvm2 a--  <19.00g    0

    编辑 /etc/cloud/cloud.cfg.d/50_growpartion.cfg

    growpart:
       mode: auto
       devices:
         - \"/dev/vda3\"
       ignore_growroot_disabled: false

    扩展物理卷、卷组和根lvm,编辑 /etc/cloud/cloud.cfg.d/51_extend_volume.cfg,注意路径是否存在
    Centos

    runcmd:
      - [ cloud-init-per, always, grow_VG, pvresize, /dev/xvda2 ]
      - [ cloud-init-per, always, grow_LV, lvresize, -l, '+100%FREE', /dev/centos/root ]
      - [ cloud-init-per, always, grow_FS, xfs_growfs, /dev/centos/root ]

    Ubuntu

    runcmd:
    
    - [ cloud-init-per, always, grow_VG, pvresize, /dev/xvda3 ]
    - [ cloud-init-per, always, grow_LV, lvresize, -l, '+100%FREE', /dev/ubuntu-vg/ubuntu-lv ]
    - [ cloud-init-per, always, grow_FS, xfs_growfs, /dev/ubuntu-vg/ubuntu-lv ]

    上面的示例代码基于 XFS 分区类型。如果使用 ext4 分区,请在最后一行代码中将xfs_growfs替换为resize2fs。可以通过命令parted -l查看分区。
    其中Centos默认根卷为/dev/centos/root,Ubuntu默认根卷为/dev/ubuntu-vg/ubuntu-lv,或者通过命令lvdisplay 查看,其中LV Path就是根卷路径。
    系统需要安装lvm2,才有以上命令,Debian需要在~/bashrc里添加export PATH=$PATH:/sbin:/usr/sbin,

    **

    设置每次启动时启用自动调整大小,默认情况下,cloud-init runcmd模块仅在首次启动时执行定义的命令。仅当runcmd和用户脚本模块都配置为在每次启动时运行时,命令才会在每次启动时运行。

    sudo sed -i s/" - runcmd"/" - [runcmd, always]"/g /etc/cloud/cloud.cfg
    sudo sed -i s/" - scripts-user"/" - [scripts-user, always]"/g /etc/cloud/cloud.cfg
  7. 实现所需的 cloud-init 功能后,清理 cloud-init 跟踪器文件

    rm -rf /var/lib/cloud/*
    rm -rf /etc/sudoers.d/*
  8. 模板清理
    删除 udev 持久设备规则
    Centos

    rm -f /etc/udev/rules.d/70*
    rm -f /var/lib/dhclient/*

    Ubuntu

    rm -f /etc/udev/rules.d/70*
    rm -f /var/lib/dhcp/dhclient.*

    删除 SSH 密钥

    rm -f /etc/ssh/*key*

    清理日志文件

    cat /dev/null > /var/log/audit/audit.log 2>/dev/null
    cat /dev/null > /var/log/wtmp 2>/dev/null
    logrotate -f /etc/logrotate.conf 2>/dev/null
    rm -f /var/log/*-* /var/log/*.gz 2>/dev/null

    设置用户密码过期

    passwd --expire root

    清除用户历史记录

    history -c
    unset HISTFILE

    关闭虚拟机,选择ROOT卷并创建模板,打开密码已启用选项。

最后修改:2024 年 03 月 20 日
如果觉得我的文章对你有用,请随意赞赏