QEMU nad LVM se zasekává

RDa

  • *****
  • 2 737
    • Zobrazit profil
    • E-mail
QEMU nad LVM se zasekává
« kdy: 03. 10. 2024, 18:49:04 »
Ahoj, posledni dobou se me deje podivna vec - QEMU proces se zasekne v neprerusitelnem sleepu (top: D state).

Konfigurace stacku je tahle:

- gentoo linux 6.11.0
- md raid1 mirror (hdd+ssd)
- lvm (pv/vg/lv)
- losetup ( posun o 1 sektor )
- qemu (9.0.2)
- winxp

Kdyz se to zasekne, tak nefunguje ani RDP z guestu (winxp), a celkove Qemu zhebne (nefunguje ani remote spice klient - a ani pripojeni na lokalni monitoring socket).

A co vic, nefunguje ani lvs prikaz na vypsani logical volumes. Proste taky D state a zasekne se.

strace lvs - me rikal posledne, ze to pouziva async io.. tak jsem podezrival tohle - pridal jsem do qemu option na disk ve tvaru ,aio=threads, ale neni s tim rozdil. Po tydnu se to ted seklo zas.

Stav je to docela neprijemny, protoze se host os neda vypnout ani restartnout - musim shodit ostatni VM, vsechny sluzby a pak to navrdo resnout, doufajic, ze systemovy oddil prezije (zatim nizsi jednotky tvrdych resetu to dalo... ext4 nad lvm).

Mam podezreni ze se sekne nejake uzamykani v jadre - ale netusim kde se divat.

Na starem jadru co tam bylo predtim to nedelalo zadny problem, ale to tam vracet nechci (6.6.52), plus byla nejaka podstatna zmena konfigurace, abych novym jadrem pokryl a sjednotil vicero stroju.

Jak by jste ladili takovou vec, co se objevi jednou za tyden? (tedy, pred tydnem jsem to potkal asi 3x v rade prvni den.. pak vznikl dodatek qemu konfigurace s aio=threads)

v lsof nejak nepoznam, na ktery fd to delalo jakou operaci? nebo jinde v sysfs? Neco jako show in-flight syscalls ?

Je fakt blby ze neni nejaky unlocker, na tyhle kernel-side locknute IO.
Klidne za cenu ze ta aplikace dostane error, spatna data nebo bude ukoncena v momente navratu syscallu.

EDIT:
pridal jsem sysrq podporu do jadra, az to padne priste at muzu udelat ten w command:
https://www.suse.com/support/kb/doc/?id=000016919
« Poslední změna: 03. 10. 2024, 18:54:16 od RDa »


Re:QEMU nad LVM se zasekává
« Odpověď #1 kdy: 04. 10. 2024, 12:33:46 »
Úplně si nemyslím, že by šlo o nějaké špatné, nebo chybné zamykání. Přestože tam samozřejmě může být bug, regrese v jádře (zvlášť jestli máš rolling distribuci), tak mi to spíš přijde jako nějaký problém s konkrétními blok zařízeními v těch spodních vrstvách, čeká to na nějaký I/O timeout, který ze propaguje výš a poslední userspace proces, co je použil zůstává v D state.
Měl jsem např. podobné zátuhy s iSCSI externím disk. polem (hw -> target -> initiator -> multipath a LVM -> fs).

Tím, že blbnou i LVM příkazy jako lvs atp., tak bych z toho asi rovnou vyloučil QEMU a jiné userspace procesy, jejich zátuh už bude jen logický důsledek.
Kdyby to nastalo znovu, tak bych asi zkusil pro info.
- zkontrolovat dmesg (hlášky o timeoutech pro operaci na md nebo blok. zařízeních)
- spustit /sbin/dmsetup info + zkouknout, jestli není nějaké zařízení SUSPENDED místo ACTIVE
- podíval se, v jakém stavu jsou fyz. bloková zařízení pod tím raidem
např. cat /sys/block/sda/device/state a mělo by to vypsat running

Co bych případně zkusil dál.
- v případě, že tam bude dmsetup info vypisovat nějaké suspended zařízení, můžeš ho zkusit znovu manuálně nahodit přes dmsetup resume
- projet SMART u těch disků, jestli se tam nekumulují nějaké chyby přenosu na sběrnici
- nedělá se v tu dobu něco jako periodický fstrim (pokud to přes tu kaskádu vůbec proleze)?
- koncentroval bych se na divnosti ;)
Vím, že jste ten hybrid mirror s HDD+SSD mirrorem a write-mostly zmiňovali s F. Kučerou. I když by to asi mělo fungovat, pořád mi přijde, že jsou to zařízení s výrazně jinou charakteristikou a nepoužívá to úplně moc lidí (-> nebude to úplně masivně testované). V krajní možnosti, kdybych s tím nemohl hnout, tak bych po zálohování asi dočasně zfailoval přes mdadm jeden z těch disků a nechal to nějakou dobu běžet v degradovaném režimu, jestli to nebude mít pozitivní vliv s jedním zařízením.
- mrknul bych se na timeouty
Např. konkrétní SSD může mít nějaký déle běžící interní GC, který teoreticky způsobí, že to na chvíli vyhnije a nezapisuje.
U pokusů s timeouty mám typicky dvě strategie, buď výrazně zkrátit a čekat, jestli se nezvýší výskyt chyby, nebo rozumně prodloužit, pokud už tuším, a zkouším, jestli to pomůže.
Timeouty myslím třeba nastavení fyz blok. zařízení /sys/block/sda/device/timeout, nebo u NVME disků pak nastavení v modulu nvme_core (dá se poslat jako parametr jádra).
Nadto některé NVME disky mají také možnosti ovlivnit jejich chcípání a přecházení mezi power staty (APST) přes nvme set-feature.

Jen takový můj dump k tématu, může to být spoustou věcí..

P.S.: Co dělá ten losetup s offsetem 1s? To jsem nějak nepochopil, jakože tam je ještě další loop device jen kvůli tomu posuvu?

RDa

  • *****
  • 2 737
    • Zobrazit profil
    • E-mail
Re:QEMU nad LVM se zasekává
« Odpověď #2 kdy: 04. 10. 2024, 14:11:19 »
Zalozil jsem bug u Gentoo: https://bugs.gentoo.org/940751

jsou tam postnuty vysledky ze sysrq, a hnije to v kernelu, podle:

Kód: [Vybrat]
# ps auxf | grep D
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      7358  0.0  0.0      0     0 ?        D    11:32   0:00  \_ [kworker/u16:0+loop0]
root      9444  0.0  0.0      0     0 ?        D    11:52   0:00  \_ [kworker/u16:4+flush-251:4]

v dmesg zadny error neni, disky jsou lokalni a bez chyb ve smartu

raid je ok:
Kód: [Vybrat]
# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid10] [raid6] [raid5] [raid4]
md127 : active raid1 sdb2[2](W) sda2[0]
      976497664 blocks super 1.2 [2/2] [UU]
      bitmap: 3/8 pages [12KB], 65536KB chunk

unused devices: <none>

dm tohle?
Kód: [Vybrat]
# dmsetup info vg0-vmWinXP
Name:              vg0-vmWinXP
State:             ACTIVE
Read Ahead:        256
Tables present:    LIVE
Open count:        1
Event number:      0
Major, minor:      251, 4
Number of targets: 1
UUID: LVM-KVkZOEFX23Qn7J0YkaFkaSUxt5KAvpHnegGxabY0xaBAHNOpssPEPi7WY6lfC36W

Ten LOOP je tam takto:
Kód: [Vybrat]
# losetup -l
NAME       SIZELIMIT  OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC
/dev/loop0         0 1016320         1  0 /dev/dm-4   0     512

... tvoren prikazem:
Kód: [Vybrat]
losetup -o $(( 512 * ( 2048 - 63 ) )) "$DRIVE_BOOT" "$DRIVE_FILE"
A je to z duvodu, aby C: partisna byla 4K aligned (prakticky je 1MiB aligned). Na LVM je modifikovany obraz disku s winXP, kde byla prvni partisna posunuta na zarovnanou pozici - sektor 2048, ale ten originalni bootloader si s tim neporadi a nebootuje to - pak uz jsem nedohledal jak opravit bootovani, protoze:

... jsem vymyslel rovnak na ohybak: vzal tech 63 sektoru od pocatku disku (kde je bootloader), nakopiroval je pred hranici prvni partisny, a ve QEMU bootuji z toho posunuteho loopdevice. Vysledek je:
- guest si mysli ze ma C: zacinajici na 63 sektoru a tedy bootuje ok
- host ma data zarovnana

Ta LVM partisna tedy obsahuje dve partition tables, jedna je na zacatku s 2048 offsetem pro C:, druha je pred koncem 1M bloku s 63 offsetem pro C:, prostredek prvniho 1M bloku je pak nevyuzit.


PCnity

  • *****
  • 692
    • Zobrazit profil
    • E-mail
Re:QEMU nad LVM se zasekává
« Odpověď #3 kdy: 04. 10. 2024, 17:05:53 »
Aky zmysel ma ten loop dev nad LV? Nie je mozne spavit LV so spravnym alignemntom a pouzit priamo ten pre QEMU? Cisto v zmysle ze kazda vrstva navyse je potencialom pre dalsie bugy.

RDa

  • *****
  • 2 737
    • Zobrazit profil
    • E-mail
Re:QEMU nad LVM se zasekává
« Odpověď #4 kdy: 04. 10. 2024, 18:44:17 »
Aky zmysel ma ten loop dev nad LV? Nie je mozne spavit LV so spravnym alignemntom a pouzit priamo ten pre QEMU? Cisto v zmysle ze kazda vrstva navyse je potencialom pre dalsie bugy.

Precti si to jeste jednou, vysvetlil jsem to v predesle odpovedi, neco vice pak zde: https://superuser.com/questions/242313/can-windows-xp-be-installed-on-a-partition-that-starts-at-sector-64-on-advanced (a to mam SP3, ale nebootuje to odjinud, url na MS KB uz nefunguje.. proste jsem to vyresil nejsnadneji jak to slo)

Imho LVM nic takoveho sam neumi a jeho PE jsou nasobne vetsi nez rozmery/posuny o kterych se zde bavime.

Ze je dalsi vrstva, resp. specificka kombinace vrstveni nachylna na bugy - budiz. Ale od toho tady jsem a chci aby se prislo na to v cem se to sekne - a opravilo se to. Verim ze to pomuze nejenom me ale i jinym.


Re:QEMU nad LVM se zasekává
« Odpověď #5 kdy: 04. 10. 2024, 21:35:19 »
Zaujimavy problem. Bolo by dobre, kebyze vies poskytnut kernel dump ked dana situacia znova nastane. Predpokladam, ze to budu chciet od teba aj na bugs@gentoo.

I ked teda stack trace vyzera inak ako v tomto bugu, je to relativne cerstvy fix na podobne spravanie sa (deadlock) https://lore.kernel.org/linux-cve-announce/2024081734-CVE-2024-43855-b78a@gregkh/T/ , ale ta bola v 6.11.rc1 fixnuta.

Je sanca to vyskusat aj na starsich kerneloch?

RDa

  • *****
  • 2 737
    • Zobrazit profil
    • E-mail
Re:QEMU nad LVM se zasekává
« Odpověď #6 kdy: 04. 10. 2024, 23:20:34 »
Zaujimavy problem. Bolo by dobre, kebyze vies poskytnut kernel dump ked dana situacia znova nastane. Predpokladam, ze to budu chciet od teba aj na bugs@gentoo.

Na kernel dump se podivam a implementuji to podle https://wiki.gentoo.org/wiki/Kernel_Crash_Dumps
Da se to vyvolat pres sysrq ktery tam uz mam.


I ked teda stack trace vyzera inak ako v tomto bugu, je to relativne cerstvy fix na podobne spravanie sa (deadlock) https://lore.kernel.org/linux-cve-announce/2024081734-CVE-2024-43855-b78a@gregkh/T/ , ale ta bola v 6.11.rc1 fixnuta.

Je sanca to vyskusat aj na starsich kerneloch?

Podle me to neni co me potkava, protoze v tech verzich co jsem na tom stroji mel - jsou vsechny mimo affected seznam daneho CVE  (mam 6.1.19-67, ale affected je 6.1.75-102, 6.6.52 mam ale affected je .14-43, a nynejsi 6.11.0 neni affected).

Na predeslych jadrech mi to nedelalo - az zde na 6.11.0, ted mam 6.11.1 tak uvidim zda se to objevi - ale vypnul jsem to write-mostly od HDD z mirroru. Ono se to blbe ladi a nevim jak to vyvolat - leda pustit nejaky disk io tester v guestovi. Dnes to chciplo to chciplo za den - ale predtim jak jsem psal puvodni post to melo uptime 7 dnu a neco.


M Z

Re:QEMU nad LVM se zasekává
« Odpověď #7 kdy: 05. 10. 2024, 08:57:04 »
Zdravim,
mel bych jednu otazku a nemyslim to nijak zle, opravdu by me zajimal duvod. Proc Gentoo? Chapu Gentoo na desktopu, jsem hracicka a bavi me si s tim hrat. Nebo na serveru s nejakym exotickym SW ktery se stejne musi kompilovat, ale tady nic takoveho neni. Kernel, DM, LVM a QEMU, vse naprosto standardni veci u kterych ani neni mozne ocekavat nejaky narust vykonu. CPU se bude flakat a kdyz uz neco bude brzdit tak IO disku.
Pro me je tohle jasny priklad na stabilni Debian nebo nejaky z klonu Redhatu. Nainstaluji, nastavim, jednou za mesic udelam update a nekolik let nemusim nic resit.

RDa

  • *****
  • 2 737
    • Zobrazit profil
    • E-mail
Re:QEMU nad LVM se zasekává
« Odpověď #8 kdy: 05. 10. 2024, 09:22:27 »
Zdravim,
mel bych jednu otazku a nemyslim to nijak zle, opravdu by me zajimal duvod. Proc Gentoo? Chapu Gentoo na desktopu, jsem hracicka a bavi me si s tim hrat. Nebo na serveru s nejakym exotickym SW ktery se stejne musi kompilovat, ale tady nic takoveho neni. Kernel, DM, LVM a QEMU, vse naprosto standardni veci u kterych ani neni mozne ocekavat nejaky narust vykonu. CPU se bude flakat a kdyz uz neco bude brzdit tak IO disku.
Pro me je tohle jasny priklad na stabilni Debian nebo nejaky z klonu Redhatu. Nainstaluji, nastavim, jednou za mesic udelam update a nekolik let nemusim nic resit.

Uplne v pohode otazka - davno to neni o vykonu (ackoliv ano - mam AVX a moje instalace uz nebootuji na necem starsim nez 4th gen / Haswell) ale o moznostech pohodlne konfigurace, ktera je ve dvou rovinach
- po temer 20 letech v nem vim kde co nastavit, je tu i jeden stroj s ubuntu a systemd, ale to je pro me peklo
- a pak v instalaci mam hlavne to, co chci ja a nic navic


Treba zde u qemu na serveru viz volby:

Citace
$ emerge qemu -pv
[ebuild   R   ~] app-emulation/qemu-9.0.2-r2::gentoo  USE="aio bzip2 curl fdt filecaps gnutls jpeg ncurses nls oss pam pin-upstream-blobs png seccomp slirp spice vhost-net vnc xattr -accessibility -alsa -bpf -capstone -debug -doc -fuse -glusterfs -gtk -infiniband -io-uring -iscsi -jack -jemalloc -keyutils -lzo -multipath -nfs -numa -opengl -pipewire -plugins -pulseaudio -python -rbd -sasl -sdl -sdl-image (-selinux) -smartcard -snappy -ssh -static-user -systemtap -test -udev -usb -usbredir -vde -virgl -virtfs -vte -xdp -xen -zstd" PYTHON_TARGETS="python3_12 -python3_10 -python3_11" QEMU_SOFTMMU_TARGETS="x86_64 -aarch64 -alpha -arm -avr -cris -hppa -i386 -loongarch64 -m68k -microblaze -microblazeel -mips -mips64 -mips64el -mipsel -nios2 -or1k -ppc -ppc64 -riscv32 -riscv64 -rx -s390x -sh4 -sh4eb -sparc -sparc64 -tricore -xtensa -xtensaeb" QEMU_USER_TARGETS="-aarch64 -aarch64_be -alpha -arm -armeb -cris -hexagon -hppa -i386 -loongarch64 -m68k -microblaze -microblazeel -mips -mips64 -mips64el -mipsel -mipsn32 -mipsn32el -nios2 -or1k -ppc -ppc64 -ppc64le -riscv32 -riscv64 -s390x -sh4 -sh4eb -sparc -sparc32plus -sparc64 -x86_64 -xtensa -xtensaeb" 0 KiB

zatimco na desktopu kde sedim jsem si hral s emulaci ARMu, takze je to tam jinak:

Citace
$ emerge qemu -pv
[ebuild     U  ] app-emulation/qemu-9.0.2-r2::gentoo [9.0.2-r1::gentoo] USE="accessibility aio alsa bzip2 curl fdt filecaps gnutls gtk jpeg ncurses nfs nls opengl oss pam pin-upstream-blobs png sasl sdl seccomp slirp udev usb vhost-net vnc xattr -bpf -capstone -debug -doc -fuse -glusterfs -infiniband -io-uring -iscsi -jack -jemalloc -keyutils -lzo -multipath -numa -pipewire -plugins -pulseaudio -python -rbd -sdl-image (-selinux) -smartcard -snappy -spice -ssh -static-user -systemtap -test -usbredir -vde -virgl -virtfs -vte -xdp% -xen -zstd" PYTHON_TARGETS="python3_11 python3_12 -python3_10" QEMU_SOFTMMU_TARGETS="arm i386 x86_64 -aarch64 -alpha -avr -cris -hppa -loongarch64 -m68k -microblaze -microblazeel -mips -mips64 -mips64el -mipsel -nios2 -or1k -ppc -ppc64 -riscv32 -riscv64 -rx -s390x -sh4 -sh4eb -sparc -sparc64 -tricore -xtensa -xtensaeb" QEMU_USER_TARGETS="arm i386 x86_64 -aarch64 -aarch64_be -alpha -armeb -cris -hexagon -hppa -loongarch64 -m68k -microblaze -microblazeel -mips -mips64 -mips64el -mipsel -mipsn32 -mipsn32el -nios2 -or1k -ppc -ppc64 -ppc64le -riscv32 -riscv64 -s390x -sh4 -sh4eb -sparc -sparc32plus -sparc64 -xtensa -xtensaeb" 0 KiB

A podobne podrobny to je napr. u PHP - pro rozsireni ktere muze ale nemusi interne obsahovat.

Zatimco ja mam 1 balicek, ktery je ohebny a vznikne z nej to co potrebuji, tak u vetsiny binarnich distribuci je tam bud vsechno zakompilovany (tj. vetsi bezpecnostni riziko - attack surface), anebo je balicek resen salamovou metodou a tvori vlastne hromadu bordelu v balickovacim systemu (zkusenost s php).

Ta pohodlnost je, ze napr. reknu jak chci ohnout nejakou vec skrze ty USE flags (a dalsi ruzne konfiguracni dimenze - napr. skrze keywords lze resit stabilni/experimental - per balicek a nerozsype se to) - a nemusim resit jak se jmenuje nejaky frikulinsky balicek ktery by resil featuru X mezi Y a Z.

A pak v neposledni rade - muzu si cokoliv systemove dodelat/opravit primo na urovni zdrojaku, kdyz dam na spravne misto patch, bude se pro dane balicky vzdy aplikovat. Prakticky nekolikrat vyuzito jako hotfix od jinych tak jako vlastni vyvoj reseni problemu.

Se source based vecma nemam potiz - jsem sam vyvojar a ne bezny uzivatel, takze nejake binarni uzavrene / sevrene veci me spis vadi a komplikuji zivot, nez aby meli pro me jakykoliv prakticky prinos.

M Z

Re:QEMU nad LVM se zasekává
« Odpověď #9 kdy: 05. 10. 2024, 16:02:14 »
Na druhou stranu je dost pravdepodobne, ze ten problemu bude nekde v unikatnim nastaveni celeho OS a mozna i v kombinaci s HW. Tim, ze byste pouzil "standardni" a mnohokrat vyzkouseny Debian nebo Redhat, vyloucite spoustu moznych problemu. Ale tomu argumentu ze vite kde co nastavit, tak tomu rozumim. Ja zacinal na Debianu, ale poslednich deset let uz delam skoro vyhradne Redhat a kdyz mam ted neco udelat na Debianu, taky z toho rostu. Systemd bych byt vami dal jeste sanci, naucit se to je na par dni a a potom uz jsou jenom sama pozitiva a socialni jistoty  ;).

RDa

  • *****
  • 2 737
    • Zobrazit profil
    • E-mail
Re:QEMU nad LVM se zasekává
« Odpověď #10 kdy: 05. 10. 2024, 19:21:32 »
Na druhou stranu je dost pravdepodobne, ze ten problemu bude nekde v unikatnim nastaveni celeho OS a mozna i v kombinaci s HW.

Je to klasicky serverovy hw s ECC, zadna obskurita.

Ze se to zasekne, nelze pripsat tomu ze je konfigurace nestandardni - pouzivam system jako skladacku. Ocekavam ze kazdy dilek bude delat svoji cast tak jak ma.

Tim, ze byste pouzil "standardni" a mnohokrat vyzkouseny Debian nebo Redhat, vyloucite spoustu moznych problemu.

To je priserny - ze pouziju neco rekneme "zastaraleho" - jen proto ze to "uz" funguje? Asi je zde na miste pripomenout - ze nebyt me a tohoto problemu, tak za nejaky rok dva, az se vase klasicke distro rozhoupe nabidnout to co dnes pouzivam, tak je  mozne ze tohleto tam bude nastesti opraveny.

Nebezi me na tom neco kritickeho ci s miliardovym obratem, ze bych mel priotity jinde. Bugy se stavaji a je treba jim prijit na kloub.

Re:QEMU nad LVM se zasekává
« Odpověď #11 kdy: 05. 10. 2024, 20:10:27 »
Zalozil jsem bug u Gentoo: https://bugs.gentoo.org/940751

jsou tam postnuty vysledky ze sysrq, a hnije to v kernelu, podle:

Kód: [Vybrat]
# ps auxf | grep D
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      7358  0.0  0.0      0     0 ?        D    11:32   0:00  \_ [kworker/u16:0+loop0]
root      9444  0.0  0.0      0     0 ?        D    11:52   0:00  \_ [kworker/u16:4+flush-251:4]

v dmesg zadny error neni, disky jsou lokalni a bez chyb ve smartu
[/quote]

Díky za další detaily. Jasně, synchronizuje se writeback cache a nemůže to zapisovat, všechny vrstvy včetně toho finálního qemu procesu pak čekají.
Mě to pořád vede spíš k tomu, že je tam problém buď s MD, nebo s disky. Přestože by to za normálních okolností po timeoutu, kdy zařízení neodpovídá, měl vzdát a pokračovat jen s tím zbylým z mirroru. A jasně budou tam nejspíš ještě libahci, ahci v případě SATA disků.
Co je každopádně divné (nebo by to opravdu nahrávalo nějakému bugu) je to, že to neemituje jedinou divnou kernelovou hlášku.
Nic.. jsem zvědavý, co to finálně způsobuje, nebo jestli se to povede ještě reprodukovat s jinými jádry a vypnutým write mostly.

Citace
dm tohle?

Ano, přesně tohle jsem myslel.
Za normálních okolností je ten LV ACTIVE. Je tam mechanismus, že když je problém se zařízením(i) pod ním, tak nezruší ty své devnody, ale jen se přepne do režimu SUSPENDED a všechny procesy nad ním čekají v uninterruptible wait (D) stavu.
Jak jsem zmiňoval, tak mě se na specifické konfiguraci stávalo to, že nastal problém, přeplo se to do SUSPENDED. Nicméně poté, kdy se zařízení pod LVM vrátilo do funkčního stavu, tak už se to nevrátilo do ACTIVE modu, mrznuly lvs, pvs atd. Ale když se to vynutilo přes dmsetup resume <dev>, tak se dopsaly všechny věci a normálně to pokračovalo dál.

Citace
Ten LOOP je tam takto:
A je to z duvodu, aby C: partisna byla 4K aligned (prakticky je 1MiB aligned). Na LVM je modifikovany obraz disku s winXP, kde byla prvni partisna posunuta na zarovnanou pozici - sektor 2048, ale ten originalni bootloader si s tim neporadi a nebootuje to - pak uz jsem nedohledal jak opravit bootovani, protoze:

... jsem vymyslel rovnak na ohybak: vzal tech 63 sektoru od pocatku disku (kde je bootloader), nakopiroval je pred hranici prvni partisny, a ve QEMU bootuji z toho posunuteho loopdevice. Vysledek je:
- guest si mysli ze ma C: zacinajici na 63 sektoru a tedy bootuje ok
- host ma data zarovnana

Ta LVM partisna tedy obsahuje dve partition tables, jedna je na zacatku s 2048 offsetem pro C:, druha je pred koncem 1M bloku s 63 offsetem pro C:, prostredek prvniho 1M bloku je pak nevyuzit.

Jasný chápu, obešel jsi to docela vtipně, díky za vysvětlení. Já to jen za začátku nepochopil, jak je to do ten loop zapracovaný a že máš v QEMU přímo oddíl bez qcow image.
Nechci se v tom úplně rochnit, tím že je to víceméně off-topic a podle ten loop device v tom problému nebude hrát roli..
Ale WinXP SP3 stoprocentně bootují i s prvním oddílem od 1MiB. Kdysi jsem to řešil v komerčních migračních nástrojcíh z HDD -> SSD (Paragon, Acronis). Podobně, když jsem instaloval VM na běh nějakých starých aplikací ve VMWare nebo QEMU/KVM. Ale tam jsem to dělal tak, že jsem si před instalací Windows připravil prázdné, neformátované 0x07 partitiony zarovnané na 1MB (třeba pomocí linuxového fdisku, nebo diskpart z novějších Windows) a pak to nechal při instalaci XP SP3 zformátovat jejich instalátor, co si pak nainstaloval i zavaděč a normálně to šlape.
Tohle je z jedné image, co jsem našel doma.. https://pastebin.com/raw/DFXc1Qh2
Akorát ta zmíněná migrace existujícího Windows disku z 4K na 1M zarovnání se mi nikdy nepodařila standardními nástroji (dd, partclone), nebootovalo to, nezkoumal jsem to moc dál a měl jsem k dispozici boot CD s Paragonem, který to vyřešil uspokojivě.

RDa

  • *****
  • 2 737
    • Zobrazit profil
    • E-mail
Re:QEMU nad LVM se zasekává
« Odpověď #12 kdy: 06. 10. 2024, 02:48:41 »
Jasný chápu, obešel jsi to docela vtipně, díky za vysvětlení. Já to jen za začátku nepochopil, jak je to do ten loop zapracovaný a že máš v QEMU přímo oddíl bez qcow image.
Nechci se v tom úplně rochnit, tím že je to víceméně off-topic a podle ten loop device v tom problému nebude hrát roli..
Ale WinXP SP3 stoprocentně bootují i s prvním oddílem od 1MiB. Kdysi jsem to řešil v komerčních migračních nástrojcíh z HDD -> SSD (Paragon, Acronis). Podobně, když jsem instaloval VM na běh nějakých starých aplikací ve VMWare nebo QEMU/KVM. Ale tam jsem to dělal tak, že jsem si před instalací Windows připravil prázdné, neformátované 0x07 partitiony zarovnané na 1MB (třeba pomocí linuxového fdisku, nebo diskpart z novějších Windows) a pak to nechal při instalaci XP SP3 zformátovat jejich instalátor, co si pak nainstaloval i zavaděč a normálně to šlape.
Tohle je z jedné image, co jsem našel doma.. https://pastebin.com/raw/DFXc1Qh2
Akorát ta zmíněná migrace existujícího Windows disku z 4K na 1M zarovnání se mi nikdy nepodařila standardními nástroji (dd, partclone), nebootovalo to, nezkoumal jsem to moc dál a měl jsem k dispozici boot CD s Paragonem, který to vyřešil uspokojivě.

Velike podekovani Michalovi, ze me navnadil se v tom rypat. Moje MBR se od jeho nelisi - ale VBR uz ano - pro zajemce o retro uvadim zdroj podle ktereho jsem postupoval: https://thestarman.pcministry.com/asm/mbr/NTFSBR.htm

Oprava nebootujiciho XP po presunu C: partisny na zarovnanou lokaci spocitavala v uprave hodnoty Number of "Hidden Sectors" v prvnim sektoru NTFS partisny (coz je jeji volume boot code). Prakticky - tenhle kod si nese sebou "predpocitanou" hodnotu namisto toho, aby zjistovala, kterou ze to partisnu natahnul predchozi kod z MBR.

Takze na sektoru 2048, kde zacina C:, jsem to upravil podle toho, aby to sedelo s MBR ze zacatku image disku:

# diff -u vbr.hex vbr-fix.hex
--- vbr.hex     2024-10-06 02:16:51.811776010 +0200
+++ vbr-fix.hex 2024-10-06 02:30:32.233715885 +0200
@@ -1,5 +1,5 @@
 00000000  eb 52 90 4e 54 46 53 20  20 20 20 00 02 08 00 00  |.R.NTFS    .....|
-00000010  00 00 00 00 00 f8 00 00  3f 00 ff 00 3f 00 00 00  |........?...?...|
+00000010  00 00 00 00 00 f8 00 00  3f 00 ff 00 00 08 00 00  |........?.......|

 00000020  00 00 00 00 80 00 80 00  7d c4 33 07 00 00 00 00  |........}.3.....|
 00000030  00 00 0c 00 00 00 00 00  c7 83 df 00 00 00 00 00  |................|
 00000040  f6 00 00 00 01 00 00 00  21 1f 67 58 68 67 58 fe  |........!.gXhgX.|


Takze tedkom uz jede tahle VM bez loop device mezivrstvy.