
# 配置Linux虚拟机
#### 安装原生的XEN和KVM驱动
本节操作以Ubuntu 20.04操作系统为例，其他操作系统具体操作请参考"[XEN虚拟化ECS安装原生的XEN和KVM驱动](https://support.huaweicloud.com/usermanual-ims/ims_01_0361.html)"。
1. 执行以下命令，打开**modules** 文件。
   **vi /etc/initramfs-tools/modules**
   
2. 按"i"进入编辑模式，修改/etc/initramfs-tools/modules文件，添加xen-pv以及virtio的驱动（具体格式要根据操作系统本身的要求来决定）。
   ```
   [root@CTU10000xxxxx ~]#vi /etc/initramfs-tools/modules 
   …… 
   # Examples: 
   # 
   # raid1 
   # sd_mod 
   xen-blkfront 
   xen-netfront 
   virtio_blk 
   virtio_scsi 
   virtio_net 
   virtio_pci 
   virtio_ring 
   virtio
   ```
   
3. 按"Esc"后，输入**:wq**，按"Enter"，保存设置并退出"/etc/initramfs-tools/modules"文件。
4. 执行以下命令，重新生成initramfs或initrd文件。 **update-initramfs -u**
   
5. 执行以下命令，检查是否已经成功装载了原生的XEN和KVM驱动相应模块。 **lsinitramfs /boot/initrd.img-\`uname -r\` \|grep xen**
   **lsinitramfs /boot/initrd.img-\`uname -r\` \|grep virtio**
   ```
   [root@ CTU10000xxxxx home]# lsinitramfs /boot/initrd.img-`uname -r` |grep xen 
   lib/modules/3.5.0-23-generic/kernel/drivers/net/ethernet/qlogic/netxen 
   lib/modules/3.5.0-23-generic/kernel/drivers/net/ethernet/qlogic/netxen/netxen_nic.ko 
   lib/modules/3.5.0-23-generic/kernel/drivers/net/xen-netback 
   lib/modules/3.5.0-23-generic/kernel/drivers/net/xen-netback/xen-netback.ko 
   lib/modules/3.5.0-23-generic/kernel/drivers/block/xen-blkback 
   lib/modules/3.5.0-23-generic/kernel/drivers/block/xen-blkback/xen-blkback.ko 
    
   [root@ CTU10000xxxxx home]# lsinitramfs /boot/initrd.img-`uname -r` |grep virtio 
   lib/modules/3.5.0-23-generic/kernel/drivers/scsi/virtio_scsi.ko
   ```
   ![](https://support.huaweicloud.com/bestpractice-ims/public_sys-resources/note_3.0-zh-cn.png)
   如果误将built-in形式存在内核中的驱动添加到initrd或initramfs文件中，不会影响虚拟机正常使用，这里全写进去只是为了修改的方便，但是使用lsinitrd命令无法检查到。可使用如下方法确定这些驱动是否以built-in形式存在内核中，例如：
   ```
   [root@ CTU10000xxxxx home]# cat /boot/config-`uname -r` | grep CONFIG_VIRTIO | grep y
   CONFIG_VIRTIO_BLK=y
   CONFIG_VIRTIO_NET=y
   CONFIG_VIRTIO=y
   CONFIG_VIRTIO_RING=y
   CONFIG_VIRTIO_PCI=y
   CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y
   [root@ CTU10000xxxxx home]# cat /boot/config-`uname -r` | grep CONFIG_XEN | grep y
   CONFIG_XEN_BLKDEV_FRONTEND=y
   CONFIG_XEN_NETDEV_FRONTEND=y
   ```
   
 
#### 修改grub文件磁盘标识方式为UUID
以Ubuntu 20.04为例，执行**blkid** 命令获取root分区对应的UUID并记录下来，编辑"/boot/grub/grub.cfg"文件，使用root分区的UUID来配置boot项。如果root分区已经使用UUID形式则不需要修改。具体操作方法如下：
1. 使用root用户登录虚拟机。
2. 执行以下命令，列出当前系统中所有已挂载文件系统的类型以及对应设备的UUID 。 **blkid**
   回显信息如下所示。
   ```
   /dev/xvda1: UUID="ec51d860-34bf-4374-ad46-a0c3e337fd34" TYPE="ext3"
   /dev/xvda5: UUID="7a44a9ce-9281-4740-b95f-c8de33ae5c11" TYPE="swap"
   ```
   

3. 执行以下命令，查看"grub.cfg"文件： **cat /boot/grub/grub.cfg**
   回显信息如下所示：
   ```
   ……menuentry 'Ubuntu Linux, with Linux 3.13.0-24-generic' --class ubuntu --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.13.0-24-generic-advanced-ec51d860-34bf-4374-ad46-a0c3e337fd34' {
   recordfail
   load_video
   gfxmode $linux_gfx_mode
   insmod gzio
   insmod part_msdos
   insmod ext2
   if [ x$feature_platform_search_hint = xy ]; then
   search --no-floppy --fs-uuid --set=root ec51d860-34bf-4374-ad46-a0c3e337fd34
   else
   search --no-floppy --fs-uuid --set=root ec51d860-34bf-4374-ad46-a0c3e337fd34
   fi
   echo 'Loading Linux 3.13.0-24-generic ...'
   linux /boot/vmlinuz-3.13.0-24-generic root=/dev/xvda1 ro 
   echo 'Loading initial ramdisk ...'
   initrd /boot/initrd.img-3.13.0-24-generic 
   }
   ```
   

4. 根据"/boot/grub/grub.cfg"配置文件里标记的root分区，查找是否包括"root=/dev/xvda1"或者"root=UUID=ec51d860-34bf-4374-ad46-a0c3e337fd34"信息。
   - 存在"root=UUID=ec51d860-34bf-4374-ad46-a0c3e337fd34"，即root分区以UUID的表示形式，无需修改。
   
   - 存在"root=/dev/xvda1"，即root分区以设备名称表示的形式，请执行步骤[5]。
    

5. 根据"root=/dev/xvda1"，即root分区对应的设备名称，以及blkid命令获取的分区信息，找到root分区设备名称对应的UUID。
6. 执行以下命令，打开"grub.cfg"文件。 **vi /boot/grub/grub.cfg**
   
7. 按"i"进入编辑模式，将root分区改成UUID形式，本例中将"root=/dev/xvda1"修改为"root=UUID=ec51d860-34bf-4374-ad46-a0c3e337fd34"。
8. 按"Esc"后，输入**:wq**，按"Enter"， 保存设置并退出vi编辑器。
9. 执行以下命令，确认修改结果。 **cat /boot/grub/grub.cfg**
   回显信息如下所示表示修改成功，即root分区以UUID的形式表示。
   ```
   ……menuentry 'Ubuntu Linux, with Linux 3.13.0-24-generic' --class ubuntu --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.13.0-24-generic-advanced-ec51d860-34bf-4374-ad46-a0c3e337fd34' {
   recordfail
   load_video
   gfxmode $linux_gfx_mode
   insmod gzio
   insmod part_msdos
   insmod ext2
   if [ x$feature_platform_search_hint = xy ]; then
   search --no-floppy --fs-uuid --set=root ec51d860-34bf-4374-ad46-a0c3e337fd34
   else
   search --no-floppy --fs-uuid --set=root ec51d860-34bf-4374-ad46-a0c3e337fd34
   fi
   echo 'Loading Linux 3.13.0-24-generic ...'
   linux /boot/vmlinuz-3.13.0-24-generic root=UUID=ec51d860-34bf-4374-ad46-a0c3e337fd34 ro
   echo 'Loading initial ramdisk ...'
   initrd /boot/initrd.img-3.13.0-24-generic
   }
   ```
   
 
#### 修改fstab文件磁盘标识方式为UUID
以Ubuntu 20.04为例，执行**blkid**命令获取所有分区对应的UUID并记录下来，编辑"/etc/fstab"文件，使用分区的UUID来配置分区自动挂载。
1. 执行以下命令，列出当前系统中所有已挂载文件系统的类型以及对应设备的UUID 。 **blkid**
   回显信息如下所示。
   ```
   /dev/xvda2: UUID="4eb40294-4c6f-4384-bbb6-b8795bbb1130" TYPE="xfs"  
   /dev/xvda1: UUID="2de37c6b-2648-43b4-a4f5-40162154e135" TYPE="swap"
   ```
   
2. 执行以下命令，查看"fstab"文件。 **cat /etc/fstab**
   回显信息如下所示。
   ```
   [root@CTU1000028010 ~]# cat /etc/fstab  
   /dev/xvda2  /       xfs     defaults    0 0 
   /dev/xvda1  swap    swap    defaults    0 0
   ```
   
3. 查看"fstab"文件中的磁盘的表示形式为设备名称。
   - 若为UUID的表示形式，无需修改。
   
   - 若为设备名称的表示形式，请执行步骤[4]。
    
4. 执行以下命令，打开"fstab"文件。
   **vi /etc/fstab**
   
5. 按"i"进入编辑模式，将"fstab"中的磁盘表示形式修改为UUID的形式。
6. 按"Esc"后，输入**:wq**，按"Enter"， 保存设置并退出vi编辑器。
 
 #### （可选）安装和配置Cloud-Init工具
为了保证使用私有镜像创建的新云服务器可以通过"用户数据注入"功能注入初始化自定义信息（例如为云服务器设置登录密码），请在创建私有镜像前安装Cloud-Init工具。
#### 检查是否已经安装Cloud-Init工具
请先执行如下步骤检查是否已安装Cloud-Init工具。在不同的操作系统下，查看是否已经安装Cloud-Init工具的方法不同。
- 若依赖**python3** 环境时，以Ubuntu22.0.4为例，执行以下命令查看是否安装Cloud-Init工具。
  **which cloud-init**
  - 回显类似如下，表示已经安装Cloud-Init工具，无需重复安装。
    ```
    /usr/bin/cloud-init
    ```
    
  
  - 回显类似如下，表示未安装Cloud-Init工具。
    ```
    /usr/bin/which: no cloud-init in (/usr/local/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin)
    ```
    
   
- 若依赖**python2** 环境时，以CentOS 6系列为例，执行以下命令查看是否安装Cloud-Init工具。
  **which cloud-init**
  - 回显类似如下，表示已经安装Cloud-Init工具，无需重复安装。
    ```
    cloud-init-0.7.5-10.el6.centos.2.x86_64
    ```
    
  
  - 无回显信息表示未安装Cloud-Init工具。
    ![](https://support.huaweicloud.com/bestpractice-ims/public_sys-resources/note_3.0-zh-cn.png)
    由于Cloud-Init工具存在多种安装方法，如果无回显信息，请再次使用**rpm -qa \|grep cloud-init** 命令进行检查。**which cloud-init** 和**rpm -qa \|grep cloud-init**任何一个命令显示已安装，表示操作系统已安装Cloud-Init工具。
    
   
如果已安装Cloud-Init工具，还需要执行以下操作：
- 请确认当前虚拟机操作系统中用于SSH登录的证书是否继续使用。如果不再使用该证书，请删除证书。
  - root用户对应目录下的文件（如"***/$path/$to/$root*/** .ssh/authorized_keys"），执行以下命令：
    **cd /root/.ssh**
    **rm authorized_keys**
    
  
  - 非root用户对应目录下的证书文件（如"***/$path/$to/$none-root*/** .ssh/authorized_keys"），执行以下命令：
    **cd /home/centos/.ssh**
    **rm authorized_keys**
    
   
- 执行以下命令，清除Cloud-Init工具产生的缓存，确保使用该私有镜像创建的云服务器可以使用证书方式登录。 **sudo rm -rf /var/lib/cloud/\***
  
![](https://support.huaweicloud.com/bestpractice-ims/public_sys-resources/note_3.0-zh-cn.png)
设置完成后请勿重启虚拟机，否则，需重新设置。
#### 采用官方提供的包源安装Cloud-Init工具（优先推荐）
在不同操作系统安装Cloud-Init工具的方法不同，请在root用户下执行相关安装操作。
以下将介绍SUSE、CentOS、Fedora、Debian和Ubuntu操作系统安装Cloud-Init工具的具体方法。其他操作系统类型，请安装并配置对应类型的Cloud-Init工具，例如，使用CoreOS操作系统时需安装并配置coreos-cloudinit。
- **SUSE操作系统**
  SUSE操作系统的Cloud-Init网络安装地址：
  [https://ftp5.gwdg.de/pub/opensuse/repositories/Cloud:/Tools/](https://ftp5.gwdg.de/pub/opensuse/repositories/Cloud:/Tools)
  <https://download.opensuse.org/repositories/Cloud:/Tools/>
  ![](https://support.huaweicloud.com/bestpractice-ims/public_sys-resources/note_3.0-zh-cn.png)
  在上述提供的网络安装地址下选择相应操作系统版本的repo安装包进行安装。
  以SUSE Enterprise Linux Server 12为例，Cloud-Init工具的安装步骤如下。
  1. 登录到创建Linux私有镜像所使用的虚拟机。
  
  2. 执行以下命令，安装SUSE 12的网络安装源。 **zypper ar https://ftp5.gwdg.de/pub/opensuse/repositories/Cloud:/Tools/SLE_12_SP3/Cloud:Tools.repo**
     
  
  3. 执行以下命令，更新网络安装源。 **zypper refresh**
     
  
  4. 执行以下命令，安装Cloud-Init。 **zypper install cloud-init**
     
  
  5. 执行以下命令，设置Cloud-Init为开机自启动服务。
     - SUSE 11： **chkconfig cloud-init-local on; chkconfig cloud-init on; chkconfig cloud-config on; chkconfig cloud-final on**
       **service cloud-init-local status; service cloud-init status; service cloud-config status; service cloud-final status**
       
     
     - SUSE 12以及openSUSE 12/13/42： **systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service**
       **systemctl status cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service**
       
     
     
     ![](https://support.huaweicloud.com/bestpractice-ims/public_sys-resources/caution_3.0-zh-cn.png)
     对于SUSE和openSUSE操作系统，请执行以下步骤禁止动态修改主机名称。
     1. 执行以下命令，使用vi编辑器打开"dhcp"文件。 **vi etc/sysconfig/network/dhcp**
        
     
     2. 将"dhcp"文件中的"DHCLIENT_SET_HOSTNAME"的值修改为"no"。
       
   
- **CentOS操作系统**
  CentOS操作系统的Cloud-Init网络安装地址如[表1]所示。请在提供的网络安装地址下选择相应的epel-release安装包进行安装。
   表1Cloud-Init网络安装地址 
  | 操作系统类型 | 版本     | 网络安装地址                                                                     |
  |:---|:---|:---|
  | CentOS | 6系列32位 | <https://archives.fedoraproject.org/pub/archive/epel/6/i386/>              |
  | CentOS | 6系列64位 | <https://archives.fedoraproject.org/pub/archive/epel/6/x86_64/>            |
  | CentOS | 7系列64位 | <https://archives.fedoraproject.org/pub/archive/epel/7/x86_64/Packages/e/> |
     
  1. 执行以下命令安装Cloud-Init： **yum install *网络安装地址/* epel-release-*x-y*.noarch.rpm**
     **yum install cloud-init**
     ![](https://support.huaweicloud.com/bestpractice-ims/public_sys-resources/note_3.0-zh-cn.png)
     "网络安装地址"表示Cloud-Init对应的epel-release安装包的地址，*"* *x-y"* 表示当前操作系统对应的Cloud-Init epel-release版本号，执行命令时需参考[表1]以及实际使用的安装包版本进行替换。
     - 以CentOS 6系列64位为例，当前版本号为6.8，则命令修改为： **yum install https://archives.fedoraproject.org/pub/archive/epel/6/x86_64/epel-release-6-8.noarch.rpm**
       
     
     - 以CentOS 7系列64位为例，当前版本号为7.14，则命令修改为： **yum install https://archives.fedoraproject.org/pub/archive/epel/7/x86_64/Packages/e/epel-release-7-14.noarch.rpm**
       
       
  
  2. 执行以下命令，设置Cloud-Init为开机自启动服务。 **systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service**
     **systemctl status cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service**
     
   
- **Fedora操作系统**
  安装Cloud-Init前，请确认操作系统已经配置好对应的网络安装源地址，请查看"/etc/yum.repo.d/fedora.repo"文件中是否已配置相关软件包安装源地址，如果没有配置相关地址源，请参考相关Fedora官网信息配置软件包安装源。
  1. 执行以下命令，安装Cloud-Init。 **yum install cloud-init**
     
  
  2. 执行以下命令，设置Cloud-Init为开机自启动服务。 **systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service**
     **systemctl status cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service**
     
   
- **Debian和Ubuntu操作系统**
  安装Cloud-Init前，请确认操作系统已经配置好对应的网络安装源地址，请查看"/etc/apt/sources.list"文件中是否已配置相关软件包安装源地址，如果没有配置相关地址源，请参考Debian或者Ubuntu官网信息配置软件包安装源。
  1. 执行以下命令，安装Cloud-Init。 **apt-get update**
     **apt-get install cloud-init**
     
  
  2. 执行以下命令，设置Cloud-Init为开机自启动服务。 **systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service**
     **systemctl status cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service**
     
  
  
  
  **以cloud-init-23.2.2版本为例，介绍Centos、Fedora、Ubuntu、Debian和SUSE操作系统安装Cloud-Init工具的具体方法，安装步骤如下。**
  cloud-init-23.2.2.tar.gz源码包下载地址：<https://launchpad.net/cloud-init/trunk/23.2.2/+download/cloud-init-23.2.2.tar.gz>
  
- **Centos 7/Fedora (Fedora-Server-36)** **操作系统**
  ![](https://support.huaweicloud.com/bestpractice-ims/public_sys-resources/notice_3.0-zh-cn.png)
  依赖python3 环境，确认已经安装python3。
  1. 查询当前系统环境是否已安装cloud-init, 执行有结果表示已经安装。
     ```
     cloud-init -v
     ```
     
  
  2. 删除cloud-init缓存目录。
     ```
     rm -rf /var/lib/cloud/*
     ```
     
  
  3. 安装cloud-init依赖包。
     ```
     yum install python3-pip -y
     yum install python3-devel
     ```
     
  
  4. 执行如下命令，下载cloud-init压缩包。
     ```
     wget https://launchpad.net/cloud-init/trunk/23.2.2/+download/cloud-init-23.2.2.tar.gz
     ```
     
  
  5. 执行如下命令，解压cloud-init压缩包。
     ```
     tar -zxvf cloud-init-23.2.2.tar.gz
     ```
     
  
  6. 执行如下命令进入cloud-init-23.2.2目录文件夹，并安装所有依赖库。
     ```
     cd cloud-init-23.2.2
     pip3 install -r requirements.txt
     ```
     
  
  7. 执行如下命令安装cloud-init。
     ```
     python3 setup.py build
     python3 setup.py install --init-system systemd
     ```
     
  
  8. 在配置文件/etc/cloud/cloud.cfg禁用cloud-init接管网络（可选）。
     ```
     vi /etc/cloud/cloud.cfg
     ```
     添加如下内容：
     ```
     network:
       config: disabled
     ```
     
  
  9. 重启cloud-init, 查看cloud-init 状态。
     ```
     systemctl restart cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
     systemctl status cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
     ```
     ![](https://support.huaweicloud.com/bestpractice-ims/zh-cn_image_0000002227300570.png "点击放大")
     
  
  10. 设置cloud-init相关服务为开机自启动。
      ```
      systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
      ```
      
  
  11. 执行如下命令检查cloud-init版本以及是否正常运行。
      ```
      cloud-init -v
      cloud-init init --local
      ```
      ![](https://support.huaweicloud.com/bestpractice-ims/zh-cn_image_0000002227460386.png "点击放大")
      
   
- **Ubuntu22.0.4/debian11操作系统**
  ![](https://support.huaweicloud.com/bestpractice-ims/public_sys-resources/notice_3.0-zh-cn.png)
  依赖python3 环境，确认已经安装python3。
  1. 检查并清理系统自带的cloud-init可能存在冗余的配置文件。
     ```
     rm -rf /var/lib/cloud/*
     rm -f /var/log/cloud-init*
     ```
     删除/etc/cloud/cloud.cfg.d/目录下除了log相关的配置文件外的所有文件。
     
  
  2. 执行如下命令更新apt，检查是否有wget，没有则安装。
     ```
     sudo apt update
     sudo apt install wget
     ```
     
  
  3. 执行如下命令，安装依赖包。
     ```
     apt-get install cloud-guest-utils -y
     apt-get install python3-pip -y
     apt-get install python3-devel
     ```
     
  
  4. 执行以下命令，下载cloud-init压缩包。
     ```
     wget https://launchpad.net/cloud-init/trunk/23.2.2/+download/cloud-init-23.2.2.tar.gz
     ```
     
  
  5. 执行如下命令，解压cloud-init压缩包。
     ```
     tar -zxvf cloud-init-23.2.2.tar.gz
     ```
     
  
  6. 进入cloud-init目录。
     ```
     cd cloud-init-23.2.2
     ```
     
  
  7. 执行如下命令安装所有依赖库。
     ```
     pip3 install -r requirements.txt
     ```
     
  
  8. 执行如下命令安装cloud-init。
     ```
     python3 setup.py install
     ```
     
  
  9. 在vi /etc/cloud/cloud.cfg配置禁止cloud-init接管网络（可选）。
     ![](https://support.huaweicloud.com/bestpractice-ims/public_sys-resources/note_3.0-zh-cn.png)
     1.当cloud-init版本等于高于0.7.9版本，且用户需要自定义网络时，在cloud-init安装完成后，请执行如下命令，在编辑器中打开/etc/cloud/cloud.cfg。
     ```
     vi /etc/cloud/cloud.cfg
     ```
     2.输入i, 在/etc/cloud/cloud.cfg中将network修改为disabled, 禁用Cloud-Init接管网络配置（若没有该配置项请增加）:
     ```
     network:
       config: disabled
     ```
     
  
  10. 重启cloud-init, 查看cloud-init 状态。
      ```
      systemctl restart cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
      systemctl status cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
      ```
      
  
  11. 设置cloud-init相关服务为开机自启动。
      ```
      systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
      ```
      
  
  12. 执行如下命令检查cloud-init版本以及是否正常运行。
      ```
      cloud-init -v
      cloud-init init --local
      ```
      
  
  
  
  
- **SUSE Enterprise Linux Server 15操作系统**
  ![](https://support.huaweicloud.com/bestpractice-ims/public_sys-resources/notice_3.0-zh-cn.png)
  依赖python3 环境，确认已经安装python3。
  1. 执行如下命令查看历史已配置好的安装源。
     ```
     zypper lr
     ```
     
  
  2. 执行如下命令删除历史配置的suse的cloud-init的源。
     ```
     zypper rr 步骤1中执行结果显示的序号
     ```
     
  
  3. 执行如下命令配置suse源。
     ```
     zypper ar https://ftp5.gwdg.de/pub/opensuse/repositories/Cloud:/Tools/SLE_15_SP4/Cloud:Tools.repo
     ```
     
  
  4. 执行如下命令刷新suse源。
     ```
     zypper refresh
     ```
     
  
  5. 执行如下命令安装cloud-init。
     ```
     zypper install cloud-init
     ```
     
  
  6. 安装cloud-init成功后，执行**cloud-init -v** ，若出现类似下图报错提示，需执行如下命令安装依赖包。
     ![](https://support.huaweicloud.com/bestpractice-ims/zh-cn_image_0000002262300009.png "点击放大")
     ![](https://support.huaweicloud.com/bestpractice-ims/zh-cn_image_0000002262379945.png "点击放大")
     ```
     pip install requests pyyaml oauthlib jsonschema jsonpatch jinja2 configobj
     ```
     
  
  7. 检查cloud-init是否安装成功，若出现下图报错提示，则需要在/etc/cloud/cloud.cfg配置datasource_list。
     ![](https://support.huaweicloud.com/bestpractice-ims/zh-cn_image_0000002227300578.png "点击放大")
     ```
     datasource_list: [ OpenStack ]
     datasource:
       OpenStack:
         metadata_urls: ['http://169.254.169.254']
         max_wait: 120
         timeout: 5
         apply_network_config: false
     ```
     
  
  8. 修改配置文件后，重启cloud-init， 并查看cloud-init 的状态。
     ```
     systemctl restart cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service 
     systemctl status cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
     ```
     
  
  9. 设置cloud-init相关服务为开机自启动。
     ```
     systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
     ```
     ![](https://support.huaweicloud.com/bestpractice-ims/zh-cn_image_0000002227460398.png "点击放大")
     
  
  10. 执行如下命令检查cloud-init版本以及是否正常运行。
      ```
      cloud-init -v
      cloud-init init --local
      ```
      
   
 
#### 配置Cloud-Init工具
1. 设置开放root密码远程登录并开启root用户的ssh权限。
   以CentOS 6.7系列操作系统为例，在"/etc/cloud/cloud.cfg"设置"disable_root"值为"0"表示不禁用（部分OS的Cloud-Init配置使用"true"表示禁用，"false"表示不禁用），设置"ssh_pwauth"为"1"启用密码远程登录，"lock_passwd"设置为"False"表示不锁住用户密码。
   ```
   users:
    - name: root
      lock_passwd: False
   disable_root: 0
   ssh_pwauth: 1
   ```
   ![](https://support.huaweicloud.com/bestpractice-ims/public_sys-resources/note_3.0-zh-cn.png)
   - 若用户选择注入密码，则通过自己注入的密码进行远程SSH或noVNC登录。
   
   - 若用户选择注入密钥，则通过自己注入的密钥进行远程SSH登录。
     

2. 在配置文件"/etc/cloud/cloud.cfg"中禁用Cloud-Init接管网络。 当Cloud-Init版本等于或高于0.7.9版本时，在配置文件"/etc/cloud/cloud.cfg"中增加如下内容，禁用Cloud-Init接管网络。
   图1禁用Cloud-Init接管网络   
   ![](https://support.huaweicloud.com/bestpractice-ims/zh-cn_image_0000002262300025.png)
   ![](https://support.huaweicloud.com/bestpractice-ims/public_sys-resources/note_3.0-zh-cn.png)
   增加的内容需严格按照yaml格式进行配置。
   
3. 配置agent访问OpenStack数据源。
   在"/etc/cloud/cloud.cfg"最后一行添加如下内容，配置agent访问OpenStack数据源。
   ```
   datasource_list: [ OpenStack ]
   datasource:
     OpenStack:
       metadata_urls: ['http://169.254.169.254']
       max_wait: 120
       timeout: 5
       apply_network_config: false
   ```
   ![](https://support.huaweicloud.com/bestpractice-ims/public_sys-resources/note_3.0-zh-cn.png)
   - max_wait和timeout可由用户自定义是否需要配置，上述回显信息中max_wait和timeout的取值仅供参考。
   
   - 当操作系统版本低于Debian8、CentOS 5时，不支持配置agent访问OpenStack数据源。
   
   - CentOS、EulerOS操作系统必须要禁用默认的zeroconf路由，以便精确访问OpenStack数据源。 **echo "NOZEROCONF=yes" \>\> /etc/sysconfig/network**
     
   
   - apply_network_config: false为可选项，对于使用Cloud-Init 18.3及以上版本的用户，需添加此配置项。
     
4. 在配置文件"/etc/cloud/cloud.cfg"中补充如下内容。 **manage_etc_hosts: localhost**
   防止启动虚拟机时，系统长时间卡在"Waiting for cloudResetPwdAgent"状态。
   图2新增manage_etc_hosts: localhost   
   ![](https://support.huaweicloud.com/bestpractice-ims/zh-cn_image_0000002262379957.png "点击放大") 
5. 执行**vi /etc/ssh/sshd_config** 命令，在vi编辑器中打开"/etc/ssh/sshd_config"。
   将"sshd_config"中的"PasswordAuthentication"的值修改为"yes"。
   ![](https://support.huaweicloud.com/bestpractice-ims/public_sys-resources/note_3.0-zh-cn.png)
   如果是SUSE和openSUSE操作系统，需要同时配置"sshd_config"文件中的以下两个参数为"yes"。
   - PasswordAuthentication
   
   - ChallengeResponseAuthentication
     
6. 修改cloud.cfg配置文件里面的cloud_init_modules配置。
   - 将ssh从最后提前到第一位处理，提高ssh登录速度。
   
   - 开启机器名更新机制，请勿注释或删除" - update_hostname"语句。
     ```
     cloud_init_modules:
      - ssh
      - migrator
      - bootcmd
      - write-files
      - growpart
      - resizefs
      - set_hostname
      - update_hostname
      - update_etc_hosts
      - rsyslog
      - users-groups
     ```
     
    
7. 修改以下配置使得镜像创建的云服务器主机名不带".novalocal"后缀且主机名称中可以带点号。
   1. 执行如下命令，修改"__init__.py"文件。 **vi /usr/lib/python\*.\*/site-packages/cloudinit/sources/__init__.py**
      不同OS安装的**python**版本有差异，请选择对应的路径。
      按"i"进入编辑模式，根据关键字toks查询，修改内容如下信息所示。
      ```
      if toks:
          toks = str(toks).split('.')
      else:
          #toks = ["ip-%s" % lhost.replace(".", "-")] #屏蔽此行
          toks = lhost.split(".novalocal")    #增加此行
      if len(toks) > 1:
          hostname = toks[0]
          #domain = '.'.join(toks[1:]) #屏蔽此行
      else:
          hostname = toks[0]
      if fqdn and domain != defdomain:
           return hostname   
          #return "%s.%s" % (hostname, domain) #屏蔽此行
      else:
          return hostname
      ```
      修改完成后按"ESC"退出编辑模式，输入**:wq!**保存并退出。
      
   
   2. 执行如下命令进入"cloudinit/sources"文件夹。 **cd /usr/lib/python\*.\*/site-packages/cloudinit/sources/**
      不同OS安装的**python**版本有差异，请选择对应的路径。
      
   
   3. 执行如下命令，删除"__init__.pyc"文件和优化编译后的"__init__.pyo"文件。 **rm -rf __init__.pyc**
      **rm -rf __init__.pyo**
      
   
   4. 执行如下命令，清理日志信息。 **rm -rf /var/lib/cloud/\***
      **rm -rf /var/log/cloud-init\***
      删除/etc/cloud/cloud.cfg.d/目录下除了log相关配置文件外的所有文件。
      
    
8. 执行以下命令编辑Cloud-Init日志输出路径配置文件，设置日志处理方式handlers，建议配置为cloudLogHandler。 **vim /etc/cloud/cloud.cfg.d/05_logging.cfg**
   ```
   [logger_cloudinit]
   level=DEBUG
   qualname=cloudinit
   handlers=cloudLogHandler
   propagate=1
   ```
   
9. 确保删除镜像模板中已经存在的linux账户和"/home/linux"目录。 **userdel linux**
   **rm -fr /home/linux**
   
10. 确保Cloud-Init启用。 若存在/etc/cloud/cloud-init.disabled文件，则执行**cloud-init clean --machine-id**，否则跳过。
    
 
#### 检查Cloud-Init工具相关配置是否成功
执行以下命令，无错误发生，说明Cloud-Init配置成功。
**cloud-init init --local**
正确安装的Cloud-Init会显示Cloud-Init的版本详细信息，并且无任何错误信息。例如，正确安装的情况下，不含有缺少文件的提示信息。
![](https://support.huaweicloud.com/bestpractice-ims/public_sys-resources/note_3.0-zh-cn.png)
执行如下命令，可将系统用户密码有效期设置为最大。此操作可选。
**chage -M 99999 $user_name**
其中，user_name为系统用户，例如root账户。
密码有效期建议设置为99999。
#### 安装一键式重置密码插件（可选）
为了保证使用生成的镜像创建的新云服务器可以实现一键式重置密码功能，建议您安装密码重置插件CloudResetPwdAgent，可以应用一键式重置密码功能，给云服务器设置新密码。
1. 下载一键式重置密码插件CloudResetPwdAgent。
   ![](https://support.huaweicloud.com/bestpractice-ims/public_sys-resources/note_3.0-zh-cn.png)
   虚拟机需要绑定弹性公网IP才能自动更新一键式重置密码插件。
   下载并解压软件包CloudResetPwdAgent.zip。
   32位操作系统下载地址：http://cn-south-1-cloud-reset-pwd.obs.cn-south-1.myhuaweicloud.com/linux/32/reset_pwd_agent/CloudResetPwdAgent.zip
   64位操作系统下载地址：http://cn-south-1-cloud-reset-pwd.obs.cn-south-1.myhuaweicloud.com/linux/64/reset_pwd_agent/CloudResetPwdAgent.zip
   
2. 执行以下命令，解压软件包CloudResetPwdAgent.zip。 **unzip -o -d** *插件解压目录* **CloudResetPwdAgent.zip**
   安装一键式重置密码插件对插件的解压目录无特殊要求，请自定义。例如插件解压的目录为"/home/PwdAgent/test"，则命令如下：
   **unzip -o -d /home/PwdAgent/test CloudResetPwdAgent.zip**
   
3. 安装一键式重置密码插件。
   1. 执行以下命令，进入文件CloudResetPwdAgent.Linux。 **cd CloudResetPwdAgent/CloudResetPwdAgent.Linux**
      
   
   2. 执行以下命令，添加文件setup.sh的运行权限。 **chmod +x setup.sh**
      
   
   3. 执行以下命令，安装插件。 **sudo sh setup.sh**
      如果脚本执行成功打印"cloudResetPwdAgent install successfully."，且未打印"Failed to start service cloudResetPwdAgent"，表示安装成功。
      ![](https://support.huaweicloud.com/bestpractice-ims/public_sys-resources/note_3.0-zh-cn.png)
      如果密码重置插件安装失败，请检查安装环境是否符合要求，并重试安装操作。
      
    
 
#### 配置NetworkManager
Linux操作系统新增使用NetworkManager来自动化主机的网络配置的方式。新版本操作系统推荐使用NetworkManager的方法。如果您不想使用NetworkManager，可以使用内核原生的网络管理服务。
#### Red Hat、Oracle、CentOS 6.x\&7.x、EulerOS 2.x和Fedora 22及以上版本
请执行如下操作，使用NetworkManager自动化虚拟机的网络配置。
1. 执行如下命令安装NetworkManager。 **yum install NetworkManager**
   
2. 在"/etc/sysconfig/network-scripts/"目录下删除ifcfg-eth1到ifcfg-eth11，只保留ifcfg-eth0。
3. 执行如下命令，关闭network。 **service network stop**
   
4. 执行如下命令，关闭network自启动。 **chkconfig network off**
   
5. 执行如下命令，重启messagebus和NetworkManager，并设置NetworkManager开机自启动。 **service messagebus restart**
   **service NetworkManager restart**
   **chkconfig NetworkManager on**
   
 
#### Debian 9.0及以上版本
请执行如下操作，使用NetworkManager自动化虚拟机的网络配置。
1. 执行如下命令安装NetworkManager。 **apt-get install network-manager**
   
2. 在"/etc/NetworkManager/NetworkManager.conf"里修改为此设置：managed=true。
3. 修改"/etc/network/interfaces"只保留eth0。
4. 执行如下命令，关闭network，重启messagebus和NetworkManager，并设置NetworkManager开机自启动。 **service network-manager restart**
   **chkconfig network-manager on**
   **service networking stop**
   **service messagebus restart**
   **service network-manager restart**
   
 
#### Ubuntu 14及以上版本
请执行如下操作，使用NetworkManager自动化虚拟机的网络配置。
1. 执行如下命令安装NetworkManager。 **apt-get install network-manager**
   
2. 在"/etc/NetworkManager/NetworkManager.conf"里修改为此设置：managed=true。
3. 修改"/etc/network/interfaces"只保留eth0。
4. 执行如下命令，关闭network。 **service networking stop**
   
5. 执行如下命令，关闭network自启动。 **chkconfig network off**
   
6. 执行如下命令，重启dbus和NetworkManager。 **service dbus restart**
   **service network-manager restar** **t**
   
 
#### SUSE 11 SP3和openSUSE 13及以上版本
请执行如下操作，使用NetworkManager自动化虚拟机的网络配置。
1. 在"/etc/sysconfig/network-scripts/"目录下删除ifcfg-eth1到ifcfg-eth11，只保留ifcfg-eth0。
2. 执行如下命令安装NetworkManager。 **zypper install NetworkManager**
   
3. 打开"YaST \> 网络设置"，在"全局选项 \> 网络安装方法"中将"通过ifup的传统方法"修改为"通过NetworkManager的用户控制方法"。
 
