Re: опции монтирования для произвольной флешки
On Wed, 26 Mar 2014, Artem Chuprina wrote:
Хочется аналогичной по функциональности схемы, но способной справиться с
файловой системой, расположенной не только на sd?1, но и на sd? (тут,
впрочем, я, похоже, понял, что делать), и позволяющее ходить к
соответствующей файловой системе по пути, не зависящему от ее типа, но с
нужными опциями монтирования. Краевое условие: с компьютером я общаюсь
словами, и интересующий компьютер может быть не только ноутбуком, за
которым я сейчас сижу, но и безмониторным сервером на антресолях, на
который я зашел по ssh. Поэтому гуевые варианты отпадают.
Можете что-нибудь посоветовать?
У меня udev + autofs настроены. На самом деле решение
притырено у Stanislav Maslovski, но раз он не пишет,
расскажу как у меня работает.
в /etc/udev/rules.d/95-local.rules
---------------------------------------------------------------------
# automount
SUBSYSTEM=="block", \
ACTION=="add|remove", \
ENV{DEVTYPE}=="partition|disk", \
ENV{ID_BUS}=="usb|scsi", \
ENV{ID_FS_USAGE}=="filesystem", \
RUN+="/usr/local/sbin/autofs_udev"
в /usr/local/sbin/autofs_udev
---------------------------------------------------------------------
#!/bin/bash
echo " `date +%c`, ACTION= $ACTION" >> /tmp/autofs_udev.out
echo " DEVNAME= $DEVNAME, ID_BUS= $ID_BUS" >> /tmp/autofs_udev.out
echo " ID_FS_UUID_ENC= $ID_FS_UUID_ENC" >> /tmp/autofs_udev.out
if [ -z "${ID_FS_UUID_ENC}" ]; then
# try to use LABEL
echo " ID_FS_LABEL_ENC= ${ID_FS_LABEL_ENC}" >> /tmp/autofs_udev.out
if [ -n "${ID_FS_LABEL_ENC}" ]; then
printf -v ID_FS_UUID_ENC "${ID_FS_LABEL_ENC}"
else
exit
fi
fi
MEDIA_NAME=${ID_FS_UUID_ENC}
case ${ID_FS_UUID_ENC} in
B6A1-A66A)
MEDIA_NAME="Kingston"
;;
CAC1-3CDD)
MEDIA_NAME="JetFlash"
;;
46CA8751CA873C65)
MEDIA_NAME="SilverScreen"
;;
E6107A31107A08B7)
MEDIA_NAME="AGEStar"
;;
c0710ba1-19dd-4ef8-b7bb-e5e953102472)
MEDIA_NAME="ZalmanHE135"
;;
"Secure Tool")
ACTION="remove"
ID_FS_UUID_ENC=""
;;
esac
echo " MEDIA_NAME= $MEDIA_NAME" >> /tmp/autofs_udev.out
case ${ACTION} in
add)
ln -sfn "/mnt/autofs/udev/${ID_FS_UUID_ENC}" "/media/${MEDIA_NAME}"
;;
remove)
rm -f "/media/${MEDIA_NAME}"
;;
esac
echo " " >> /tmp/autofs_udev.out
---------------------------------------------------------------------
написано давно, но так и работает с отладочной печатью
т.к. udev имеет привычку менять формат вывода.
В /etc/auto.udev
---------------------------------------------------------------------
#!/bin/sh
# use autofs with UDEV for mounting USB removable media
# see /etc/udev/rules.d/95-local.rules
# based on script written by Stanislav.Maslovski@gmail.com
echo " `date +%c`, arg= $*" >> /tmp/auto_udev.out
echo " UID= $UID, GID= $GID" >> /tmp/auto_udev.out
# the name of mount point _must_ be UUID or LABEL of the device
name=$1
if [ -z "$name" ]; then
echo " name= $name is not the UUID or LABEL. Stop!"
exit
fi
device=`blkid -U $name`
if [ -z "$device" ]; then
# device=`blkid | grep -iv UUID | tail -1 | cut -d: -f1`
device=`blkid -L "$name"`
if [ -z "$device" ]; then
echo " name= $name is not the UUID or LABEL. Stop!"
exit
fi
fi
fstype=`blkid -p -u filesystem $device | \
sed -r 's|^.* TYPE="([^"]+)".*$|\1|'`
echo " name= $name, device= $device, fstype= $fstype" >> /tmp/auto_udev.out
# taken from /etc/fstab (keep noauto,user for compatibility)
case ${fstype} in
vfat)
fsopts="rw,noauto,user,async,noatime,noexec"
fsopts="${fsopts},uid=nefedov,gid=nefedov,dmask=022,fmask=133"
;;
ntfs) # ntfs-3g actually
fsopts="rw,noauto,user,async,silent,noatime,locale=ru_RU.UTF-8"
fsopts="${fsopts},uid=nefedov,gid=nefedov,dmask=022,fmask=133"
;;
ext2)
fsopts="rw,noauto,user,defaults,noatime,check=none"
;;
ext3)
fsopts="rw,noauto,user,defaults,noatime,check=none,data=journal"
;;
iso9660)
fsopts="ro,noauto,user"
;;
*)
fsopts="noauto,user"
esac
echo "-fstype=${fstype},${fsopts} :${device}"
echo " -fstype=${fstype},${fsopts} :${device} " >> /tmp/auto_udev.out
echo " " >> /tmp/auto_udev.out
---------------------------------------------------------------------
Несколько проверок как работает:
1) файловая система без всяких партиций:
> mkdosfs -I -F 32 -S 512 -n TEST /dev/sdb
Thu Mar 27 10:09:22 2014, ACTION= add
DEVNAME= /dev/sdb, ID_BUS= usb
ID_FS_UUID_ENC= 0286-EB96
MEDIA_NAME= 0286-EB96
> touch /media/0286-EB96/test.txt
> ls /media/0286-EB96/
test.txt
2) две партиции
> fdisk -lu /dev/sdb
Device Boot Start End Blocks Id System
/dev/sdb1 63 2000062 1004031 83 Linux
/dev/sdb2 2000063 3919859 955867 b FAT32
Thu Mar 27 10:33:20 2014, ACTION= add
DEVNAME= /dev/sdb1, ID_BUS= usb
ID_FS_UUID_ENC= 239b80a3-fbc6-466f-a0b6-10a040d42656
MEDIA_NAME= 239b80a3-fbc6-466f-a0b6-10a040d42656
Thu Mar 27 10:33:20 2014, ACTION= add
DEVNAME= /dev/sdb2, ID_BUS= usb
ID_FS_UUID_ENC= 5D45-8B58
MEDIA_NAME= 5D45-8B58
ls /media/239b80a3-fbc6-466f-a0b6-10a040d42656/
lost+found test.ext2
ls /media/5D45-8B58/
test.fat32
3) cat debian-7.0.0-amd64-netinst.iso > /dev/sdb
Thu Mar 27 10:40:34 2014, ACTION= add
DEVNAME= /dev/sdb, ID_BUS= usb
ID_FS_UUID_ENC=
ID_FS_LABEL_ENC= Debian\x207.0.0\x20amd64\x201
MEDIA_NAME= Debian 7.0.0 amd64 1
Thu Mar 27 10:40:35 2014, ACTION= add
DEVNAME= /dev/sdb2, ID_BUS= usb
ID_FS_UUID_ENC= EABC-7C44
MEDIA_NAME= EABC-7C44
Thu Mar 27 10:40:35 2014, ACTION= add
DEVNAME= /dev/sdb1, ID_BUS= usb
ID_FS_UUID_ENC=
ID_FS_LABEL_ENC= Debian\x207.0.0\x20amd64\x201
MEDIA_NAME= Debian 7.0.0 amd64 1
ls /media/EABC-7C44
efi
ls /media/Debian\ 7.0.0\ amd64\ 1
autorun.inf doc install pool README.txt
boot efi install.amd README.html setup.exe
css firmware isolinux README.mirrors.html tools
debian g2ldr md5sum.txt README.mirrors.txt win32-loader.ini
dists g2ldr.mbr pics README.source
---------------------------------------------------------------------
В общем работает как то.
Успехов.
Ю.
Reply to: