k001
k001
:...
k001 [userpic]
викторина

В каком случае программа mkfs (точнее даже mkfs.vfat) может выдать ошибку Not a directory (ENOTDIR)? Комменты скринятся до вечера понедельника (11 января).

Tags: ,
Comments

$ /sbin/mkfs.vfat /dev/null/
mkfs.vfat 3.0.7 (24 Dec 2009)
/dev/null/: Not a directory

Очевидно, когда в указанном имени девайса-файла какой-то компонент между слэшами существует, но является файлом. Впрочем, это будет относится и к другим файловым аргументам (типа -m).

$ touch /tmp/1
$ /sbin/mkfs.vfat /tmp/1/1
mkfs.vfat 2.11 (12 Mar 2005)
/tmp/1/1: Not a directory

Почитал ман, нашёл, например, опцию -c:

fenster@home:~/dosfstools-3.0.7$ touch foo
fenster@home:~/dosfstools-3.0.7$ mkfs.vfat -c foo/bar
mkfs.vfat 3.0.7 (24 Dec 2009)
foo/bar: Not a directory

Кстати, как видно из pwd, даже скачал сорцы и поглядел их по диагонали, но ответ-таки придумал, читая именно ман, а не сорцы :)

$ touch /tmp/1
$ dd if=/dev/zero of=/tmp/img count=1 bs=1M
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.00184509 s, 568 MB/s
$ /sbin/mkfs.vfat -m /tmp/1/1 /tmp/img
mkfs.vfat 2.11 (12 Mar 2005)
/tmp/1/1: Not a directory

max@max$touch 1
max@max$/sbin/mkfs.vfat ~/1/fs 1000

Например, если /dev - файл ;)

В случае, если в пути к устройству вы использовали в качестве каталога компонент, не являющийся каталогом. Что-то вроде mkfs.vfat /bin/ls/hda

Ну, например, вот так:

[root@home ~]# dd if=/dev/zero of=/root/1.vfat bs=512 count=100
100+0 записей считано
100+0 записей написано
скопировано 51200 байт (51 kB), 0,000683887 c, 74,9 MB/c
[root@home ~]# mkfs.vfat 1.vfat/floppy.fat
mkfs.vfat 3.0.1 (23 Nov 2008)
1.vfat/floppy.fat: Not a directory

Судя по mkdosfs.c, таких случаев в принципе не так уж и много. Можно еще вот так, например:

[root@home ~]# dd if=/dev/zero of=/root/1.vfat bs=512 count=100
100+0 записей считано
100+0 записей написано
скопировано 51200 байт (51 kB), 0,000683887 c, 74,9 MB/c
[root@home ~]# mkfs.vfat 1.vfat/floppy.fat
mkfs.vfat 3.0.1 (23 Nov 2008)
1.vfat/floppy.fat: Not a directory

Какой приз? :-))

Второй пример вот такой (copy/paste сбился):

[root@home ~]# mkfs.vfat -m 1.vfat/message-file /root/2.vfat
mkfs.vfat 3.0.1 (23 Nov 2008)
1.vfat/message-file: Not a directory

ENOTDIR выдается и в тех случаях, когда компонент адресуемого пути является не является директорией. Например, ls -l /bin/sh/fork скажет ls: cannot access /bin/sh/fork: Not a directory

Так что в случае mkfs.vfat подобная реакция должна быть на указание имени устройства, сконструированного по указанному типу, вроде /dev/fd0/fork, а также в любой опции, где можно указать в качестве аргумента файл: -B, -l, -m, -n.

Судя по всему в трех случаях:
1)"On m68k, check if this is an Atari; if yes, turn on Atari variant
* of MS-DOS filesystem by default."
2)При передаче параметра -m с определенным значением
3)При передаче параметра -c (проверка ФС после создания)

Ошибка произойдет если в части пути передаваемом функции fopen за место каталога будет файл.(proc, dev, message file, image file)

З.Ы.
Извинияюсь заранее если не понял смысла вопроса

mkfs.vfat /dev/loop0/

Рискну предположить обычное ( специально не проверяю )
mkfs /dev1/sdc1