LINUX.ORG.RU

Отвалившееся автомонтирование посредством udev

 , ,


0

1

В общем, обновился. Вроде бы, все прошло гладко, за одним исключением: перестали монтироваться usb-hdd с файловой системой ntfs.

->ls $usb/sdb1                                         
ls: невозможно получить доступ к /mnt/usb/sdb1: Конечная точка передачи не подсоединена

->mount|grep sdb1
/dev/sdb1 on /mnt/usb/sdb1 type fuseblk (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other,blksize=4096)

->sudo fdisk -l /dev/sdb
isk /dev/sdb: 931,5 GiB, 1000204885504 bytes, 1953525167 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xb4612232

Device     Boot Start        End    Sectors   Size Id Type
/dev/sdb1  *     2048 1953521663 1953519616 931,5G  7 HPFS/NTFS/exFAT


->dmesg
...
139229.308093] usb 1-3: new high-speed USB device number 47 using ehci-pci
[139229.443455] usb 1-3: New USB device found, idVendor=0bc2, idProduct=2312
[139229.443467] usb 1-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[139229.443474] usb 1-3: Product: Expansion
[139229.443480] usb 1-3: Manufacturer: Seagate 
[139229.443487] usb 1-3: SerialNumber: NA47EQNA
[139229.444089] usb-storage 1-3:1.0: USB Mass Storage device detected
[139229.446050] scsi56 : usb-storage 1-3:1.0
[139230.445099] scsi 56:0:0:0: Direct-Access     Seagate  Expansion        0636 PQ: 0 ANSI: 6
[139230.445740] sd 56:0:0:0: Attached scsi generic sg1 type 0
[139230.450678] sd 56:0:0:0: [sdb] Spinning up disk...
[139234.584062] .ready
[139234.584857] sd 56:0:0:0: [sdb] 1953525167 512-byte logical blocks: (1.00 TB/931 GiB)
[139234.585572] sd 56:0:0:0: [sdb] Write Protect is off
[139234.585581] sd 56:0:0:0: [sdb] Mode Sense: 2b 00 10 08
[139234.586346] sd 56:0:0:0: [sdb] Write cache: enabled, read cache: enabled, supports DPO and FUA
[139234.615223]  sdb: sdb1
[139234.617929] sd 56:0:0:0: [sdb] Attached SCSI disk

Монтирование производится так:

cat /etc/udev/rules.d/00-personal.rules

SUBSYSTEM=="block", ACTION=="remove", RUN+="/bin/umount -lf /mnt/usb/$name", RUN+="/bin/rmdir /mnt/usb/$name"

SUBSYSTEM=="block", DRIVERS=="usb-storage", ACTION=="add", RUN+="/etc/udev/scripts/usbmount $name"

cat /etc/udev/scripts/usbmount:

mkdir /mnt/usb/$1
umount /dev/$1
mount -t vfat -o rw,noexec,uid=1000,quiet,umask=022,flush,dirsync /dev/$1 /mnt/usb/$1 || ntfs-3g -o uid=1000,gid=1000,dmask=022,fmask=133,noauto,locale=ru_RU.UTF-8,force /dev/$1 /mnt/usb/$1

Манипуляции с заменой в правиле udev $name на идентификатор %k ничего не дали. Попытка заменить скрипт на /bin/mount /dev/$name /mnt/test или сменить очередность попыток монтирования - аналогично.

Как видно, опции монтирования, передаваемые скриптом, отличаются от того, что выдает после неудачного монтирования mount.

Вручную скрипт отрабатывает как надо, как и ручное монтирование:

->sudo /etc/udev/scripts/usbmount sdb1 
mkdir: невозможно создать каталог «/mnt/usb/sdb1»: Файл существует
umount: /dev/sdb1: not mounted

->ls -l $usb/sdb1
итого 68K
drwxr-xr-x 1 user user 8,0K янв 10  2014 1/
drwxr-xr-x 1 user user 4,0K ноя 17 16:33 2/
drwxr-xr-x 1 user user 4,0K янв 10  2014 3/
drwxr-xr-x 1 user user    0 янв 10  2014 4/
drwxr-xr-x 1 user user 4,0K янв 11  2014 5/
drwxr-xr-x 1 user user  48K мар 29 22:24 6/

->mount |grep sdb1                                     
/dev/sdb1 on /mnt/usb/sdb1 type fuseblk (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other,blksize=4096)

Вопрос: кто виноват и что с этим делать? Ах да, флешка с vfat успешно монтируется в автоматическом режиме.

Попробуй убрать нахер свои костыли и монтировать через thunar или наутилус как все нормальные люди. Если сработает значит у тебя руки из жопы - разбирайся со своим говнокодом.

anonymous ()
Ответ на: комментарий от anonymous

Очень ценный совет, ога. Положим, что мне нахер не нужна привязка к какому-то определенному файлменеджеру. И «костыли» прекрасно работали, как бы, не со времен саржа. Или когда там в дебиане появился udev.

Еще б «перезагрузить» или «переустановить» бы посоветовал, тьфу.

warl0ck ★★ ()
Последнее исправление: warl0ck (всего исправлений: 1)

mount -t vfat

Так может это в скрипте и мешает?

curufinwe ★★★★★ ()

Для тех кто в бронетанке (udev changelog ещё до слияния с systemd)

Summary of changes from v177 to v178
....

 udevd: kill hanging event processes after 30 seconds
...

Раcшифровка такова, любой процесс порождённый через udev не может исполняться более чем 30 секунд, далее он жестоко убивается, для работы nfts-3g нужен постоянно висящий процесс, таким образом смонтированный ntfs раздел будет доступен максимум 30 секунд после его монтирования udev'вом. Что мы и видим в посте тса.

Выход из это ситуации простой - использовать что-то другое для монтирования (например udevil/devmon)

dhampire ★★★ ()
Ответ на: комментарий от curufinwe

Так может это в скрипте и мешает?

Кабы все было так просто, увы. Писал выше, замена на mount a b, либо ntfs-3g -o params a b ничего не дает - результат тот же.

Но обнаружил любопытный эффект: монтирование-таки производится корректно. Заметил, запустив watch -t -n1 'ls /mnt/usb/sdb1

Через пару секунд маунтпоинт становится недоступным:

ls: cannot access /mnt/usb/sdb1: Transport endpoint is not connected


Кажется, начинаю понимать, что происходит. Правила udev не только описывают устройство, но и могут переопределяться. Потому и генерится эвент «change».

Копаем дальше.

warl0ck ★★ ()
Ответ на: комментарий от warl0ck

Как одно из решений, можно поставить udisks2 и из udev-правила выполнять /usr/bin/udisksctl mount --block-device /dev/%k --options <...> --no-user-interaction.

Или просто написать шаблонный systemd-юнит, который будет вызывать mount, и из правила делать systemctl start usbmount@%k.service. Это вообще самое lightweight-решение, эквивалентное тому, что у тебя было.

Юнит будет примерно таким: /etc/systemd/system/usbmount@.service:

[Unit]
Description=Mount removable /dev/%i
BindsTo=dev-%i.device
After=dev-%i.device

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/bin/mkdir -p /mnt/usb/%i
ExecStart=/bin/mount /dev/%i /mnt/usb/%i <...>

Отмонтироваться должно само. Если не само — допиши ExecStop=.

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 3)
Ответ на: комментарий от dhampire

А если отвязать дочерний процесс? Как я понимаю, '&' на конце команды уведет ее (команду) в фоновый режим, но не отвяжет от родительских PID и tty?

yars068 ★★★★ ()
Ответ на: комментарий от yars068

Теоретичеки, если сделать скрипт монтирования /etc/udev/scripts/usbmount таким

mkdir /mnt/usb/$1
umount /dev/$1
mount -t vfat -o rw,noexec,uid=1000,quiet,umask=022,flush,dirsync /dev/$1 /mnt/usb/$1 || nohup ntfs-3g -o uid=1000,gid=1000,dmask=022,fmask=133,noauto,locale=ru_RU.UTF-8,force /dev/$1 /mnt/usb/$1 > /dev/null &
может прокатить. у меня возможности проверить нет.

warl0ck можешь проверить этот мега костыль ? :}

dhampire ★★★ ()
Ответ на: комментарий от dhampire

А зачем mount || nohup? mount-то сначала выполнится без ошибок.

intelfx ★★★★★ ()
Ответ на: комментарий от dhampire

С nohup пробовал, нет эффекта. Процесс все равно убивается.

warl0ck ★★ ()
Ответ на: комментарий от intelfx

Вот это толково. Но, в любом случае, сделал по совету dhampire через udevil+devmon.

warl0ck ★★ ()

Как вариант на будущее можешь попробовать ещё udiskie + udisks2. Сколько юзал всегда работало как часы.

Ой, некропост(

e7z0x1 ★★★★★ ()
Последнее исправление: e7z0x1 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.