Для losetup 2.22-alt1, на ядрах 3.5.4-std-def-alt1, 3.4.7-std-def-alt1, на текущем Sisyphus, с systemd, при попытке подключить дисковый файл выдаётся "Inappropriate ioctl for device": # dd if=/dev/zero of=foo bs=1M count=10 10+0 records in 10+0 records out 10485760 bytes (10 MB) copied, 0.0991574 s, 106 MB/s # losetup -f foo losetup: foo: failed to setup loop device: Inappropriate ioctl for device Согласно strace losetup пробует открыть /dev/loop0: # strace losetup -f foo .... stat("/dev/loop-control", {st_mode=S_IFCHR|0600, st_rdev=makedev(10, 237), ...}) = 0 open("/dev/loop-control", O_RDWR) = 3 ioctl(3, LOOP_CTL_GET_FREE) = 0 close(3) = 0 getcwd("/root", 4095) = 6 readlink("/root/foo", 0x7fff4a7377c0, 4096) = -1 EINVAL (Invalid argument) open("/root/foo", O_RDWR) = 3 open("/dev/loop0", O_RDWR) = 4 ioctl(4, LOOP_SET_FD, 0x3) = -1 ENOTTY (Inappropriate ioctl for device) close(3) = 0 ioctl(4, LOOP_CLR_FD) = -1 ENOTTY (Inappropriate ioctl for device) .... Предыдущий losetup 2.20.1-al2 работает, и подключает устройство /dev/loop4: # losetup -f foo # losetup -a /dev/loop4: [0802]:158219 (/root/foo) (в обоих случаях - это первое loop-устройство в системе).
Прикольно: # rpmquery losetup losetup-2.22-alt1 # dd if=/dev/zero of=foo bs=1M count=10 10+0 записей получено 10+0 записей отправлено скопировано 10485760 байт (10 MB), 0,0135267 c, 775 MB/c # losetup -f foo # # uname -r 3.5.0-lks-wks-alt0.4 Никаких проблем не вижу.
Проверил на другой машине. 3.5.3-std-def-alt1, systemd, Sisyphus двухнедельной давности, losetup 2.20.1 - отработал нормально. Обновил _только_ losetup до 2.22-alt1, без перезагрузок и прочего - # losetup -f foo losetup: foo: failed to setup loop device: Неприменимый к данному устройству ioctl
У меня нет systemd. У себя наблюдаю: $ ls -1 /dev/loop[0-9]* |wc -l 8 При этом: $ grep -c '/dev/loop[0-9]' /lib/tmpfiles.d/losetup-loop.conf 4 Вы упоминали /dev/loop4, но его в losetup-loop.conf нет. Может быть в этом дело ?
На двух машинах - одинаково: $ ls -1 /dev/loop[0-9]* |wc -l 8 $ cat /lib/tmpfiles.d/losetup-loop.conf c /dev/loop0 0640 root disk - 7:0 c /dev/loop1 0640 root disk - 7:1 c /dev/loop2 0640 root disk - 7:2 c /dev/loop3 0640 root disk - 7:3 $ /dev/loop4 - находится по '-f' как первое свободное устройство. В 2.20.1 с systemd он находит /dev/loop4, в 2.22 с systemd - /dev/loop0 .
На моём ядре не воспроизводится. Я попробую вечером воспроизвести на более новом и посмотрю на std-def.
На всякий случай добавляю aspsk@.
# dd if=/dev/zero of=foo bs=1M count=10 10+0 records in 10+0 records out 10485760 bytes (10 MB) copied, 0.0241689 s, 434 MB/s # losetup -f foo # rpmquery losetup losetup-2.20.1-alt2 # uname -r 3.2.14-std-pae-alt1
Николай, не могли бы вы прислать dmesg и lsmod с той машины, где воспроизводится? dmesg после того как воспроизведётся естественно.
(В ответ на комментарий №7) > # rpmquery losetup > losetup-2.20.1-alt2 2.20.1-alt2 и у меня везде работает. Речь о текущем 2.22-alt1.
Created attachment 5574 [details] lsmod после ошибки losetup
lsmod приложил. С dmesg ещё проще: [178974.395742] loop: module loaded И всё. Есть впечатление, что сейчас loop0-loop3 под что-то заняты. losetup 2.20.1 при поиске свободного устройства их пропускает, losetup 2.22 - нет, пытается использовать занятый loop0, и получает ошибку. И прямое указание устройства отлично работает и в 2.22 - т.е. # losetup /dev/loop4 foo # losetup -a /dev/loop4: [2050]:559773 (/root/foo)
Можете посмотреть, кто у вас держит /dev/loop[0-3] ?
https://bugzilla.redhat.com/show_bug.cgi?id=758159 это не ваш случай ?
(В ответ на комментарий №12) > Можете посмотреть, кто у вас держит /dev/loop[0-3] ? Никто - они свободны. losetup -a выдаёт пустоту. На самом деле, вроде бы я нашёл причину. # ls -l /dev/loop* crw-r----- 1 root disk 7, 0 сен 24 16:36 /dev/loop0 crw-r----- 1 root disk 7, 1 сен 24 16:36 /dev/loop1 crw-r----- 1 root disk 7, 2 сен 24 16:36 /dev/loop2 crw-r----- 1 root disk 7, 3 сен 24 16:36 /dev/loop3 brw-rw---- 1 root disk 7, 4 сен 26 19:29 /dev/loop4 brw-rw---- 1 root disk 7, 5 сен 26 18:20 /dev/loop5 brw-rw---- 1 root disk 7, 6 сен 26 18:20 /dev/loop6 brw-rw---- 1 root disk 7, 7 сен 26 18:20 /dev/loop7 crw------- 1 root root 10, 237 сен 26 18:20 /dev/loop-control И * Ср июн 13 2012 Alexey Shabalin <shaba@altlinux.org> 2.20.1-alt2 - add /lib/tmpfiles.d/losetup-loop.conf for create character devices /dev/loop{0-4}. Для 2.20.1-alt2 и 2.22-alt1 в /lib/tmpfiles.d/losetup-loop.conf - c /dev/loop0 0640 root disk - 7:0 c /dev/loop1 0640 root disk - 7:1 c /dev/loop2 0640 root disk - 7:2 c /dev/loop3 0640 root disk - 7:3 И /lib/udev/devices/loop{0,1,2,3} из обоих версий пакетов - brw-r----- 1 root disk 7, 0 июн 13 19:05 /lib/udev/devices/loop0 Итого: - /dev/loop{0,1,2,3} создаются как символьные устройства; - 2.20.1-alt2 их пропускает и начинает поиск свободных с блочных loop4 и далее; - 2.22-alt1 находит _свободный_ loop0, но это устройство символьное - соответственно, получаем ошибку ioctl.
(В ответ на комментарий №13) > https://bugzilla.redhat.com/show_bug.cgi?id=758159 > > это не ваш случай ? Нет, таких проблем у нас нет: # losetup /dev/loop4 foo # mkfs.ext2 /dev/loop4 ... # mount /dev/loop4 /mnt/ # umount /mnt/ # losetup -d /dev/loop4 # for i in `seq 1 5000`;do echo -n .;losetup /dev/loop4 foo;mount /dev/loop4 /mnt/;umount /mnt/;losetup -d /dev/loop4;done Это на 2.22-alt1.
(In reply to comment #9) > > losetup-2.20.1-alt2 > 2.20.1-alt2 и у меня везде работает. Речь о текущем 2.22-alt1. Да-да, уже понял. Всё равно работает: # dd if=/dev/zero of=foo bs=1M count=10 10+0 records in 10+0 records out 10485760 bytes (10 MB) copied, 0.0203676 s, 515 MB/s # losetup -f foo # rpmquery losetup losetup-2.22-alt1 # uname -r 3.2.14-std-pae-alt1 # losetup -d /dev/loop0 # _
(В ответ на комментарий №16) > Да-да, уже понял. Всё равно работает: > .... И у меня на одной из машин работает - где sysinit, а не systemd. Поскольку там $ ls -l /dev/loop0 brw-r----- 1 root disk 7, 0 сен 20 13:41 /dev/loop0 И на двух не работает - где есть systemd, и где $ ls -l /dev/loop0 crw-r----- 1 root disk 7, 0 сен 24 10:00 /dev/loop0 Т.е., уточнённый вопрос: правильно ли, что на системах с systemd /dev/loop{0,1,2,3} создаются как символьные устройства? Если да - то losetup 2.22 с ними работать не умеет. Если нет - то есть вопрос по содержимому /lib/tmpfiles.d/losetup-loop.conf . В любом случае, появляется второй вопрос: а правильно ли, что у /dev/loop{0,1,2,3} нет прав на запись для группы (disk)?
(В ответ на комментарий №17) > (В ответ на комментарий №16) > > Да-да, уже понял. Всё равно работает: > > .... > > И у меня на одной из машин работает - где sysinit, а не systemd. Поскольку там > $ ls -l /dev/loop0 > brw-r----- 1 root disk 7, 0 сен 20 13:41 /dev/loop0 > > И на двух не работает - где есть systemd, и где > $ ls -l /dev/loop0 > crw-r----- 1 root disk 7, 0 сен 24 10:00 /dev/loop0 > > > Т.е., уточнённый вопрос: правильно ли, что на системах с systemd > /dev/loop{0,1,2,3} создаются как символьные устройства? Ой-ой! Конечно это неправильно! > В любом случае, появляется второй вопрос: а правильно ли, что у > /dev/loop{0,1,2,3} нет прав на запись для группы (disk)? Это тоже ошибка. Спасибо вам за расследование. Мне и в голову не пришло посмотреть на /dev/loop*!
У меня ещё к вам просьба. Не могли бы вы показать: # mount |fgrep ' /dev ' ?
(В ответ на комментарий №19) > У меня ещё к вам просьба. Не могли бы вы показать: > > # mount |fgrep ' /dev ' > > ? Для систем с systemd: udevfs on /dev type devtmpfs (rw,relatime,size=5120k,nr_inodes=465750,mode=755) udevfs on /dev type devtmpfs (rw,relatime,size=5120k,nr_inodes=255077,mode=755) Для sysinit: udevfs on /dev type devtmpfs (rw,relatime,size=5120k,nr_inodes=472706,mode=755)
Если исправить тип и права на устройства, то проблема решается ?
(В ответ на комментарий №21) > Если исправить тип и права на устройства, то проблема решается ? У меня работает. Поменял в /lib/tmpfiles.d/losetup-loop.conf -- c на b и 640 на 660.
(В ответ на комментарий №22) > (В ответ на комментарий №21) > > Если исправить тип и права на устройства, то проблема решается ? > > У меня работает. > Поменял в /lib/tmpfiles.d/losetup-loop.conf -- c на b и 640 на 660. После замены работает, в смысле. До замены я тоже получал Inappropriate ioctl for device.
util-linux-2.22-alt2 -> sisyphus: * Wed Sep 26 2012 Alexey Gladkov <legion@altlinux> 2.22-alt2 - Fix regression in previous release ('pamconsole' mount option has been silently lost). - Fix device type and permissions in losetup-loop.conf (ALT#27767).