2017-08-09 5 views
-2

Ich verwende ein C-Programm open(), close(), read(), write() Technik, um eine große Datei auf RAW-Datenträger zu kopieren. Die Datenträgergröße beträgt 20 GB und die Dateigröße beträgt 17 GB, aber jedes Mal nach dem Schreiben 945 MB write() löst No space left on device Fehler.C: write() schlägt fehl, während auf eine RAW-Platte geschrieben wird, nachdem eine bestimmte Größenbeschränkung erreicht wurde

ich fdisk -l /dev/sdb gelaufen und gibt 20,5 GB und du /dev/sdb sagt 945126569

Dann habe ich versucht, es zu cat mylargefile > /dev/sdb wirft gleichen No space left on device Fehler und dann mache ich cat /dev/sdb > /tmp/sdb.img es abgeschlossen ist normal. Dann mache ich ls -ld /tmp/sdb.img es reagiert 945126569

ich die gleiche Festplatte verwenden können ext4 Dateisystem zu erstellen und formatieren ohne Probleme, so Plattenfehler ist unwahrscheinlich. (Ich denke ...)

Ich benutze Ubuntu 16.04 LTS amd64 OS mit neuesten GCC, um mein Programm zu bauen.

Kann jemand vorschlagen, wo ich falsch liege oder was getan werden muss, um dies zu vermeiden?

+0

'du/dev/sdb' sollte sagen ** 0 **. –

+0

Denken Sie daran, dass die Plattengrößen normalerweise ein Vielfaches von 1000 sind, während die Dateigrößen ein Vielfaches von 1024 sind. Haben Sie diese Diskrepanz überprüft? –

+0

@Someprogrammerdude pebkac Fehler. –

Antwort

1

du /dev/sdb sollte sagen, wenn /dev/sdb ein Blockgerät ist. Versuchen Sie auch blockdev --report /dev/sdb.

Was passiert ist, dass in dem Anfang nicht eine Gerätedatei namens /dev/sdb bei allen hat, und Du erstellt eine regelmäßigen Datei mit dem Namen /dev/sdb, kopiert 945 MiB hinein. Dies hat die Partition gefüllt, auf der sich /dev/ befindet, und damit erhalten Sie den Fehler. fdisk liest nur die Partitionstabelle, die in den ersten 945 MiB enthalten ist und denkt, dass es eine Festplatte von 20 GiB sieht.

Wenn Sie das tun cat mylargefile > /dev/sdb, die Datei/dev/sdb wird zuerst auf Größe 0, abgeschnitten, so gibt es jetzt 945 wieder Freiraum MiB, dass cat zu füllen stattfindet.


Um dies zu vermeiden: Stellen Sie sicher, dass Sie ein Gerät mit seinem korrekten Namen öffnen. Öffnen Sie in C das Gerät ohneO_CREAT.

+0

Was ist dann mit 'Katze', die versagt? und wie praktisch auf die Festplatte zugreifen? Amüsant, nachdem ich die Datei/dev/sdb bereinigt und neu gestartet habe und die RAW-Disk unter/dev/sdb und 'du' zurückgeliefert' 0' – Anirban

+0

"Was ist mit Cat-Failing?" Die Partition wo '/ dev' liegt, hatte 945 MiB freien Speicherplatz . Wenn Sie 'cat>' hineinstecken, wird die Datei zuerst auf Größe 0 gekürzt, dann werden 945 MiB geschrieben und Sie haben keinen Platz mehr. –

+0

@Anirban aktualisiert. –

Verwandte Themen