LINUX.ORG.RU

Как в /etc/fstab прописать опции монтирования vfat, ntfs, ext2/3 на один и тот же девайс?


0

2

Здравствуйте!


Вопрос такой. К одному и тому же USB-гнезду надо иметь возможность подключать USB-Flash накопитель. Накопители бывают разные - с FAT, с NTFS, с EXT2/3, с UDF.

Худо-бедно происходит автомонтирование флешек (если повезёт). Но опции монтирования не содержат нужных ключей. Поэтому vfat, например, монтируется с кракозябрами вместо русских имен файлов, а ntfs монтируется только на чтение и файлов на русском языке вообще не видно.

У меня есть коллекция mount-команд, которые я применяю, чтобы подключить тот или иной диск. Но уже честноговоря устал рукоблудием заниматься.


В связи с этим вопрос: как и где блин прописать опции монтирования для разных файловых систем, которые возможны на одном и том же девайсе? В fstab можно прописать только один вариант, а надо четыре, и чтобы нужный вариант автоматом выбирался. Как это сделать?

Ну или скриптик в .bashrc, с определением типа фс через blkid.

anon_666 ()

Я просто сделал так:

/dev/sdh1		/media/Flash	vfat	user,noauto,uid=eddy,fmask=111,dmask=000,iocharset=koi8-r 0 0
/dev/sdh1		/media/HD	auto	user,noauto,exec	0 0
/dev/sdh1		/media/USBHD	ntfs-3g	noauto,user,uid=eddy,fmask=133,iocharset=koi8-r,locale=ru_RU.koi8-r,codepage=cp866 0 0

Eddy_Em ☆☆☆☆☆ ()

Ытить, что у тебя за дистрибутив/system encoding? Давно уже автоматом все работает (для fat|ntfs точно), ну кроме, может быть dmask/fmask

annoynimous ★★★★★ ()

В fstab можно писать uuid

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

> Я просто сделал так:

/dev/sdh1 /media/Flash vfat user,noauto,uid=eddy,fmask=111,dmask=000,iocharset=koi8-r 0 0

/dev/sdh1 /media/HD auto user,noauto,exec 0 0


/dev/sdh1 /media/USBHD ntfs-3g noauto,user,uid=eddy,fmask=133,iocharset=koi8-r,locale=ru_RU.koi8-r,codepage=cp866 0 0



Я попробовал так сделать. То есть, девайс один, каталоги монтирования разные.

В результате, когда суешь USB-диск с NTFS, линух всеравно пытается примонтировать как vfat (видимо потому, что vfat первый в списке).

dmesg показывает:

[14786.501497] sd 6:0:0:0: [sdb] Attached SCSI disk
[14788.248884] FAT: bogus number of reserved sectors
[14788.248884] VFS: Can't find a valid FAT filesystem on dev sdb1.

Я совершенно не могу понять, почему такой способ у тебя работает, а у меня - нет.

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

Я совершенно не могу понять, почему такой способ у тебя работает, а у меня - нет.

А потому что у меня автомонтирование запрещено. Мне лень убивать вечер на настройку правил udev, куда проще вписать строчки в fstab и монтировать руками.

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

Хотя, щас проверил - даже если NTFS перенести вверх, всёравно вылетает та же самая ошибка:

[14977.701892] sd 7:0:0:0: [sdb] Attached SCSI disk
[14979.622161] FAT: bogus number of reserved sectors
[14979.622161] VFS: Can't find a valid FAT filesystem on dev sdb1.

То есть, файловая система автоматически не определяется, соответсвенно, выбор нужных опций не происходит.

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

> А потому что у меня автомонтирование запрещено. Мне лень убивать вечер на настройку правил udev, куда проще вписать строчки в fstab и монтировать руками.

Блин, мы говорим об автомонтировании, что ты путаешь народ. Так руками перетыкать строчки и я могу, только чуствую себя обезьяной.

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

Просто по теме я дальше первого абзаца и названия не читал :)

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Lumi

> http://www.linux.org.ru/jump-message.jsp?msgid=5310148&cid=5312582

И там с опциями монтирования извращайся как угодно.


Вся проблема в этом решении в том, что неясно, как отключить автомонтирование (которое имеет неправильные опции), которе уже прописано в UDEV разработчиками.

У меня в DEBIAN Lenny там сам черт ногу сломит.

То есть, даже если я пропишу правила в файл 01-media-auto-mount.rules, то после них где-то в дебрях UDEV еще раз сработает написанное разработчиками правило.

Вопрос - как убрать правила монтирования, которые уже существуют, чтоб остались только мои?

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

> Вся проблема в этом решении в том, что неясно, как отключить автомонтирование (которое имеет неправильные опции), которе уже прописано в UDEV разработчиками.

Это не проблема данного решения.

У меня в DEBIAN Lenny там сам черт ногу сломит.


Слабоваты ноженьки твоего чёрта
grep sd etc/udev/rules.d/* | wc -l
16
Такой же ленни в соседнем разделе

Вопрос - как убрать правила монтирования, которые уже существуют, чтоб остались только мои?


Ты уверен, что тебе юдев монтирует, а не хал?
И потом, тебе шашечки, или ехать?

Насчёт шашечек... К этому скрипту надо дописать кое что этакое, чтобы можно было отмонтировать пользователем. Например добавление точек монтирования в /etc/fstab с параметром user и корректное удаление этих точек из этого файла при отмонтировании.

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

Это не проблема данного решения.

У меня в DEBIAN Lenny там сам черт ногу сломит.

Слабоваты ноженьки твоего чёрта

grep sd etc/udev/rules.d/* | wc -l

Посмотрим:

# grep sd /etc/udev/rules.d/*
/etc/udev/rules.d/50-udev.rules:SUBSYSTEMS=="scsi", KERNEL=="sd[a-z]", ATTR{removable}=="1", \
/etc/udev/rules.d/50-udev.rules:KERNEL=="capi",                 NAME="capi20", SYMLINK+="isdn/capi20"
/etc/udev/rules.d/60-persistent-storage.rules:KERNEL=="sd*[!0-9]|sr*",          ATTRS{ieee1394_id}=="?*", \
/etc/udev/rules.d/60-persistent-storage.rules:KERNEL=="sd*[!0-9]|sr*",          ENV{ID_SERIAL}!="?*", \
/etc/udev/rules.d/60-persistent-storage.rules:KERNEL=="sd*[!0-9]|sr*",          ENV{ID_SERIAL}!="?*", \
/etc/udev/rules.d/60-persistent-storage.rules:KERNEL=="dasd*[!0-9]", \
/etc/udev/rules.d/60-persistent-storage.rules:  IMPORT{program}="dasd_id --export $tempnode"
/etc/udev/rules.d/60-persistent-storage.rules:KERNEL=="sd*|hd*|cciss*", ENV{DEVTYPE}=="disk", \
/etc/udev/rules.d/60-persistent-storage.rules:KERNEL=="sd*[!0-9]|sr*",          ENV{ID_VENDOR}=="ATA", \
/etc/udev/rules.d/60-persistent-storage.rules:KERNEL=="sd*[!0-9]|sr*",          ENV{ID_ATA_COMPAT}=="?*", \
/etc/udev/rules.d/60-persistent-storage.rules:KERNEL=="sd*[0-9]",                       ENV{ID_ATA_COMPAT}=="?*", \
/etc/udev/rules.d/60-persistent-storage.rules:KERNEL=="sd*|sr*|dasd*|cciss*", ENV{DEVTYPE}=="disk",ENV{ID_SERIAL}=="?*", \
/etc/udev/rules.d/60-persistent-storage.rules:KERNEL=="sd*|dasd*|cciss*", ENV{DEVTYPE}=="partition",ENV{ID_SERIAL}=="?*", \
/etc/udev/rules.d/60-persistent-storage.rules:ENV{DEVTYPE}=="disk", KERNEL!="sd*|sr*", ATTR{removable}=="1", \
/etc/udev/rules.d/80-drivers.rules:                                     RUN+="/sbin/modprobe -b tifm_sd"
/etc/udev/rules.d/80-drivers.rules:SUBSYSTEM=="scsi_device", ATTRS{type}=="0|7|14", RUN+="/sbin/modprobe -b sd_mod"

Ну и как по этому выхлопу понять, каким образом работает автомонтирование?


Вопрос - как убрать правила монтирования, которые уже существуют, чтоб остались только мои?

Ты уверен, что тебе юдев монтирует, а не хал?

Не уверен. Я вообще не знаю как это определить. Могу только сказать, что в системе по-умолчанию запущены демоны и udev и hal.

Кроме того, я не понимаю смысл фразы «что тебе юдев монтирует, а не хал». UDEV служит просто для запуска команд, когда он видит, что в системе произошли какие-то подключени/отключения. То есть, если он видит, что подключено /dev/sda1, он обязан выполнить правило, которое назначено данному событию. И никакой HAL ему никак не может помешать это сделать. Ну это я так понимаю, может быть я неправ.


Я делаю простую вещь:

1. Создаю файл /etc/udev/rules.d/01-media-auto-mount.rules

2. Заполняю его следующим содержимым:

KERNEL!="sd[a-z]*", GOTO="automount_end"
ACTION=="add", KERNEL=="sd[a-z][1-9]", RUN+="echo Run_mount >> /opt/automount/log.txt"
ACTION=="remove", KERNEL=="sd[a-z][1-9]", RUN+="echo Run_umount >> /opt/automount/log.txt"
LABEL="automount_end"

3. Создаю каталог /opt/automount, назначаю /opt и /opt/automount права 777

4. Даю под рутом команду обновления правил UDEV:

# udevadm control --reload_rules

5. Втыкаю флешку. Жду, появится ли файл /opt/automount/log.txt. Файл не появляется.

Вопрос. Почему не срабатывает правило?

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

> Ну и как по этому выхлопу понять, каким образом работает автомонтирование?

Смотришь глазами, думаешь головой.

Не уверен. Я вообще не знаю как это определить. Могу только сказать, что в системе по-умолчанию запущены демоны и udev и hal.


Останови хал, да повтыкай флешки туда-сюда. Что сложного?

# cat /etc/udev/rules.d/01-media-auto-mount.rules
KERNEL!=«sd[a-z]*», GOTO=«automount_end»
ACTION==«add», KERNEL==«sd[a-z][1-9]», RUN+=«/opt/automount/mount»
ACTION==«remove», KERNEL==«sd[a-z][1-9]», RUN+=«/opt/automount/mount»
LABEL=«automount_end»

# cat /opt/automount/mount
#! /bin/bash
echo УМВР >> /opt/automount/log.txt

# udevadm control --reload-rules

# fdisk -l

Disk /dev/sdg: 8005 MB, 8005787648 bytes
247 heads, 62 sectors/track, 1021 cylinders
Units = cylinders of 15314 * 512 = 7840768 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Device Boot Start End Blocks Id System
/dev/sdg1 * 1 1021 7817766 b W95 FAT32


# cat /opt/automount/log.txt
УМВР
УМВР
УМВР
УМВР

Ищи причины в руках своих кривых. То, что я дал в первоначальной ссылке, в отличие от твоих вариантов, работает. И работает замечательно. Копипасть и пользуйся. И дописывай в скрипт нужную функциональность для каждой файловой системы. Всё что в голову взбредёт. Тебе надо-то было всего лишь остановить хал, чтобы он не монтировал повторно, а не умничать.
А ты если любишь пописать «разоблачения» «чертоноголоматия», сначала выучи матчасть.

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

Вот еще какое наблюдение.

Если запустить команду мониторинга создаваемых переменных окружения, то видим такое:

# udevadm monitor --env | grep sdb
UEVENT[1291987719.210433] add      /block/sdb (block)
DEVPATH=/block/sdb
UEVENT[1291987719.210440] add      /block/sdb/sdb1 (block)
DEVPATH=/block/sdb/sdb1
UDEV  [1291987719.349944] add      /block/sdb (block)
DEVPATH=/block/sdb

Впринципе, всенормально. Но если попробовать мониторить события ядра:

# udevadm monitor --kernel | grep sdb

то такая команда ничего не выводит на экран. Кроме того, перестаёт работать автомонтирование, которое преднастроено в системе. С какого перепугу мониторинг влияет на действия - непонятно.


Тут у меня догадка есть, почему правило не срабатыват. Может быть, просто не проходит сравнение KERNEL==«sd[a-z][1-9]». А не проходит потому, что даже мониторинг --kernel не работает. То есть, события, соответсвующего нашей маске не возникает.


Вопрос. Как еще можно прописать правило, чтобы оно срабатывало и рапортовало имя девайса?

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

А у меня не работает.

Попробуй у себя запустить команду:

# udevadm monitor --kernel | grep sdg

И повтыкай флешку/диск.

У тебя что-нибудь выводит? Если выводит, то запость сюда что именно, чтоб образец был.

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

# udevadm monitor --kernel | grep sdg
KERNEL[1291988762.027644] remove /devices/pci0000:00/0000:00:1d.7/usb1/1-7/1-7:1.0/host16/target16:0:0/16:0:0:0/block/sdg/sdg1 (block)
KERNEL[1291988762.032450] remove /devices/pci0000:00/0000:00:1d.7/usb1/1-7/1-7:1.0/host16/target16:0:0/16:0:0:0/block/sdg (block)
KERNEL[1291988788.047206] add /devices/pci0000:00/0000:00:1d.7/usb1/1-7/1-7:1.0/host20/target20:0:0/20:0:0:0/block/sdg (block)
KERNEL[1291988788.047310] add /devices/pci0000:00/0000:00:1d.7/usb1/1-7/1-7:1.0/host20/target20:0:0/20:0:0:0/block/sdg/sdg1 (block)
KERNEL[1291988799.871252] remove /devices/pci0000:00/0000:00:1d.7/usb1/1-7/1-7:1.0/host20/target20:0:0/20:0:0:0/block/sdg/sdg1 (block)
KERNEL[1291988799.875963] remove /devices/pci0000:00/0000:00:1d.7/usb1/1-7/1-7:1.0/host20/target20:0:0/20:0:0:0/block/sdg (block)
KERNEL[1291988810.419583] add /devices/pci0000:00/0000:00:1d.7/usb1/1-7/1-7:1.0/host21/target21:0:0/21:0:0:0/block/sdg (block)
KERNEL[1291988810.419685] add /devices/pci0000:00/0000:00:1d.7/usb1/1-7/1-7:1.0/host21/target21:0:0/21:0:0:0/block/sdg/sdg1 (block)

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

> А у меня не работает.
Плохо конечно, но я тебя обрадую. У меня с RUN+=«echo Run_mount >> /opt/automount/log.txt» тоже не работает. Поэтому я тебе написал работоспособный вариант со скриптом.

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

> Вопрос. Как еще можно прописать правило, чтобы оно срабатывало и рапортовало имя девайса?

KERNEL!=«sd[a-z]*», GOTO=«automount_end»
ACTION==«add», KERNEL==«sd[a-z][1-9]», RUN+=«/usr/local/bin/media_mount '%k' mount»
ACTION==«remove», KERNEL==«sd[a-z][1-9]», RUN+=«/usr/local/bin/media_mount '%k' unmount»
LABEL=«automount_end»

# cat /usr/local/bin/media_mount
#! /bin/bash
echo «$0 $1 $2» >> /var/log/ahtung.log

Воткнул две флешки

# cat /var/log/ahtung.log
/usr/local/sbin/media_mount sdg1 mount
/usr/local/sbin/media_mount sdh1 mount

Вытащил их в обратном порядке

cat /var/log/ahtung.log
/usr/local/sbin/media_mount sdg1 mount
/usr/local/sbin/media_mount sdh1 mount
/usr/local/sbin/media_mount sdh1 unmount
/usr/local/sbin/media_mount sdg1 unmount

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

# udevadm monitor --kernel | grep sdg

KERNEL[1291988762.027644] remove /devices/pci0000:00/0000:00:1d.7/usb1/1-7/1-7:1.0/host16/target16:0:0/16:0:0:0/block/sdg/sdg1 (block)

Замечательно. А у меня не работает:

# ps aux | grep hal
105       2925  0.0  0.1   6184  3968 ?        Ss   15:16   0:00 /usr/sbin/hald
root      2926  0.0  0.0   3324  1096 ?        S    15:16   0:00 hald-runner
root      2946  0.0  0.0   3388  1036 ?        S    15:16   0:00 hald-addon-input: Listening on /dev/input/event3 /dev/input/event2 /dev/input/event0
105       2954  0.0  0.0   2268   884 ?        S    15:16   0:00 hald-addon-acpi: listening on acpid socket /var/run/acpid.socket
root      2960  0.0  0.0   3388  1040 ?        S    15:16   0:00 hald-addon-storage: polling /dev/hdb (every 2 sec)
root      4450  0.0  0.0   3844  1036 ?        Ss   16:32   0:00 /sbin/mount.ntfs-3g /dev/sdb1 /media/FreeAgent Drive -o rw,nosuid,nodev,uhelper=hal,locale=ru
root      4518  0.0  0.0   3148   796 pts/6    S+   16:52   0:00 grep hal

# /etc/init.d/hal stop
Stopping Hardware abstraction layer: hald.

# ps aux | grep hal
root      4567  0.0  0.0   3144   788 pts/6    S+   16:54   0:00 grep hal

# udevadm monitor --kernel | grep sdb

Втыкаю-вытыкаю - пусто.

И что я не так делаю? Я даже вместо «sdb» пишу «sd»

# udevadm monitor --kernel | grep sd

И тоже вывод пустой.


Что делать дальше?

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

> Замечательно. А у меня не работает:
То есть у тебя ядро флешку не понимает?

Вынимаешь флешку
# find /sys > /tmp/1.txt
Вставляешь флешку
# find /sys > /tmp/2.txt
# diff -urN /tmp/1.txt /tmp/2.txt | grep -v @ | grep +
Должно быть очень много текста...

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

>> Замечательно. А у меня не работает:

То есть у тебя ядро флешку не понимает?


Понимает, она же автомонтируется когда HAL включен. А вывод «udevadm monitor --kernel | grep sdb» - пустой, когда втыкаешь-вытыкаешь. При этом вывод «udevadm monitor --env | grep sd» _не_пустой_, смотри выше.


Вынимаешь флешку

# find /sys > /tmp/1.txt


Вставляешь флешку


# find /sys > /tmp/2.txt


# diff -urN /tmp/1.txt /tmp/2.txt | grep -v @ | grep +


Должно быть очень много текста...



1.txt: http://paste.org.ru/?fz092d
2.txt: http://paste.org.ru/?pea194
diff: http://paste.org.ru/?jp7fti

Что можно сказать по этим данным?

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

Еще информация, может пригодится.

Вот что dmesg показывает, когда вставляю флешку:

[23759.744654] usb 4-1: new high speed USB device using ehci_hcd and address 13
[23759.877264] usb 4-1: configuration #1 chosen from 1 choice
[23759.882320] scsi15 : SCSI emulation for USB Mass Storage devices
[23759.882320] usb-storage: device found at 13
[23759.882320] usb-storage: waiting for device to settle before scanning
[23759.882320] usb 4-1: New USB device found, idVendor=0bc2, idProduct=2100
[23759.882320] usb 4-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[23759.882320] usb 4-1: Product: FreeAgent
[23759.882320] usb 4-1: Manufacturer: Seagate
[23759.882320] usb 4-1: SerialNumber: 2GE3M80P
[23764.883879] usb-storage: device scan complete
[23764.887350] scsi 15:0:0:0: Direct-Access     Seagate  FreeAgent Go     102F PQ: 0 ANSI: 4
[23764.887350] sd 15:0:0:0: [sdb] 625142448 512-byte hardware sectors (320073 MB)
[23764.887350] sd 15:0:0:0: [sdb] Write Protect is off
[23764.887350] sd 15:0:0:0: [sdb] Mode Sense: 1c 00 00 00
[23764.887350] sd 15:0:0:0: [sdb] Assuming drive cache: write through
[23764.887350] sd 15:0:0:0: [sdb] 625142448 512-byte hardware sectors (320073 MB)
[23764.887350] sd 15:0:0:0: [sdb] Write Protect is off
[23764.887350] sd 15:0:0:0: [sdb] Mode Sense: 1c 00 00 00
[23764.887350] sd 15:0:0:0: [sdb] Assuming drive cache: write through
[23764.887350]  sdb: sdb1
[23764.932133] sd 15:0:0:0: [sdb] Attached SCSI disk

Вот что показывает когда вытаскиваю:

[23911.278267] usb 4-1: USB disconnect, address 13
xintrea ()
Ответ на: комментарий от xintrea

Посмотрел дифф, в /sys стало быть информация про устройство sdb появляется, sdb1 тоже фигурирует. Всё с этой стороны в порядке.
Появляется ли /dev/sdb* при вставке флешки? Если нет, значит не реагирует udev. Переустанови пакет, откати свои правки в правилах. Удали лишние файлы правил, которые добавлял.

И можно определиться с более оперативными средствами связи.

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

Ну это и так понятно уже, что проблемы с udev.

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

> Ты обещал эту тему пометить как решённую и поделиться рецептом.

Я вот закончу товарищу настраивать лялих, и напишу. Только рецепт-то не готовый. Я так и не смог настроить нормальное подключение. Третий день пошел.

Работает только монтирование. При этом UDEV дерется с HAL. А как HAL отключаешь, так CD-Rom перестает монтироваться. Это еще CD-Rom пилить надо. А что еще на HAL завязано, трудно понять, ибо конфиги объемные.

И еще затык на отмонтировании, если HAL включен. А его отключать нельзя, пока не разберусь, за что он отвечает.

В общем, 2010 год на дворе, а люди так и тратят человекогода на то, чтоб по человечески заработало монтирование, мазафака.

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

> Работает только монтирование.
Если есть запись в fstab с users то будет работать и отмонтирование.

При этом UDEV дерется с HAL.

Хал можно не стартовать, или подчистить конфиги хала, чтобы он не занимался монтированием.

А как HAL отключаешь, так CD-Rom перестает монтироваться

Сидиром можно точно также монтировать, вписав в правила sr* для устройства, или как он там определяется в системе.

Тебе проще было помучиться с халом, чтобы он правильные параметры выставлял для флешки, так как с остальным не было проблем.

В общем, 2010 год на дворе, а люди так и тратят человекогода на то, чтоб по человечески заработало монтирование, мазафака.

Согласен, только как-то туго у тебя идёт. Мне с этим намного проще. USE=-hal и вперёд со свистом.

И еще затык на отмонтировании, если HAL включен.

Если хал не монтировал, то и отмонтировать не сможет.

А его отключать нельзя, пока не разберусь, за что он отвечает.

У тебя отвалится в иксах определение планшетов (нужно будет руками прописывать), автомонтирование накопителей, не будет определять привод в k3b (это самое страшное, всё остальное легко решается), принтеры при подключении не будут сами определяться, нужно будет руками выбирать тип и драйвер.

Вообще ленни это не то, где можно легко и просто выкинуть хал. Ладно бы там, до сквизи подтянуть, там уже хал мешается. Но, с твоей кармой мне сквизи как-то даже грех предлагать.

Lumi ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.