grep -r 'std::cout' . | grep -v '^[ \t]*//'
только опустит закомментированные строки и не все строки, которые имеют комментарий к ним.
Хорошо, это было долгое время, но я все еще отвечу на свой вопрос с наилучшим вариантом, который я нашел на данный момент. Подводить итог: создайте a udev
правило, связанное с некоторыми сценариями (который создаст/удалит каталоги и съемные устройства ООН/монтировать), и присоединенный к udev
тип события устройства =partition
.
1 - Создание добавляет / удаляют сценарии
Сохраните следующий сценарий storage-automount.sh
кому: /lib/udev/
и сделайте это исполняемым файлом (sudo chmod a+x /lib/udev/storage-automount.sh
):
#!/bin/sh
# set the mountpoint name according to partition or device name
mount_point=$ID_FS_LABEL
if [ -z $mount_point ]; then
mount_point=${DEVNAME##*/}
fi
# if a plugdev group exist, retrieve it's gid set & it as owner of mountpoint
plugdev_gid="$(grep plugdev /etc/group|cut -f3 -d:)"
if [ -z $plugdev_gid ]; then
gid=''
else
chown root:plugdev $mount_point
gid=",gid=$plugdev_gid"
fi
# create the mountpoint directory in /media/ (if not empty)
if [ -n $mount_point ]; then
mkdir -p /media/$mount_point
# other options (breaks POSIX): noatime,nodiratime,nosuid,nodev
mount -t $ID_FS_TYPE \
-o rw,flush,user,uid=0$gid,umask=002,dmask=002,fmask=002 \
$DEVNAME /media/$mount_point
fi
Сохраните следующий сценарий storage-autounmount.sh
кому: /lib/udev/
и сделайте это исполняемым файлом (sudo chmod a+x /lib/udev/storage-autounmount.sh
):
#!/bin/sh
# set the mountpoint name according to partition or device name
mount_point=$ID_FS_LABEL
if [ -z $mount_point ]; then
mount_point=${DEVNAME##*/}
fi
# remove the mountpoint directory from /media/ (if not empty)
if [ -n $mount_point ]; then
umount -l /media/$mount_point
rm -R /media/$mount_point
fi
2 - Создание udev
управляйте для присоединения тех сценариев к событиям
И наконец, добавьте a udev
правило в /etc/udev/rules.d/
, например, 85-storage-automount.rules
:
ENV{DEVTYPE}=="partition", RUN+="/lib/udev/storage-automount.sh", ENV{REMOVE_CMD}="/lib/udev/storage-autounmount.sh"
и заставьте его иметь те же полномочия как другие правила в том dir/папке
Теперь, когда Вы включаете устройство хранения, каталог будет создан в /media/
согласно имени раздела (я не помню, но я думаю, что оно работает с разделом NTFS также), и Ваш раздел будет смонтирован в него. Это - R/W для пользователей, если у Вас есть a plugdev
группа в Вашей системе. Кроме того, устройства смонтированы в синхронном режиме для ограничения рисков потери данных в случае горячего отключения.
Когда устройство удалено, оно размонтировано, и каталог удален из /media
Кроме того, инструмент для контроля udev
события udevadm monitor
, с опциями как --env
или --property
:
$ udevadm monitor --env
Это тестируется и хорошо работающий и на debian и на дуге, но, вероятно, работайте над всеми дистрибутивами, которые полагаются udev
.
Я думаю, что Вы ищете pmount
.
Если Вы хотите автоматическое монтирование на вставку, посмотрите Автомонтирующиеся карты с интерфейсом USB на Debian.
Если Ваша система использует udisks2, это - предпочтительный способ реагировать на вставку съемного устройства хранения. Посмотрите Дугу Wiki для подсказок по конфигурации для Udisks.
Иначе программа, которая реагирует, когда новое устройство появляется, является udev, таким образом, автоматическое монтирование инициировано правилом udev. usbmount пакет предоставляет правила udev автоматически смонтировать устройства хранения USB и немногих других. Вызов mount
от udev правила не работают на файловые системы FUSE (такие как ntfs-3g), так используйте udisks при необходимости в этом.
Вы не можете автоматически размонтировать медиа, когда они удалены, потому что причинная связь не прокладывает себе путь. Медиа должны быть размонтированы, прежде чем это будет удалено. Для медиа только для чтения можно сойти с рук размонтирование после удаления, хотя это могло бы перепутать некоторые приложения, если у них есть файлы, открытые во внезапно исчезнувшей файловой системе. Для перезаписываемых медиа при отключении смонтированной файловой системы повреждение данных вероятно.
flush
смонтируйте опцию, разработанную специально для vfat
избегает тех проблем: запись не выполняется после каждого блока, но как только устройство, кажется, неактивно. И флэш-память значительно увеличила свои тупиковые жизненные циклы также. Теперь, очевидно, пользователь должен знать для не отключения устройств, в то время как файлы открыты или во время копии (или вскоре после). Но это - хороший компромисс.
– cedbeu
06.08.2012, 19:58
/media/usb-*
, который не соответствует моим потребностям. Я хочу смочь смонтировать автоматически устройства в /media/<DEV_LABEL>
с flush
параметр, когда они обнаруживаются (если это возможно, с динамическим созданием каталога), и размонтировать их и удалить каталоги из /media/
автоматически, если они больше не обнаруживаются. Риск, который я беру на себя, мое дело. потрясающий
– cedbeu
06.08.2012, 20:03
usbmount
не поддерживайте NTFS с тех пор jessie
больше: bugs.debian.org/774149
– malat
19.05.2015, 18:31
Я нашел способ сделать это, отредактировав файл /etc/fstab. Простая запись выглядит так:
/dev/sdb1 /media/roboot/hdd1 ntfs по умолчанию 0 0
Вот как я недавно сделал это, и я вполне доволен этим подходом сейчас. Это для Ubuntu 12.04 + Gentoo, но я думаю, что любой дистрибутив, который позволяет работать UDEV и Autofs.
Предпосылки: Вы должны установить UDEV + Autofs.
Шаг 1)
Создайте следующие «/etc/udev/rules.d/90-usbd-auto.rules» (конечно, вы можете использовать любое имя, если он заканчивается «.Rules») Отказ :
# Add symlink /dev/usbdisks/<label> to /dev/sd[a-z][1-9]
# if partition has a label
# Add symlink /media/usb/<label> to /media/autousb/<label>
# for automounter support
ACTION=="add", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}=="?*", \
SYMLINK+="usbdisks/$env{ID_FS_LABEL_ENC}", MODE:="0660", \
RUN+="/bin/rm /media/usb/$env{ID_FS_LABEL_ENC}", \
RUN+="/bin/ln -sf /media/autousb/$env{ID_FS_LABEL_ENC} /media/usb/$env{ID_FS_LABEL_ENC}"
# Fallback: If partition has a NO label, use kernel name (sd[a-z][1-9])
ACTION=="add", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
SYMLINK+="usbdisks/%k", MODE:="0660", \
RUN+="/bin/rm /media/usb/%k", \
RUN+="/bin/ln -sf /media/autousb/%k /media/usb/%k"
# Some FileSystems emit a "change" event when they are unmounted.
# UDEV seems to delete the device symlink in this case :-(
# So we need to re-create it here
ACTION=="change", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}=="?*", \
SYMLINK+="usbdisks/$env{ID_FS_LABEL_ENC}", MODE:="0660"
# Fallback: If partition has NO label, use kernel name
ACTION=="change", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
SYMLINK+="usbdisks/%k", MODE:="0660"
# When device is removed, also remove /media/usb/<label>
ACTION=="remove", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}=="?*", \
RUN+="/bin/rm /media/usb/$env{ID_FS_LABEL_ENC}"
# Fallback: If partition has no label, remove /media/usb/%k
ACTION=="remove", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
RUN+="/bin/rm /media/usb/%k"
Что это делает: он создает две симлизы, один для раздела устройства хранения USB под «/ dev / usbdisks / <...>». Он либо будет использовать метку раздела USB хранения или имя ядра, если нет метки. Вторая SymLink будет связывать из «/ Media / USB / <...» / Media / Autousb / <...> «Это сделано для поддержки автоматров (см. Шаг 2).
Примечание. Первоначально я не использовал правила с переменными ID_FS_LABEL_ECC, поскольку это опасно на мой взгляд. Что произойдет, если вы подключите две USB-палочки, которые используют ту же ярлык?
, но плакат специально хотел использовать метку USB-диска, поэтому я изменял правила соответственно.
Чтобы убедиться, что UDEV читает эти правила Использовать
sudo udevadm control --reload-rules
с помощью этого файла правил UDEV, все настроен для автоматического раздела устройства хранения USB. Обратите внимание, что сейчас сейчас,Устройство не будет автоматически (намеренно). Он будет автоматически, как только вы используете его с помощью
Шаг 2)
Настройка Autofs для Automount / Media / Autousb / <...>: Я добавил следующую строку в файл «/etc/auto.master» (для Ubuntu 12.04):
/media/autousb /etc/auto.usb --timeout=60
Это означает, что autofs будет размонтировать устройство через 60 секунд бездействия. Возможно, вы захотите использовать меньше или больше, зависит от вашего вкуса.
Для Gentoo вам нужно изменить «/etc/autofs/auto.master», поэтому имеет смысл использовать
/media/autousb /etc/autofs/auto.usb --timeout=60
теперь я создал «auto.usb» со следующим контентом:
#!/bin/bash
key=${1}
fstype=$(/sbin/blkid -o value -s TYPE /dev/usbdisks/${key})
if [ "${fstype}" = "vfat" ] ; then
echo "-fstype=vfat,sync,uid=0,gid=plugdev,umask=007 :/dev/usbdisks/${key}"
exit 0
fi
if [ "${fstype}" = "ntfs" ] ; then
echo "-fstype=fuse.ntfs-3g,sync,uid=0,gid=plugdev,umask=007 :/dev/usbdisks/${key}"
exit 0
fi
if [ "${fstype}" = "ext4" ] ; then
echo "-fstype=ext4,sync,nocheck :/dev/usbdisks/${key}"
exit 0
fi
exit 1
Это AUTO.USB необходимо Быть исполняемым, чтобы автозапись использует это как (Bash) сценарий. Таким образом, например
sudo chmod 0755 /etc/auto.usb
Что это делает: этот скрипт будет сообщить AutoFS (/ usr / sbin / automount), как установить раздел устройства для хранения USB.
Скрипт будет первым использовать «/ sbin / Blkid», чтобы узнать, какую файловую систему находится на разделах.
Затем скрипт обеспечит правильные варианты монтажа в зависимости от раздела устройства.
Примечание. Я включенный пример код для «VFAT» (вероятно, наиболее распространенным для USB-палочек), файловых систем «NTFS» и «XFS». Конечно, довольно легко расширить это, чтобы поддержать больше файловых систем.
Шаг 3) По желанию... Чтобы «изгнать» == Размонтируйте вашу USB-накопитель (или разделы на вашей USB-палочке), создайте сценарий в соответствии с / sbin / Usbeject:
#!/bin/bash
killall -s SIGUSR1 /usr/sbin/automount
С помощью этого сценария вы можете использовать «sudo Usbeject», чтобы размонтировать все установленное устройство USB. разделы (рассказывая автоусчет, чтобы размонтировать их).
Конечно, вы можете просто убедиться, что раздел нигде не используется; Тогда Automounter будет размонтировать раздел после 60-секундной тайм-аута ...
Реальный трюк здесь - использовать SymLinks от «/ Media / USB» на «/ Media / Autousb»:
Я думаю, что уже довольно поздно, но я опубликую это, если кому-то это понадобится:(также мой первый ответ StackExchange)
Проверив решение во многих местах, я нашел простое решение в Arch Wiki:
Ссылка на Arch Wiki .
Мы можем добавить правило udisks2 для изменения каталога монтирования по умолчанию с /run/media/$USER/
на /media/<Label>
.
Добавьте следующее правило в /etc/udev/rules.d/
с именем вроде99-udisks2.rules
:
ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{UDISKS_FILESYSTEM_SHARED}="1"
Затем мы можем просто установить простой инструмент, такой как Udiskie для автоматического монтирования.
См. страницу ArchWiki Udev . Вы не должны выполнять mount
из правил Udev или из скриптов, которые выполняются по правилам Udev.
Однако, как показано в проекте udev -media -automount , это довольно просто сделать, вызвав модуль Systemd из правила Udev, который затем вызывает скрипт, выполняющий монтаж. В отличие от udisks2 и других решений, udev -media -automount предназначен для простого случая, когда вы хотите смонтировать что-то от имени пользователя root
, не обязательно дожидаясь среды рабочего стола или «сеанса пользователя». Кажется, это именно то, о чем просит ОП, и я нашел его функциональным и простым для понимания.
udev
? – TomRoche 13.07.2015, 02:54