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.