Bug 27767 - Failed to attach loop-back devices
Summary: Failed to attach loop-back devices
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: losetup (show other bugs)
Version: unstable
Hardware: all Linux
: P3 major
Assignee: Alexey Gladkov
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2012-09-24 10:22 MSK by Nikolay A. Fetisov
Modified: 2012-09-27 12:41 MSK (History)
7 users (show)

See Also:


Attachments
lsmod после ошибки losetup (4.83 KB, text/plain)
2012-09-26 18:27 MSK, Nikolay A. Fetisov
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Nikolay A. Fetisov 2012-09-24 10:22:46 MSK
Для 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-устройство в системе).
Comment 1 Alexey Gladkov 2012-09-24 11:11:12 MSK
Прикольно:

# 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

Никаких проблем не вижу.
Comment 2 Nikolay A. Fetisov 2012-09-24 11:41:56 MSK
Проверил на другой машине.
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
Comment 3 Alexey Gladkov 2012-09-24 11:51:25 MSK
У меня нет 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 нет.
Может быть в этом дело ?
Comment 4 Nikolay A. Fetisov 2012-09-24 13:54:06 MSK
На двух машинах - одинаково:
$ 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 .
Comment 5 Alexey Gladkov 2012-09-24 15:20:20 MSK
На моём ядре не воспроизводится. Я попробую вечером воспроизвести на более новом и посмотрю на std-def.
Comment 6 Alexey Gladkov 2012-09-24 15:39:06 MSK
На всякий случай добавляю aspsk@.
Comment 7 Michael Shigorin 2012-09-26 16:30:52 MSK
# 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
Comment 8 Alexey Gladkov 2012-09-26 16:32:54 MSK
Николай, не могли бы вы прислать dmesg и lsmod с той машины, где воспроизводится?
dmesg после того как воспроизведётся естественно.
Comment 9 Nikolay A. Fetisov 2012-09-26 18:24:43 MSK
(В ответ на комментарий №7)
> # rpmquery losetup
> losetup-2.20.1-alt2

2.20.1-alt2 и у меня везде работает. Речь о текущем 2.22-alt1.
Comment 10 Nikolay A. Fetisov 2012-09-26 18:27:20 MSK
Created attachment 5574 [details]
lsmod после ошибки losetup
Comment 11 Nikolay A. Fetisov 2012-09-26 18:45:09 MSK
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)
Comment 12 Alexey Gladkov 2012-09-26 19:09:03 MSK
Можете посмотреть, кто у вас держит /dev/loop[0-3] ?
Comment 13 Alexey Gladkov 2012-09-26 19:14:32 MSK
https://bugzilla.redhat.com/show_bug.cgi?id=758159

это не ваш случай ?
Comment 14 Nikolay A. Fetisov 2012-09-26 19:39:12 MSK
(В ответ на комментарий №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.
Comment 15 Nikolay A. Fetisov 2012-09-26 19:47:53 MSK
(В ответ на комментарий №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.
Comment 16 Michael Shigorin 2012-09-26 21:00:33 MSK
(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
# _
Comment 17 Nikolay A. Fetisov 2012-09-26 22:44:28 MSK
(В ответ на комментарий №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)?
Comment 18 Alexey Gladkov 2012-09-26 23:27:30 MSK
(В ответ на комментарий №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*!
Comment 19 Alexey Gladkov 2012-09-26 23:35:17 MSK
У меня ещё к вам просьба. Не могли бы вы показать:

# mount |fgrep ' /dev '

?
Comment 20 Nikolay A. Fetisov 2012-09-27 07:40:15 MSK
(В ответ на комментарий №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)
Comment 21 Alexey Gladkov 2012-09-27 11:41:10 MSK
Если исправить тип и права на устройства, то проблема решается ?
Comment 22 Gleb F-Malinovskiy 2012-09-27 12:03:27 MSK
(В ответ на комментарий №21)
> Если исправить тип и права на устройства, то проблема решается ?

У меня работает.
Поменял в /lib/tmpfiles.d/losetup-loop.conf -- c на b и 640 на 660.
Comment 23 Gleb F-Malinovskiy 2012-09-27 12:05:46 MSK
(В ответ на комментарий №22)
> (В ответ на комментарий №21)
> > Если исправить тип и права на устройства, то проблема решается ?
> 
> У меня работает.
> Поменял в /lib/tmpfiles.d/losetup-loop.conf -- c на b и 640 на 660.

После замены работает, в смысле.
До замены я тоже получал Inappropriate ioctl for device.
Comment 24 Repository Robot 2012-09-27 12:41:07 MSK
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).