Verwenden von dd auf Datenträgern mit unterschiedlichen Sektorgrößen

Verwenden von dd auf Datenträgern mit unterschiedlichen Sektorgrößen

Ich möchte eine Partition auf ein neues Laufwerk verschieben. Das alte Laufwerk hat eine Sektorgröße von 512 Bytes, während das neue eine Sektorgröße von 4096 Bytes hat. Ich habe versucht, ein DD der gesamten Festplatte durchzuführen, aber das ist fehlgeschlagen, weil die Partition auf dem alten Laufwerk nicht an 4K-Grenzen ausgerichtet war. Stattdessen habe ich mit fdisk eine Partition von Grund auf auf dem neuen Laufwerk erstellt und diese Partition dann mit dd zwischen den Festplatten kopiert. Schließlich habe ich das Dateisystem auf dem neuen Laufwerk mit resize2fs erweitert. Das scheint funktioniert zu haben, da ich die neue Partition mounten (bisher schreibgeschützt) und Dateien anzeigen kann und fsck sagt, dass sie sauber ist.

Aber ich habe immer noch Zweifel, ob das sicher ist. Kümmert sich das FS beispielsweise so um die Sektorgröße, dass es dadurch Probleme geben würde, oder ist es durch die VFS-Schicht oder die Festplatte selbst davor geschützt?

Antwort1

Sie haben uns nicht gesagt, welcher dd-Befehl fehlgeschlagen ist, den Sie zuerst versucht haben. Ich habe jedoch etwas Zeit damit verbracht, den Quellcode des dd-Befehls (aus dem Coreutils-Paket) zu überprüfen, und es sieht so aus, als hätten wir hier ein Problem.

1852   /* Some devices require alignment on a sector or page boundary
1853      (e.g. character disk devices).  Align the input buffer to a
1854      page boundary to cover all bases.  Note that due to the swab
1855      algorithm, we must have at least one byte in the page before
1856      the input buffer;  thus we allocate 2 pages of slop in the
1857      real buffer.  8k above the blocksize shouldn't bother anyone.
1858 
1859      The page alignment is necessary on any Linux kernel that supports
1860      either the SGI raw I/O patch or Steven Tweedies raw I/O patch.
1861      It is necessary when accessing raw (i.e. character special) disk
1862      devices on Unixware or other SVR4-derived system.  */

Wenn Sie die Fehlermeldung angeben, kann ich eine weitere Suche durchführen. Aber für mich ist das der Punkt, an dem wir aufgeschmissen sind. Das heißt, die Ausrichtung einer 512-Byte-Seitengrenze an einer 4-KiB-Seitengrenze scheint nicht richtig zu sein.

Kommen wir nun zum zweiten Teil: Haben Sie die Partition des zweiten Laufwerks (mit fdisk) mit einer Größe von 512 Byte erstellt? Die Sektorgröße, die die meisten modernen Festplatten dem Betriebssystem mitteilen, beträgt jedoch 1 MiB, also 4096 KiB.

In der Funktion update_sector_offset von fdisk.c sehen Sie

/*
             * Align the begin of partitions to:
             *
             * a) topology
             *  a2) alignment offset
             *  a1) or physical sector (minimal_io_size, aka "grain")
             *
             * b) or default to 1MiB (2048 sectrors, Windows Vista default)
             *
             * c) or for very small devices use 1 phy.sector
             */
            sector_t x = 0;

            if (fdisk_dev_has_topology(cxt)) {
                    if (cxt->alignment_offset)
                            x = cxt->alignment_offset;
                    else if (cxt->io_size > 2048 * 512)
                            x = cxt->io_size;
            }
            /* default to 1MiB */
            if (!x)
                    x = 2048 * 512;

            sector_offset = x / cxt->sector_size;

*cxt ist der Deskriptor der fdisk-Struktur.

Dieser Teil ist mir also nicht klar. Das heißt, wenn für Ihre neue Festplatte eine Sektorgröße von 4096 KiB oder 512 Byte angegeben ist.

Kommen wir nun zum letzten Teil.

Nein, Dateisysteme kümmern sich eigentlich nicht um die Sektorgröße. Und solange die Blockgröße 4 KiB beträgt, sollte alles in Ordnung sein, denn da die virtuelle Seitengröße (im mm-Kontext) 4 KiB beträgt, muss die mmaped-E/A daran ausgerichtet sein. Auf meinem Laptop sind Blockgröße und physische Sektorgröße gleich.

$ sudo blockdev --getpbsz /dev/sda
[sudo] password for chakraborty: 
4096

$ sudo blockdev --getbsz /dev/sda
4096

IO erfolgt im Kontext der Blockgröße, nicht der Sektorgröße. Wenn FS aufgrund der physischen Sektorgröße auf ein Problem stößt, wäre ich sehr überrascht. VFS kommt jedoch nicht so weit. VFS befindet sich zwischen der Anwendung, die IO ausgibt, und dem eigentlichen Dateisystem. Was wir diskutieren, liegt unterhalb der VFS-Ebene.

verwandte Informationen