Hai intenzione di eseguire Red Hat Enterprise Linux (RHEL) su Azure o ci stai pensando, ma vuoi creare le tue immagini? In questo articolo, mi concentrerò sulla creazione di un'immagine RHEL 7 da eseguire su istanze di Azure Mv2 (ovvero Hyper-V Generation 2). La principale differenza rispetto a un'immagine standard è che utilizzerai l'interfaccia UEFI (Unified Extensible Firmware Interface) e pertanto sono necessarie opzioni aggiuntive.
Oltre al focus principale su Mv2, ti fornirò anche un buon set di comandi di partenza in modo da poter automatizzare il processo di creazione di quelle immagini ed eventualmente integrare quel processo nella tua pipeline CI/CD.
La maggior parte di queste istruzioni dovrebbe essere applicabile anche per la creazione di immagini di Red Hat Enterprise Linux 8, ma quella versione non era il mio obiettivo principale.
Configurazione dell'ambiente
Come ambiente di compilazione, Red Hat Enterprise Linux 8 ci fornisce il set di strumenti corretto per creare immagini avviabili UEFI. Per riprodurre tutto qui, avrai bisogno dei seguenti pacchetti installati:
libvirt-client
virt-install
libvirt
libvirt-daemon-kvm
azure-cli
(istruzioni qui)azcopy
(istruzioni qui) nel$PATH
(es./usr/bin/
o~/bin/
)
Avrai anche bisogno di una copia del DVD dei binari di Red Hat Enterprise Linux 7.7, che puoi scaricare qui se hai un abbonamento Red Hat valido. Salva questo DVD come /var/lib/libvirt/images/rhel-server-7.7-x86_64-dvd.iso
.
Nota: Qualsiasi altra versione basata su Red Hat Enterprise Linux 7 o 8 dovrebbe farlo, ma questa procedura dettagliata è stata testata con 7.7.
Affinché quanto sopra funzioni se sei in esecuzione su una VM, avrai bisogno di KVM abilitato sull'host o passato alla VM. Se vuoi eseguire questo esempio su una VM remota o in un'altra pipeline CI/CD, ho fatto esattamente questo per poter automatizzare il processo, quindi puoi eseguire questo headless (senza X, interfaccia utente grafica e X inoltro necessario).
Costruzione di un'immagine in modo automatizzato
Abbiamo bisogno di alcuni pacchetti installati nella nostra immagine più alcune configurazioni impostate e si consiglia di installare il client Azure. Mentre stavo cercando il modo migliore per installare questo client in modo automatizzato, l'unica opzione che ho trovato è stata ottenerlo dal repository extra di CentOS 7 (contattami e fammi sapere se conosci un modo migliore).
Un esempio di kickstart.cfg
il file può essere ottenuto qui. Adattalo alle tue esigenze, ma assicurati di lasciare almeno la configurazione di rete impostata su DHCP.
Costruzione dell'immagine con il file Kickstart e un semplice comando
Per creare l'immagine:
$ sudo virt-install \
--name rhel77 \
--memory 4096 \
--vcpus 4 \
--boot uefi \
--os-variant rhel7.7 \
-l /var/lib/libvirt/images/rhel-server-7.7-x86_64-dvd.iso \
--disk size=4 \
--initrd-inject $(pwd)/kickstart.cfg \
--extra-args="ks=file:/kickstart.cfg console=tty0 console=ttyS0,115200n8" \
--graphics=none \
--network network=default \
--noreboot
Come accennato in precedenza, dovrai avere l'immagine del DVD nella posizione corretta. Il mio esempio presuppone che tu:
- Avere
kickstart.cfg
nel tuo attuale$PWD
. - Vuoi un disco da 4 GB.
- Stai usando il tuo
libvirt
locale /Installazione KVM. - Non ho requisiti speciali per quanto riguarda l'interfaccia di rete (sto usando le impostazioni predefinite).
Conversione dell'immagine nel formato corretto
Ho faticato a convertire l'immagine nel formato giusto, ma con i colleghi amichevoli e Google, ho finalmente capito il formato richiesto:VHD allineato a 1 MB.
L'ultima immagine creata dovrebbe essere quella corretta:
$ image=$(ls -1tr /var/lib/libvirt/images/rhel*|tail -1)
Usa sudo per accedere all'immagine, convertila in RAW e inseriscila nell'attuale $PWD
$ sudo qemu-img convert -f qcow2 -O raw $image rhel-7.7.raw
Assicurati di potervi accedere - dopo questo punto, un "normale" (ad es. l'uso non root può continuare)
$ sudo chown $(whoami) *.raw
Calcola la dimensione dell'immagine.
$ MB=$((1024*1024)) size=$(qemu-img info -f raw --output json "rhel-7.7.raw" | \ gawk 'match($0, /"virtual-size": ([0-9]+),/, val) {print val[1]}') rounded_size=$((($size/$MB + 1)*$MB))
Ridimensiona l'immagine.
$ sudo qemu-img resize -f raw rhel-7.7.raw $rounded_size
Converti l'immagine da RAW a VHD e forza la dimensione corretta
$ sudo qemu-img convert -f raw -o subformat=fixed,force_size -O vpc rhel-7.7.raw rhel-7.7.vhd
Creazione di un gruppo
Ora hai la tua immagine personalizzata di Red Hat Enterprise Linux 7. Probabilmente ti starai chiedendo come caricarlo in Azure e usarlo per eseguire un'istanza. Leggi oltre. Dato che dovevo testare l'intero processo di creazione, l'ho fatto anche io.
Avrai sempre bisogno di un gruppo di risorse in Azure. Ho scelto westus2
come la mia regione, ma anche qualsiasi altro dovrebbe fare (se hanno istanze Mv2). Il nome del mio gruppo di risorse è semplicemente myresourcegroup
. Se vuoi usare un altro nome, dovrai sostituirlo ovunque l'ho usato.
Per creare il tuo gruppo, crea un gruppo di risorse AZ in westus2 e denomina "myresourcegroup".
$ sudo az group create -l westus2 -n myresourcegroup
Caricare l'immagine del disco e renderla un'immagine di Azure
Per caricare l'immagine del disco e trasformarla in un'immagine di Azure, crea il disco in Azure con il nome "rhel-7", nel nostro gruppo di risorse creato in precedenza "myresourcegroup".
$ sudo az disk delete --name rhel-7 -g myresourcegroup -y
Assicurati che sia Hyper-V Gen 2 e il tipo di sistema operativo Linux con le dimensioni corrette.
$ sudo az disk create --hyper-v-generation V2 -g myresourcegroup -n rhel-7 --os-type Linux -l westus2 --for-upload --upload-size-bytes $(wc -c rhel-7.7.vhd|awk '{ print $1 }') --sku standard_lrs
Hai bisogno di un SASURI per il caricamento.
$ SASURI=$(az disk grant-access -n rhel-7 -g myresourcegroup --access-level Write --duration-in-seconds 86400 --query [accessSas] -o tsv)
Questo utilizza azcopy
per copiare l'immagine (azcopy
deve essere nel tuo $PATH
da qualche parte)
$ sudo azcopy $(pwd)/rhel-7.7.vhd $SASURI --blob-type PageBlob
Al termine del caricamento, è necessario revocare l'accesso, altrimenti l'immagine del disco non può essere utilizzata.
$ sudo az disk revoke-access -n rhel-7 -g myresourcegroup
Infine, contrassegnala come immagine del sistema operativo Hyper-V, Gen 2.
$ sudo az image create -g myresourcegroup -n rhel-7 --os-type Linux --hyper-v-generation V2 --source rhel-7
Esecuzione dell'immagine
Si potrebbe immaginare che a questo punto tutto fosse chiaro e che eseguire un'immagine sarebbe stato facile. Se hai tutto correttamente a posto, sì, è vero. Ma quando ho lavorato su questo esempio, mi sono completamente dimenticato dell'ultimo passaggio del paragrafo precedente e non ho contrassegnato l'immagine del disco come un'immagine di Azure, il che ha comportato l'impossibilità di fornire la chiave SSH o admin-username
.
Ad ogni modo, con le istruzioni di cui sopra, dovresti essere pronto per eseguire l'immagine. Il comando seguente presuppone che tu stia eseguendo questo strumento come utente root e che utilizzi la chiave SSH dell'utente root. Adatta quello che ho qui alle tue esigenze:
$ sudo az vm create \
--resource-group myresourcegroup \
--location westus2 \
--name rhel-7 \
--image rhel-7 \
--admin-username cloud-user \
--ssh-key-value @/root/.ssh/id_rsa.pub
Se hai bisogno della diagnostica di avvio, dovrai creare un cosiddetto account di archiviazione con il nome "storageaccount123" utilizzando il comando seguente:
$ sudo az storage account create -n storageaccount123 -g myresourcegroup -l westus2 --sku Standard_LRS
Quanto sopra az vm create
il comando deve essere esteso con il parametro seguente per registrare la diagnostica di avvio e i messaggi nell'account di archiviazione appena creato:
--boot-diagnostics-storage storageaccount123
Nota: Non è necessario abilitare la diagnostica di avvio e, in tal caso, dovrai sicuramente adattare il nome dell'account di archiviazione.
Accesso all'istanza di Azure
Da az vm create
comando, dovresti ottenere un output contenente l'indirizzo IP. Ora dovresti essere in grado di accedere automaticamente, dato che la chiave SSH è fornita con:
$ ssh cloud-user@<azure-ip>
Conclusione
Prima di esplorare le possibilità di creare immagini di Red Hat Enterprise Linux 7 per le istanze di Azure Mv2 in modo automatizzato, non avevo precedenti esperienze con Azure, quindi è stato un bel viaggio. Non mi considererei ancora un esperto quando si tratta di Azure e probabilmente mancano delle cose. Mi piacerebbe sentire le vostre opinioni per migliorare questa configurazione, se necessario.
Gli script e i comandi che ho usato per questo articolo possono essere trovati qui. Le richieste pull sono benvenute, così come i cloni!
Vuoi provare Red Hat Enterprise Linux? Scaricalo ora gratuitamente.