
Ich versuche, ein 1440 KiB großes Disketten-Image mit fdisk
(util-linux, v2.31.1) zu partitionieren.
Allerdings fügt das Tool scheinbar einen 512-Byte-Sektor hinzu, egal welche Einheiten ich verwende, und ich kann nicht sagenWarum.
Folgendes habe ich getan:
Created a new DOS disklabel [...]
Command (m for help): n
[...]
First sector (1-2879, default 1): 2048
Last sector, +sectors or +size{K,M,G,T,P} (63-2879, default 2879): +1K
Created a new partition 1 of type 'Linux' and of size 1.5 KiB.
Boah!1,5 KiB!?
Ich habe versucht, die Sektoranzahl zu verwenden und habe das gleiche Ergebnis erhalten:
Last sector, +sectors [...]: +2
Created a new partition 1 of type 'Linux' and of size 1.5 KiB.
Wenn ich nun eine ausreichend große Datei verwende, fdisk
verhält es sich bei der ersten Notation anders:
First sector (2048-131071, default 2048): 2048
Last sector, [...]: +1K
Created a new partition 1 of type 'Linux' and of size 1 KiB.
Anders verhält es sich beim Zweiten:
Last sector, +sectors [...]: +2
Created a new partition 1 of type 'Linux' and of size 1.5 KiB.
Ist das das erwartete Verhalten? Ich denke schon, aber warum?
Antwort1
Das Tool fügt jedoch scheinbar einen 512-Byte-Sektor hinzu, unabhängig davon, welche Einheiten ich verwende.
...
Wenn ich jetzt eine ausreichend große Datei verwende, verhält sich fdisk bei der ersten Notation anders:
...
Ist dies das erwartete Verhalten?
Offensichtlich ja, und es scheint sich um einen Fehler der „plus eins“-Variante zu handeln.
Wenn Sie „+N“ oder „+“ (anstelle einer absoluten Sektornummer) für angeben last sector
, scheint das Dienstprogramm diese Menge als Anzahl der Sektoren in (oder als Größe) der neuen Partition zu verwenden und diese Zahl zur Startsektornummer hinzuzufügen.
Mit anderen Worten: Die richtige Berechnung sollte
<last sector> = <start sector> + <sector count> - 1
Aber anscheinend versäumt es das Versorgungsunternehmen, einen Sektor von dieser Summe abzuziehen, um diezählenzu einemVerschiebung.
Wenn die Größe der neuen Partition klein ist (also nur zwei Sektoren), ist dieser „Plus-Eins“-Fehler ziemlich offensichtlich.
Der eigentliche Quellcode muss überprüft werden, um festzustellen, warum eine Korrelation/Abhängigkeit von der verfügbaren Größe des Geräts besteht.
Die Problemumgehung für diesen offensichtlichen Fehler besteht darin, den letzten Sektor explizit mit einer Sektornummer anzugeben.
Wenn der Startsektor beispielsweise 2048 ist und die Partitionsgröße 1 KB betragen soll, geben Sie den letzten Sektor als 2049 an.
Da sich dieser „zusätzliche“ Sektor am Ende der neuen Partition befindet, hat dieses Problem nichts mit der Partitionsausrichtung zu tun.
Die Partitionsausrichtung (und Schutzzylinder/-spur/-sektoren) würde angewendet, um den Anfang einer neuen Partition zu ändern.
Das heißt, Sektoren würden „vor“ der neuen Partition reserviert und wären nicht Teil einer Partition.
Diese Sektoren wären nicht zugeordnet, im Wesentlichen verschwendet und könnten (von keinem Dateisystem) verwendet werden.
Die Ausrichtung hat keinen Einfluss auf die Größe der neuen Partition.
Das von Ihnen beschriebene Problem bezieht sich auf die Partitionsgröße und nicht auf ihre Ausrichtung.
Ich versuche, ein 1440 KiB großes Disketten-Image zu partitionieren
Disketten müssen nicht partitioniert werden. Es gibt nur einen Bootsektor.
Der MBR und die Partitionstabelle sind für Festplatten (und SSDs).
NACHTRAG
Offenbar gibt es Code inutil-linux-2.31.1/libfdisk/src/dos.cdas versucht, das Ende der Partition so anzupassen, dass dienächstePartition wird ausgerichtet!
static int add_partition(struct fdisk_context *cxt, size_t n,
struct fdisk_partition *pa)
{
...
if (isrel && stop - start < (cxt->grain / fdisk_get_sector_size(cxt))) {
/* Don't try to be smart on very small partitions and don't align so small sizes */
isrel = 0;
if (stop > start)
stop -= 1;
DBG(LABEL, ul_debug("DOS: don't align end of tiny partition [start=%ju, stop=%ju, grain=%lu]",
(uintmax_t)start, (uintmax_t)stop, cxt->grain));
}
if (stop < limit && isrel && alignment_required(cxt)) {
/* the last sector has not been exactly requested (but
* defined by +size{K,M,G} convention), so be smart and
* align the end of the partition. The next partition
* will start at phy.block boundary.
*/
stop = fdisk_align_lba_in_range(cxt, stop, start, limit);
if (stop > start)
stop -= 1;
if (stop > limit)
stop = limit;
DBG(LABEL, ul_debug("DOS: aligned stop: %ju", (uintmax_t) stop));
}
Eine Debug-Ausgabe (also eine Version des Dienstprogramms mit aktiviertem Debugging) würde Aufschluss darüber geben, was los ist.