[Megoldva]{Új probléma?} qcow2 partícionálás szkriptből

Fórumok

Egy pár órája már próbálkozom a qemu-nak előállítani egy gépet szkriptből. A szkript könyvtárba (chroot) elkészíti amit szeretnék, tovább akartam lépni, hogy egy qcow2-t csináljak neki, de valamit benézek vagy nagyon nem tudok, mert nem tudom bash szkriptből létrehozni a kívánt virtuális lemezt. Ha az üres qcow2-t átadom a qemunak egy live-dvd-vel, akkor tudom partícionálni a működő vm-ben, de nem ez lenne a cél :(

Egy kis segítségre lenne szükségem, mert ilyet még nem csináltam.! Ez volna a szkript idevágó része:

#!/bin/bash

# Elérési útvonalak
IMG_FILE="img.qcow2"
IMG_SIZE="32G"
EFI_PARTITION_SIZE="512M"
BOOT_PARTITION_SIZE="5G"

# QEMU kép létrehozása
qemu-img create -f qcow2 "${IMG_FILE}" "${IMG_SIZE}"

# Loop eszköz létrehozása
losetup -fP "${IMG_FILE}"
LOOP_DEVICE=$(losetup -l | grep "${IMG_FILE}" | awk '{print $1}')

# Partíciók létrehozása és formázása
parted -s "${LOOP_DEVICE}" mklabel gpt
parted -s "${LOOP_DEVICE}" mkpart primary fat32 1MiB "${EFI_PARTITION_SIZE}"
parted -s "${LOOP_DEVICE}" set 1 boot on
parted -s "${LOOP_DEVICE}" mkpart primary ext4 "${EFI_PARTITION_SIZE}" "${BOOT_PARTITION_SIZE}"
parted -s "${LOOP_DEVICE}" mkpart primary btrfs "${BOOT_PARTITION_SIZE}" 100%
mkfs.fat -F32 "${LOOP_DEVICE}p1"
mkfs.btrfs "${LOOP_DEVICE}p2"
mkfs.btrfs "${LOOP_DEVICE}p3"

# Partíciók csatolása
mount "${LOOP_DEVICE}p2" /mnt
mkdir -p /mnt/boot
mount "${LOOP_DEVICE}p1" /mnt/boot
mkdir -p /mnt/boot/efi
mount "${LOOP_DEVICE}p3" /mnt/boot/efi

# rendszer telepítése lenne ha lenne hová

# Visszaállítjuk a loop eszközt
losetup -d "${LOOP_DEVICE}"

A futtatás ereménye:

# ./make.disk 
Formatting 'img.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=34359738368 lazy_refcounts=off refcount_bits=16
Error: The location 1MiB is outside of the device /dev/loop0.
Error: Partition doesn't exist.
Error: The location 512M is outside of the device /dev/loop0.
Error: The location 5G is outside of the device /dev/loop0.

Egy elindított livecd-vel tudom partícionálni. Hogyan kell kezelni szkriptből?

Hozzászólások

ha jol tudom a qcow2 nem csak blokk fajl, van rajta qcow2 struktura is.

csinalj inkabb raw-ot, legfeljebb utana konvertald at qcow2-re ha szukseges.

neked aztan fura humorod van...

Szia!

Előszőr "raw" fájt hozz létre, azt formázd/partcionáld - és a legvégén át kell konvertálni qcow2 -be,
qcow2 konténer formátum, több minden van benne, nem csak a "disk" önmagában.
 

IMG_FILE="img.raw"
IMG_SIZE="32G"

# sparse file #
dd if=/dev/zero of="${IMG_FILE}" bs=1 count=0 seek="${IMG_SIZE}"

LOOP_DEVICE=$(losetup -f)
losetup "${LOOP_DEVICE}" "${IMG_FILE}"

....

losetup -d "${LOOP_DEVICE}"

qemu-img convert -O qcow2 "${IMG_FILE}" "${IMG_FILE}.qcow2"

Még arra figyelj ha a sparse-file mountolod, akkor  a mountban -o discard=0 legyen beállítva.
Értelem szerűen, ha ezt módosítani akarod, akkor a qcow2 -t raw-ba kell konvertálni majd vissza qcow2-be.
 

Köszönöm, ez volt a megoldás! Közben kicsit átszabtam a méretet...

 

#!/bin/bash

# Definiciók
IMG_FILE="gentoo.qcow2"
IMG_SIZE="5192M"
EFI_PARTITION_SIZE="512M"
BOOT_PARTITION_SIZE="2048M"

# QEMU raw képfájl létrehozása
qemu-img create -f qcow2 "${IMG_FILE}" "${IMG_SIZE}"

# Loop eszköz hozzárendelése a raw képfájlhoz
modprobe nbd max_part=8
qemu-nbd --connect=/dev/nbd0 "${IMG_FILE}"

# Partíció ellenőrzése
fdisk /dev/nbd0 -l

# Partíciók létrehozása és formázása
parted -s "/dev/nbd0" mklabel gpt
parted -s "/dev/nbd0" mkpart ESP fat32 1MiB "${EFI_PARTITION_SIZE}"
parted -s "/dev/nbd0" set 1 esp on
parted -s "/dev/nbd0" mkpart primary btrfs "${EFI_PARTITION_SIZE}" "${BOOT_PARTITION_SIZE}"
parted -s "/dev/nbd0" mkpart primary btrfs "${BOOT_PARTITION_SIZE}" 100%

# Loop eszköz újratöltése a partíciók érvénybe lépéséhez
partprobe "/dev/nbd0"

# Partíciók formázása
mkfs.fat -F32 "/dev/nbd0p1"
mkfs.btrfs "/dev/nbd0p2"
mkfs.btrfs "/dev/nbd0p3"


fdisk /dev/nbd0 -l
sleep 5
qemu-nbd --disconnect /dev/nbd0

echo "A képfájl és a partíciók elkészültek."

„Niemand ist unnütz! Man kann immer noch als schlechtes Beispiel dienen!”

dzsolt

Az alap probléma ugyan megoldódott, de felmerült(ek) további(ak). Azt lenne jó valahogyan kilistázni, hogy melyik nbd melyik img-hez van csatolva. Ez azért lenne fontos, mert kibővítettem az első szabad nbd megkeresésével és arra az esetre ha elfogyna az nbd, kilöki a csatolásokat és újrahúzza a modult az alapértelmezett 16 helyett az aktuális érték+16-al és eszközönként 8 partícióval (ez csak elég lesz tán), ezen a ponton jó lenne elmenteni az aktuális csatolásokat és újra csatolni amikor a modult újratöltötte.

„Niemand ist unnütz! Man kann immer noch als schlechtes Beispiel dienen!”

dzsolt

off

Aki awk előtt grep-et futtat, az egyéb aljasságokra is képes. :)

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Az igazsághoz az is hozzátartozik, hogy van amikor effektívebb. Mondjuk hibásan írtad a scriptet, mert a filenévben lévő pont karakter az regexben egy karakternyi bármit jelent, szóval grep -F lenne az helyesen. Ha viszont átadod a paramétert az awk-nak, akkor ott előbb a BEGIN szekcióban helyettesítéssel escape-elni kell a '.'-ot egy '\' karakterrel, szóval lehet, hogy a grep -F ronda, de egyszerűbb.

Én azért általában színtisztán awk-ban írom az ilyesmit, de a mai gépteljesítményeknél pont nem érdekes, csak szépészet. :)

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Szerintem a kódodban nincs vele baj. Épp néztem is, hogy nem olyan rossz kód, igaz egyszerű is, szóval elég nehéz lenne benne annyira valamit elrontani. Max. ha annyira bele kéne kössek, az az, hogy Bash-ra van dependelve, mikor semmi Bash only szintaxist vagy funkciót nem használ, jobb lenne a #!/bin/sh hívása a fejlécben. Persze ez a /bin/sh a legtöbb linuxos rendszeren csak egy symlink, tipikusan a /bin/bash-ra, de néhány rendszeren más lehet a helyzet, pl. BSD-ken lehet csak sh, ksh, csh, zsh, stb. van, vagy Linuxon Dash, zsh, stb.. Ha meg mindenképp Bash-re akarod, akkor mostanában a #!/bin/usr/env bash formát ajánlják.

A computer is like air conditioning – it becomes useless when you open Windows.” (Linus Torvalds)

Kérdés, mennyire kell hordozhatónak lennie. Otthonra simán bedrótozom én is a bash-t, bár ki is szoktam használni a bash-only lehetőségeket. A -F viszont hiányzott, mert az "img.qcow2" illeszkedik például a valamiimgqqcow2blabla filenévre is. Illetve ehhez a -F kevés. Inkább:

IMG_FILE='img\.qcow2'
grep "^${IMG_FILE}\$"

Ha meg szépen akarjuk, akkor a pontot mindenképpen cserélni kell \.-ra.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Ezen évekkel ezelőtt törtem a fejem amikor az első rövidebb dolgaimat tettem szkriptbe, de mivel már akkor sem volt önálló az sh, bash maradt. Mi lenne az előnye a #!/bin/usr/env bash formának?

„Niemand ist unnütz! Man kann immer noch als schlechtes Beispiel dienen!”

dzsolt