Этот вопрос подобен, но вид противоположности того, что я хочу. Я хочу, чтобы внешние Карты памяти были смонтированы автоматически при начальной загрузке, ни с кем вошел в систему, к местоположениям как /media/<label>
.
Я не хочу должным быть вводить все данные в fstab, частично потому что это является утомительным и раздражающим, но главным образом потому что я не могу предсказать то, что я буду включать его или как разделы изменятся в будущем.
Я хочу диски быть доступным для вещей как MPD и доступным, когда я вхожу в систему с SSH. gnome-mount
кажется, только монтирует вещи, когда Вы локально зарегистрированы в Gnome графическая сессия.
vol_id
команда. vol_id
был заменен blkid
. Для фиксации сценария замените "vol_id" "blkid-o udev" в udev-auto-mount.sh
сценарий.Я ударял по голове вокруг этого некоторое время теперь, и я думаю, что нашел рабочее решение. Это разрабатывается и тестируется в находящейся в Debian системе, таким образом, она должна работать над Ubuntu. Я укажу на предположения, которые это делает так, это может быть адаптировано к другим системам также.
/media/LABEL
каталог для монтирования устройства к. gksudo
или подобный.Я не протестировал это на начальной загрузке системы, но единственная причина I видит, что не могла бы работать, то, если она пытается смонтировать Карту памяти, прежде чем система будет готова к монтированию. Если это так, Вам, вероятно, будет нужна одна дополнительная тонкая настройка к сценарию монтирования. (Я согласовываю с ServerFault, чтобы видеть, существует ли совет, но не много интереса к нему там.)
На нем, затем.
UDEV является системой замены в горячем режиме ядра. Это - то, что автоволшебно настраивает надлежащие устройства и символьные ссылки устройства (например, /dev/disk/by-label/<LABEL>
), и во время начальной загрузки и для устройств, добавленных, в то время как система работает.
D-шина и HAL используются для отправки аппаратных событий слушателям как Настольные среды. Таким образом, когда Вы входите в GNOME и вставляете CD или включаете Карту памяти, то событие следует за этой цепочкой:
kernel -> udev -> dbus -> hal -> gnome-vfs/nautilus (mount)
И престо, Ваш диск смонтирован. Но в бездисплейной системе, мы не хотим должными быть входить в систему, извлекают пользу из автомонтирования.
Так как UDEV позволяет нам записать правила и запустить программы на установке устройства, это - идеальный выбор. Мы собираемся использовать в своих интересах существующие правила Debian/Ubuntu, позволить им установить /dev/disk/by-label/<LABEL>
символьная ссылка для нас, и добавляет другое правило, которое смонтирует устройство для нас.
Правила UDEV удерживаются /etc/udev/rules.d
(и /lib/udev/rules.d
на Кармическом), и обрабатываются в числовом порядке. Любой файл, не запускающийся с числа, обрабатывается после пронумерованных файлов. В моей системе правила HAL находятся в названном файле 90-hal.rules
, таким образом, я вставил свои правила 89-local.rules
таким образом, они обрабатываются, прежде чем они доберутся до HAL. Прежде всего, необходимо удостовериться, что эти правила происходят после 60-persistent-storage.rules
. local.rules
может быть достаточно хорошим.
Поместите это в свой новый файл правил:
# /etc/udev/rules.d/local.rules
# /etc/udev/rules.d/89-local.rules
# ADD rule: if we have a valid ID_FS_LABEL_ENC, and it's USB, mkdir and mount
ENV{ID_FS_LABEL_ENC}=="?*", ACTION=="add", SUBSYSTEMS=="usb", \
RUN+="/usr/local/sbin/udev-automounter.sh %k"
Удостоверьтесь, что нет никаких пробелов после \
, просто a newline
(\n
).
Изменение SUBSYSTEMS=="usb"
кому: SUBSYSTEMS=="usb|ieee1394"
для поддержки Firewire.
Если Вы хотите, чтобы устройство всегда принадлежало конкретному пользователю, добавьте OWNER="username"
пункт. Если Вы просто нуждаетесь в файлах, принадлежавших конкретному пользователю, настраиваете сценарий монтирования вместо этого.
Это добавляет программу для выполнения к списку устройства программ для выполнения. Это определяет устройства раздела USB <LABEL>
, затем передают эта информация сценарию, который выполняет монтирование. А именно, это правило соответствует:
ENV{ID_FS_LABEL_ENC}=="?*"
- переменная среды установлена более ранним системным правилом. Не существует для нефайловых систем, так вот почему мы проверяем на него. Мы на самом деле хотим использовать ID_FS_LABEL
для точки монтирования, но я не убедил UDEV выходить из него для меня, таким образом, мы позволим сценарию монтирования обработать это.
Это и другие переменные среды получены использованием udev vol_id
команда (удержана от использования). Это - удобный инструмент для наблюдения хороших быстрых деталей о разделе:
$ sudo vol_id /dev/sdc1
ID_FS_TYPE=ext2
ID_FS_UUID=a40d282a-4a24-4593-a0ab-6f2600f920dd
ID_FS_LABEL=Travel Dawgs
ID_FS_LABEL_ENC=Travel\x20Dawgs
ID_FS_LABEL_SAFE=Travel_Dawgs
ACTION=="add"
- только соответствие add
события...
SUBSYSTEMS=="usb"
- только соответствуйте устройствам, которые находятся на Шине USB. Мы используем SUBSYSTEMS
здесь, потому что это соответствует против родителей нашего устройства; устройством, которым мы интересуемся, на самом деле будет ПОДСИСТЕМА == "scsi". Соответствие против родительского USB-устройства старается не добавлять нашу программу к внутренним дискам.
RUN+="..."
- не соответствие, а действие: добавьте эту программу к списку программ для выполнения. В аргументах программы, %k
расширен до имени устройства (например, sdc1
, нет /dev/sdc1
) и $env{FOO}
получает содержание НЕЧТО переменной среды.
Первая ссылка (выше) является превосходным учебным руководством UDEV, но это немного устарело. Программы это работает за тестированием Ваших правил (udevtest
в особенности), были заменены вместилищем udevadm
утилита.
После добавления правила включите устройство. Дайте ему несколько секунд, затем проверьте для наблюдения, с каким устройством этому присвоили:
$ ls -l /dev/disk/by-label/*
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Foo -> ../../sda1
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Bar -> ../../sdb1
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Baz -> ../../sdc1
Если Ваш диск removeable содержит label_Baz
, это находится на устройстве sdc1
. Выполните это и посмотрите на вывод к концу:
$ sudo udevadm test /sys/block/sdc/sdc1
parse_file: reading (...) (many lines about files it reads)
import_uevent_var: import into environment: (...) (many lines about env variables)
(...) (many lines tracing rule matches & programs run)
update_link: found 1 devices with name 'disk/by-label/LABEL_BAZ'
update_link: found '/block/sdc/sdc1' for 'disk/by-label/LABEL_BAZ'
update_link: compare (our own) priority of '/block/sdc/sdc1' 0 >= 0
update_link: 'disk/by-label/LABEL_BAZ' with target 'sdc1' has the highest priority 0, create it
udevtest: run: '/usr/local/sbin/udev-automounter.sh sdc1 LABEL_BAZ'
udevtest: run: 'socket:/org/freedesktop/hal/udev_event'
udevtest: run: 'socket:@/org/kernel/udev/monitor'
Ищите название сценария от нашего RUN+=
правило в последних нескольких строках (3-й от нижней части в этом примере). Вы видите аргументы, которые использовались бы для этого устройства. Можно выполнить ту команду теперь, чтобы проверить, что аргументы являются звуковыми; если это работает над Вашей командной строкой, это должно работать автоматически, когда устройство вставляется.
Можно также следить за развитием событий UDEV в в реальном времени: выполненный sudo udevadm monitor
(см. man udevadm
для получения дополнительной информации о переключателях). Затем просто включите новую прокрутку событий устройства и часов. (Вероятно, излишество, если Вы не в детали действительно низкого уровня...),
После того как Вы проверили, что правило становится прочитанным правильно, необходимо сказать UDEV перезагружать его правила, таким образом, новый вступает в силу. Используйте любой из этих методов (если первое не работает, второе должно..., но попробовать первое первое):
выполненный sudo udevadm control --reload-rules
выполненный sudo /etc/init.d/udev reload
перезагрузка
Вот первый сценарий. Начиная с программы мы выполняем потребности завершиться быстро, это просто кружит второй сценарий в фоновом режиме. Вставьте это /usr/local/sbin/udev-automounter.sh
:
#!/bin/sh
#
# USAGE: usb-automounter.sh DEVICE
# DEVICE is the actual device node at /dev/DEVICE
/usr/local/sbin/udev-auto-mount.sh ${1} &
Вот второй сценарий. Это действительно немного больше вводит проверку. Вставьте это /usr/local/sbin/udev-auto-mount.sh
. Можно хотеть настроить опции монтирования ниже. Этот сценарий теперь обрабатывает нахождение МАРКИРОВКИ раздела самостоятельно; UDEV только отправляет ИМЯ УСТРОЙСТВА.
Если существует проблема, монтирующая диски во время начальной загрузки, можно помещать хорошее долго sleep 60
в этом сценарии для предоставления системного времени для прибытия полностью, прежде чем сценарий пытается смонтировать диск.
Я дал предложение в комментариях для того, как проверить (выполненный ps
видеть, работает ли веб-сервер), но Вы захотите настроить это для своей системы. Я думаю большинство любых сетевых серверов, которые Вы могли бы использовать, будет достаточен с этой целью - nfsd, smbd, апач, и т.д. Риск, конечно, состоит в том, что сценарий монтирования перестанет работать, если услуга не будет работать, поэтому возможно, тестирование существования конкретного файла было бы лучшим решением.
#!/bin/sh
#
# USAGE: udev-auto-mount.sh DEVICE
# DEVICE is the actual device node at /dev/DEVICE
#
# This script takes a device name, looks up the partition label and
# type, creates /media/LABEL and mounts the partition. Mount options
# are hard-coded below.
DEVICE=$1
# check input
if [ -z "$DEVICE" ]; then
exit 1
fi
# test that this device isn't already mounted
device_is_mounted=`grep ${DEVICE} /etc/mtab`
if [ -n "$device_is_mounted" ]; then
echo "error: seems /dev/${DEVICE} is already mounted"
exit 1
fi
# If there's a problem at boot-time, this is where we'd put
# some test to check that we're booting, and then run
# sleep 60
# so the system is ready for the mount below.
#
# An example to experiment with:
# Assume the system is "booted enough" if the HTTPD server is running.
# If it isn't, sleep for half a minute before checking again.
#
# The risk: if the server fails for some reason, this mount script
# will just keep waiting for it to show up. A better solution would
# be to check for some file that exists after the boot process is complete.
#
# HTTPD_UP=`ps -ax | grep httpd | grep -v grep`
# while [ -z "$HTTPD_UP" ]; do
# sleep 30
# HTTPD_UP=`ps -ax | grep httpd | grep -v grep`
# done
# pull in useful variables from vol_id, quote everything Just In Case
eval `/sbin/vol_id /dev/${DEVICE} | sed 's/^/export /; s/=/="/; s/$/"/'`
if [ -z "$ID_FS_LABEL" ] || [ -z "$ID_FS_TYPE" ]; then
echo "error: ID_FS_LABEL is empty! did vol_id break? tried /dev/${DEVICE}"
exit 1
fi
# test mountpoint - it shouldn't exist
if [ ! -e "/media/${ID_FS_LABEL}" ]; then
# make the mountpoint
mkdir "/media/${ID_FS_LABEL}"
# mount the device
#
# If expecting thumbdrives, you probably want
# mount -t auto -o sync,noatime [...]
#
# If drive is VFAT/NFTS, this mounts the filesystem such that all files
# are owned by a std user instead of by root. Change to your user's UID
# (listed in /etc/passwd). You may also want "gid=1000" and/or "umask=022", eg:
# mount -t auto -o uid=1000,gid=1000 [...]
#
#
case "$ID_FS_TYPE" in
vfat) mount -t vfat -o sync,noatime,uid=1000 /dev/${DEVICE} "/media/${ID_FS_LABEL}"
;;
# I like the locale setting for ntfs
ntfs) mount -t auto -o sync,noatime,uid=1000,locale=en_US.UTF-8 /dev/${DEVICE} "/media/${ID_FS_LABEL}"
;;
# ext2/3/4 don't like uid option
ext*) mount -t auto -o sync,noatime /dev/${DEVICE} "/media/${ID_FS_LABEL}"
;;
esac
# all done here, return successful
exit 0
fi
exit 1
Еще один сценарий. Все это делает размонтировать устройство и удалить каталоги точки монтирования. Это предполагает, что имеет privs, чтобы сделать это, таким образом, необходимо будет выполнить его с sudo
. Этот сценарий теперь берет полную точку монтирования на командной строке, например:
$ /usr/local/sbin/udev-unmounter.sh "/media/My Random Disk"
Вставьте это /usr/local/sbin/udev-unmounter.sh
:
#!/bin/sh
#
# USAGE: udev-unmounter.sh MOUNTPT
# MOUNTPT is a mountpoint we want to unmount and delete.
MOUNTPT="$1"
if [ -z "$MOUNTPT" ]; then
exit 1
fi
# test mountpoint - it should exist
if [ -e "${MOUNTPT}" ]; then
# very naive; just run and pray
umount -l "${MOUNTPT}" && rmdir "${MOUNTPT}" && exit 0
echo "error: ${MOUNTPT} failed to unmount."
exit 1
fi
echo "error: ${MOUNTPT} does not exist"
exit 1
Можно попытаться поместить su username -c gnome-volume-manager
в/etc/rc.local. Могло бы быть достаточно просто иметь выполнение менеджера томов гнома.
Править: Кажется, что менеджер томов гнома больше не является частью распределения по умолчанию, даже на рабочем столе Ubuntu.
wajig policy gnome-volume-manager
gnome-volume-manager:
Installed: (none)
Candidate: 2.24.0-0ubuntu1
Version table:
2.24.0-0ubuntu1 0
500 http://ubuntu.secs.oakland.edu jaunty/universe Packages
Однако, возможно, при установке его это будет все еще работать. Это стоит попытки. Если это не работает, удалите его снова.
Существует также usbmount
пакет, который делает то, что Вы хотите, но мог бы возможно вмешаться в нормальное автомонтирование.
Одна заключительная опция, которую другие предложили по всей сети, ivman
, но это, кажется, зависит от pmount
, то, которое Вы уже заявили, не работает. pmount
отказывается и ivman
почти то же.
Замена для ivman
halevt
, и это доступно в Кармическом. Это - переопределение ivman
(читайте: "сохраняемый" и "не зависит от pmount"). Пакет не доступен на Бойком, хотя Вы можете создавать его сами, если Вы не планируете обновить.
Оба из этих инструментов находятся выше уровней DBus и HAL и отвечают на события от них. По-видимому, оба могут работать или как системный демон или поскольку сеанс пользователя монтирует менеджер (а-ля Gnome-VFS) - /etc/defaults/{ivman,halevt}
файлы отвечают за параметры настройки системы.
Вот некоторые инструкции для тонкой настройки ivman
использовать /media/<LABEL>
точки монтирования. Это вероятно это halevt
имеет более простой способ сделать это, но возможно они помогут Вам найти ответ.
Обновление: В интересах получения автоволшебного CD монтируется также, который не обеспечивает мой ответ UDEV, я выглядел глубже на halevt
. Я нашел это сообщение в блоге, которое помогло объяснить много о процессе. Я действительно должен был скомпилировать свое собственное halevt
пакет для Debian Lenny (к счастью, все зависимости были в разделе lenny-бэкпортов). После того, как установленный, процесс был главным образом не - ужасен:
/etc/default/halevt
/etc/PolicyKit/PolicyKit.conf
(см. ниже; источник)/etc/hal/fdi/policy/preferences.fdi
(см. ниже),eject.hal
сценарий от вышеупомянутого сообщения в блоге, измените и сохраните в /usr/local/bin
./etc/halevt/halevt.xml
Если необходимо перезапустить HAL и демонов HALEVT для проверки новых конфигураций, используйте это для получения их в правильном порядке:
sudo sh -c "/etc/init.d/halevt stop ; /etc/init.d/hal restart ; /etc/init.d/halevt start"
Проверьте это START_DAEMON=yes
в /etc/default/halevt
.
В /etc/PolicyKit/PolicyKit.conf
, добавьте эту внутреннюю часть <config></config>
раздел:
<match action="org.freedesktop.hal.storage.mount-removable">
<match user="halevt">
<return result="yes"/>
</match>
</match>
В /etc/hal/fdi/policy/preferences.fdi
, добавьте эту внутреннюю часть 'раздел:
<match key="volume.label" empty="false">
<match key="volume.label" is_absolute_path="false">
<merge key="volume.policy.desired_mount_point" type="copy_property">volume.label</merge>
</match>
</match>
Сценарий хорош, но должен работать /bin/bash
; некоторые системы могут на самом деле использовать /bin/dash
когда /bin/sh
назван. Так измените верхнюю строку в сценарии, чтобы удостовериться, что Вы получаете правильный:
#!/bin/sh <------ old first line
#!/bin/bash <------ new first line
Это - забавная часть. Ваша система может обеспечить основное /etc/halevt/halevt.xml
уже, таким образом, необходимо будет адаптировать это для собственного использования. В моем случае моя система уже обеспечила основное монтирование removeables, но я должен был добавить поддержку монтирования CD-ROM и кнопки выброса.
Сообщение в блоге, которое я упомянул, имеет хорошую конфигурацию XML в качестве примера для взгляда на для собственных тонких настроек. Это главным образом об установке замены монтирования гном для автора fluxbox
среда, таким образом, его пример XML делает больше, чем, Вы захотите, но это - отличный способ получить ощущение того, что можно сделать. Существуют также некоторые хорошие примеры в /usr/share/doc/halevt/examples
.
Я также должен был работать sudo sh -c "mkdir /var/halevt ; chown halevt:plugdev /var/halevt"
прежде чем все работало бы.
Вот мои дополнения, чтобы заставить автомонтирующийся CD/DVD работать:
<!-- CD/DVD mount -->
<halevt:Device match="hal.block.device & hal.block.is_volume = true & hal.volume.is_disc = true & hal.volume.disc.has_data = true">
<halevt:Property name="hal.volume.is_mounted">
<halevt:Action value="true" exec="halevt-mount -u $hal.udi$ -p $hal.volume.policy.desired_mount_point$ -m 002"/>
</halevt:Property>
</halevt:Device>
<!-- CD/DVD eject button support -->
<halevt:Device match="hal.storage.drive_type = cdrom">
<halevt:Condition name="EjectPressed" exec='/usr/local/bin/eject.hal $hal.block.device$'/>
</halevt:Device>
После того как Вы получили системного halevt-демона, работающего, необходимо будет отключить его, когда Вы войдете в GNOME и перезапускаете его снова, когда Вы выходите из системы. (См., что мой ответ на этот вопрос для non-GDM входит в менеджеров.) Этот материал является теоретическим, так как я не использую его, но он должен работать.
В /etc/gdm/PreSession/Default
, добавьте это для остановки системного halevt-демона:
/etc/init.d/halevt stop
В /etc/gdm/PostSession/Default
, добавьте это для перезапуска системного halevt-демона:
/etc/init.d/halevt start
Если Вам только смонтировали один диск за один раз, можно просто отредактировать это в Ваш /etc/fstab
файл. Что-то вроде:
/dev/sdb1 /mnt/usbdrive ext3 defaults 0 0
Это должно смонтировать его при начальной загрузке и сделать его доступным для любого с перманентом. Если у Вас есть больше чем один диск, можно все еще сделать это с:
/dev/sdb1 /mnt/usbdrive1 ext3 defaults 0 0
/dev/sdc1 /mnt/usbdrive2 ext3 defaults 0 0
ответ quixote's шарлатана не работает над Ubuntu Ясный Lynx (10.04) - существует нет /sbin/vol_id
команда.
Вместо того, чтобы быть необычным и использовать udev, помещенный это в Ваш/etc/rc.local и быть сделанным:
for dev in $(ls -1 /dev/disk/by-label/* | grep -v EFI) ; do
label=$(basename $dev)
mkdir -p /media/$label
$(mount | grep -q /media/$label) || mount $dev /media/$label
done
Спугивать превосходные инструкции quixote шарлатана для удаления:
Добавьте следующую строку к файлу правила udev, который Вы сделали ранее (/etc/udev/rules.d)"
ENV{ID_FS_LABEL_ENC}=="?*", ACTION=="remove", SUBSYSTEMS=="usb", \
RUN+="/usr/local/sbin/udev-autounmounter.sh %k"
Затем создайте следующий сценарий и chmod это исполняемый файл (/usr/local/sbin/udev-autounmounter.sh) со следующим содержанием:
#!/bin/sh
#
# USAGE: usb-autounmounter.sh DEVICE
# DEVICE is the actual device node at /dev/DEVICE
/usr/local/sbin/udev-auto-unmount.sh ${1} &
Наконец сам сценарий размонтирования (udev-auto-unmount.sh):
#!/bin/sh
#
# USAGE: udev-auto-unmount.sh DEVICE
# DEVICE is the actual device node at /dev/DEVICE
#
# This script takes a device name, looks up the partition label and
# type, creates /media/LABEL and mounts the partition. Mount options
# are hard-coded below.
DEVICE=$1
# check input
if [ -z "$DEVICE" ]; then
exit 1
fi
#test that the device is already mounted
MOUNTPT=`mount | grep ${DEVICE} | cut -d ' ' -f 3`
if [ -z "${MOUNTPT}" ]; then
echo "error: the device is not already mounted"
exit 1
fi
# test mountpoint - it should exist
if [ -e "${MOUNTPT}" ]; then
# very naive; just run and pray
umount -l "${MOUNTPT}" && rmdir "${MOUNTPT}" && exit 0
echo "error: ${MOUNTPT} failed to unmount."
exit 1
fi
echo "error: ${MOUNTPT} does not exist"
exit 1
Таким образом с другими инструкциями, каталог будет автоматический появляться и исчезать на udev событиях.