Вот то, как rm -rf dir
работы:
dir
, и перечислите его содержание.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',
Попробуйте:
fdformat /dev/fd0u720
mkfs.msdos /dev/fd0
после создания символической ссылки с / dev / sdh
на / dev / fd0
Я только что успешно отформатировал совершенно пустую дискету в 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-дисководами.