Как отформатировать дискету 720k FAT (например: MS-DOS) в Linux с помощью USB-дисковода гибких дисков

Вот то, как rm -rf dir работы:

  1. Это открывается dir, и перечислите его содержание.
  2. Для каждой записи, если это - каталог, повторяют тот же процесс для него, если это не, звонить unlink на нем.

Если Вы, для списка каталогов, могли бы возвратить специальное имя файла сначала, и если Вы могли бы вызвать процесс, делающий unlink на том файле для смерти, который решил бы проблему. Это могло быть сделано с помощью файловой системы предохранителя.

Например, Вы могли адаптироваться loopback.pl пример от модуля Предохранителя жемчуга, который просто реализует фиктивную файловую систему, которая является просто передачей к реальной файловой системе внизу как так (см. также патч ниже):

  • при списке каталога, если это содержит названную запись .{{do-not-delete}}., предварительно ожидайте список записей с двумя файлами: .{{do-not-delete}}!error и .{{do-not-delete}}!kill
  • при попытке к unlink первый, возвратитесь EPERM код так, чтобы rm отображает сообщение об ошибке
  • при попытке к unlink второй, процесс уничтожается.

$ ls -Ff dir/test
./  .{{do-not-delete}}.  foo/  ../  bar
$ ./rm-rf-killer dir
$ ls -Ff dir/test
.{{do-not-delete}}!error  .{{do-not-delete}}!kill  ./  .{{do-not-delete}}.   foo/  ../  bar
$ rm -rf dir/test
rm: cannot remove `dir/test/.{{do-not-delete}}!error': Operation not permitted
zsh: terminated  rm -rf dir/test
$ ls -Ff dir/test
.{{do-not-delete}}!error  .{{do-not-delete}}!kill  ./  .{{do-not-delete}}.   foo/  ../  bar

Здесь патч для применения к тому же loopback.pl пример как подтверждение концепции:

--- loopback.pl 2013-06-03 22:35:00.577316063 +0100
+++ rm-rf-killer    2013-06-03 22:33:41.523328427 +0100
@@ -7,2 +7,4 @@
 my $has_threads = 0;
+my $flag = ".{{do-not-delete}}";
+
 eval {
@@ -42,3 +44,4 @@

-use blib;
+#use blib;
+use File::Basename;
 use Fuse;
@@ -49,3 +52,3 @@

-my %extraopts = ( 'threaded' => 0, 'debug' => 0 );
+my %extraopts = ( 'threaded' => 0, 'debug' => 0, 'mountopts' => 'nonempty' );
 my($use_real_statfs, $pidfile);
@@ -64,3 +67,7 @@

-sub fixup { return "/tmp/fusetest-" . $ENV{LOGNAME} . shift }
+sub fixup {
+    my $f = shift;
+    $f =~ s#(/\Q$flag\E)!(error|kill)$#$1.#s;
+    return ".$f";
+}

@@ -78,3 +85,9 @@
 }
-    my (@files) = readdir(DIRHANDLE);
+    my @files;
+    
+    while (my $f = readdir(DIRHANDLE)) {
+        unshift @files, "$flag!error", "$flag!kill"
+            if ($f eq "$flag.");
+        push @files, $f;
+    }
 closedir(DIRHANDLE);
@@ -121,3 +134,12 @@
 sub x_readlink { return readlink(fixup(shift));         }
-sub x_unlink   { return unlink(fixup(shift)) ? 0 : -$!; }
+sub x_unlink   {
+    my $f = shift;
+    if (basename($f) eq "$flag!error") {return -EPERM()}
+    if (basename($f) eq "$flag!kill") {
+        my $caller_pid = Fuse::fuse_get_context()->{"pid"};
+        kill("TERM", $caller_pid);
+        return -EPERM();
+    }
+    return unlink(".$f") ? 0 : -$!;
+}

@@ -203,3 +225,2 @@
 sub daemonize {
-    chdir("/") || die "can't chdir to /: $!";
 open(STDIN, "< /dev/null") || die "can't read /dev/null: $!";
@@ -236,2 +257,3 @@

+chdir($mountpoint) or die("chdir: $!");
 daemonize();
@@ -239,3 +261,3 @@
 Fuse::main(
-    'mountpoint'    => $mountpoint,
+    'mountpoint'    => '.',
 'getattr'       => 'main::x_getattr',

5
31.07.2015, 21:37
2 ответа

Попробуйте:

fdformat /dev/fd0u720
mkfs.msdos /dev/fd0

после создания символической ссылки с / dev / sdh на / dev / fd0

1
27.01.2020, 20:35

Я только что успешно отформатировал совершенно пустую дискету в USB-накопителе. Для этого нужно было правильно отформатировать дискету, а не просто записать на нее файловую систему, потому что на ней еще не было секторов.

Это было сделано с помощью программы ufiformat, которая специально разработана для работы с USB-дисководами.

$ sudo ufiformat -f 1440 -v /dev/sdd
format on device=/dev/sdd, size=1440
geometry: track=80, head=2, sector=18, block=512
done

Она форматирует дискету размером 1,44 МБ (-f 1440) в режиме verbose (-v), используя USB-флоппи устройство по адресу /dev/sdd. Используйте -f 720 для диска 720k.

Вот еще немного информации, которую я нашел на своем пути:

  • mkfs.msdos и mformat на самом деле не форматируют диск, они просто записывают файловую систему DOS (FAT12) на уже отформатированный диск. Если диск не был отформатирован (или на нем есть данные Amiga или другие данные, не относящиеся к DOS), то эти программы не сработают. Конечно, вам придется использовать эти программы для размещения файловой системы на дискете, после того, как вы отформатируете ее с помощью ufiformat.

  • Аналогично, использование dd для записи образа на диск не будет работать, пока диск не будет сначала отформатирован.

  • fdformat предназначен только для работы с контроллерами дискет типа PC (например, с дисководами, подключаемыми к разъемам для дискет на материнской плате). Он не может работать с USB-дисководами.

9
27.01.2020, 20:35

Теги

Похожие вопросы