Tambahkan skrip parsing ke image Linux yang menggunakan versi OS tidak didukung oleh ECS dan tidak kompatibel dengan cloud-init agar memungkinkan konfigurasi otomatis saat boot pertama.
Image Linux dengan versi OS tidak didukung dianggap sebagai image platform non-standar. Image ini berbasis sistem operasi standar tetapi memiliki sistem file, lingkungan, atau aplikasi yang tidak memenuhi persyaratan platform. Pilih salah satu opsi OS Version berikut saat mengimpor:
-
Others Linux: ECS tidak memproses instans yang dibuat dari jenis image ini. Anda harus mengonfigurasi alamat IP, entri rute, kata sandi, dan pengaturan lainnya secara manual setelah instans dibuat.
-
Customized Linux: Memerlukan konfigurasi yang dijelaskan dalam topik ini sebelum diimpor.
Prasyarat
Image harus memenuhi persyaratan berikut:
-
Partisi pertama (biasanya /dev/sda1 atau /dev/vda1) memiliki izin tulis.
-
Partisi pertama menggunakan FAT32, EXT2, EXT3, EXT4, atau UFS sebagai sistem file-nya.
CatatanJalankan
blkid /dev/sdXnuntuk memeriksa jenis sistem file. Ganti /dev/sdXn dengan path partisi pertama yang sebenarnya, misalnya /dev/sda1. -
Ukuran virtual image melebihi 5 GiB.
CatatanJalankan
df -h /dev/sdXnuntuk memeriksa ruang partisi. Ganti /dev/sdXn dengan path partisi pertama yang sebenarnya, misalnya /dev/sda1.
Prosedur
-
Login ke mesin virtual sumber sebagai pengguna root.
-
Buat direktori bernama
aliyun_custom_imagedi direktori root partisi pertama.mkdir /aliyun_custom_imageSaat boot pertama, Alibaba Cloud menulis informasi instans—seperti hostname, password pengguna root, dan alamat Server DNS—ke file
os.confdi direktorialiyun_custom_image. Sistem membuat fileos.confsecara otomatis jika belum ada.Contoh isi file
os.conf:hostname=<yourHostName> password=<yourPassword> eth0_ip_addr=10.0.0.2 eth0_mac_addr=00:xx:xx:xx:xx:23 eth0_netmask=255.255.255.0 eth0_gateway=10.0.0.1 eth0_route="0.0.0.0/0 10.0.0.1" dns_nameserver="7.7.X.X 8.8.8.8"Parameter dalam contoh:
Parameter
Deskripsi
hostnameHostname instans.
passwordPassword pengguna root.
eth0_ip_addrAlamat IP NIC eth0.
eth0_mac_addrAlamat MAC NIC eth0.
eth0_netmaskSubnet mask NIC eth0.
eth0_gatewayAlamat IP gateway default eth0.
eth0_routeEntri rute internal untuk eth0. Dipisahkan dengan spasi.
dns_nameserverAlamat Server DNS. Dipisahkan dengan spasi.
-
Buat skrip parsing, misalnya file layanan bernama
customized-config.service, untuk membaca dan menerapkan konfigurasi sistem dari fileos.conf.Skrip ini dijalankan saat boot pertama untuk mengonfigurasi hostname, password pengguna root, alamat Server DNS, dan pengaturan jaringan.
Contoh skrip:
#!/bin/bash ### BEGIN INIT INFO # Provides: os-conf # Required-Start: $local_fs $network $named $remote_fs # Required-Stop: # Should-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: The initial os-conf job, config the system. ### END INIT INFO first_partition_dir='/boot/' os_conf_dir=${first_partition_dir}/aliyun_custom_image os_conf_file=${os_conf_dir}/os.conf load_os_conf() { if [[ -f $os_conf_file ]]; then . $os_conf_file return 0 else return 1 fi } cleanup() { # pastikan $os_conf_file dihapus, untuk menghindari konfigurasi sistem berulang rm $os_conf_file >& /dev/null # pastikan $os_conf_dir tersedia mkdir -p $os_conf_dir } config_password() { if [[ -n $password ]]; then password=$(echo $password | base64 -d) if [[ $? == 0 && -n $password ]]; then echo "root:$password" | chpasswd fi fi } config_hostname() { if [[ -n $hostname ]]; then sed -i "s/^HOSTNAME=.*/HOSTNAME=$hostname/" /etc/sysconfig/network hostname $hostname fi } config_dns() { if [[ -n $dns_nameserver ]]; then dns_conf=/etc/resolv.conf sed -i '/^nameserver.*/d' $dns_conf for i in $dns_nameserver; do echo "nameserver $i" >> $dns_conf done fi } is_classic_network() { # vpc: eth0 # classic: eth0 eth1 grep -q 'eth1' $os_conf_file } config_network() { /etc/init.d/network stop config_interface eth0 ${eth0_ip_addr} ${eth0_netmask} ${eth0_mac_addr} config_route eth0 "${eth0_route}" if is_classic_network ; then config_interface eth1 ${eth1_ip_addr} ${eth1_netmask} ${eth1_mac_addr} config_route eth1 "${eth1_route}" fi /etc/init.d/network start } config_interface() { local interface=$1 local ip=$2 local netmask=$3 local mac=$4 interface_cfg="/etc/sysconfig/network-scripts/ifcfg-${interface}" cat << EOF > $interface_cfg DEVICE=$interface IPADDR=$ip NETMASK=$netmask HWADDR=$mac ONBOOT=yes BOOTPROTO=static EOF } config_default_gateway() { local gateway=$1 sed -i "s/^GATEWAY=.*/GATEWAY=$gateway/" /etc/sysconfig/network } config_route() { local interface=$1 local route="$2" route_conf=/etc/sysconfig/network-scripts/route-${interface} > $route_conf echo $route | sed 's/;/\n/' | \ while read line; do dst=$(echo $line | awk '{print $1}') gw=$(echo $line | awk '{print $2}') if ! grep -q "$dst" $route_conf 2> /dev/null; then echo "$dst via $gw dev $interface" >> $route_conf fi if [[ "$dst" == "0.0.0.0/0" ]]; then config_default_gateway $gw fi done } ################## sysvinit service portal #################### start() { if load_os_conf ; then config_password config_network config_hostname config_dns cleanup return 0 else echo "not load $os_conf_file" return 0 fi } RETVAL=0 case "$1" in start) start RETVAL=$? ;; *) echo "Usage: $0 {start}" RETVAL=3 ;; esac exit $RETVAL -
Aktifkan skrip agar dijalankan saat startup sistem.
Perintah berikut ditujukan untuk Ubuntu. Sesuaikan dengan sistem operasi Anda.
sudo systemctl daemon-reload sudo systemctl enable customized-config.serviceCatatanCustom image yang dibuat dari instans Customized Linux mewarisi skrip startup ini. Alibaba Cloud hanya menerapkan pengaturan
os.confsaat boot pertama.
Referensi
Setelah dikonfigurasi, pilih Customized Linux sebagai OS Version saat Anda mengimpor custom image.