USB storage devices (Русский)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Состояние перевода: На этой странице представлен перевод статьи USB storage devices. Дата последней синхронизации: 1 октября 2012. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

В этом документе описываются способы использования различных USB накопителей в Linux. Это также касается и других устройств, таких как цифровые камеры или телефоны, которые распознаются как обычные USB накопители.

Монтирование USB устройств

Если у вас свежая система со стандартным ядром Arch и современная среда рабочего стола, USB устройство должно автоматически появляться на рабочем столе при подключении, и лезть в консоль не потребуется.

Если этого не произошло см. далее.

Автоматическое монтирование с помощью udev

См. Udev:Монтирование съёмных устройств. Простой способ настройки автомонтирования жестких дисков для однопользовательских систем с использованием udev заключается в следующем: создается файл /etc/udev/rules.d/automount.rules со следующим содержимым:

ACTION=="add", ENV{DEVTYPE}=="partition", RUN+="domount %N"

и исполняемый от root файл /usr/lib/udev/domount со следующим содержимым (необходимо вставить корректные для Вашей системы значения):

#!/bin/sh

#edit the following variables to suit your needs
MYUID=1000              # your user uid
MYGID=100               # your user gid
MYLOGIN=al              # your login
TERM=lxterminal         # your terminal emulator
MYSHELL=zsh             # your shell
export DISPLAY=:0       # your X display

TMPFILE=/run/automount.$RANDOM
DIR=`cat /etc/fstab | grep -v '#' | grep $* | awk '{print $2;}'`
if [ "x$DIR" = "x" ]; then
        MYUUID=`blkid -o value -s UUID $*`
        if [ "x$MYUUID" = "x" ]; then
                MYUUID="unknown"
        fi
        DIR=/run/media/$MYUUID
fi
mkdir -p /run/media
mkdir -p $DIR
cat > $TMPFILE << EOF
#!/bin/sh
echo "$* will be mounted on $DIR. "
sudo /bin/mount -o uid=$MYUID,gid=$MYGID $* $DIR
cd $DIR
$MYSHELL
cd
sudo /bin/umount $DIR
EOF
chmod a+x $TMPFILE
su $MYLOGIN -c "$TERM -t 'Terminal - $* mounted on $DIR' -e $TMPFILE"
sleep 1; rm -f $TMPFILE

При подключении USB-диска происходит автомонтирование и открывается окно терминала. Чтобы размонтировать устройства, просто нажмите Ctrl + D в окне терминала. Место монтирования определяется в /etc/fstab или, при его отсутствии, создается на основе UUID раздела.

Чтобы ваш пароль не запрашивался при команде размонтирования, добавьте (заменить на ваше имя пользователя) имя_пользователя в /etc/sudoers с помощью команды visudo. См. Sudo (Русский)

имя_пользователя	ALL=(ALL) NOPASSWD: /bin/umount

Если терминал не появляется проверьте команду его запуска. Например, в xfce4, используется команда "Terminal -T <title> -e <script-file> .

Автомонтирование с использованием systemd

Предыдущий способ плох тем что выключает скрипт через 3 минуты, и окно с консолью завершится в любом случае. Поэтому создаем новый файл /etc/systemd/flash-mount@.service и пишем туда:

[Unit]
Description=Автомонтирование съемных устройств

[Service]
Type=oneshot
ExecStart=/usr/lib/udev/domount %I

[Install]
WantedBy=multi-user.target

Теперь отредактируем файл /etc/udev/rules.d/automount.rules:

ACTION=="add", ENV{DEVTYPE}=="partition", DRIVERS=="usb-storage", ENV{SYSTEMD_WANTS}="flash-mount@%N.service"

Теперь скрипт /usr/lib/udev/domount, вот улучшенная версия скрипта которая поддерживает русские символы:

#!/bin/sh

MYUID=1000              # Ваш uid
MYGID=100               # группа users
MYLOGIN=user            # ваш логин
TERM=xterm         	# ваш эмулятор терминала
MYSHELL=bash            # ваш шелл
export DISPLAY=:0       # Ваш X дисплей

TMPFILE=/run/automount.$RANDOM
DIR=`cat /etc/fstab | grep -v '#' | grep $* | awk '{print $2;}'`
if [ "x$DIR" = "x" ]; then
        MYUUID=`blkid -o value -s UUID $*`
        if [ "x$MYUUID" = "x" ]; then
                MYUUID="unknown"
        fi
        DIR=/run/media/$MYUUID
fi
mkdir -p /run/media
mkdir -p $DIR
cat > $TMPFILE << EOF
#!/bin/sh
echo "$* был примонтирован в $DIR. "
sudo /bin/mount -o iocharset=utf8,uid=$MYUID,gid=$MYGID $* $DIR
cd $DIR
$MYSHELL
sudo /bin/umount -l $DIR
EOF

export LANG=ru_RU.UTF-8
export LC_CTYPE=ru_RU.UTF-8
export LC_NUMERIC=ru_RU.UTF-8
export LC_TIME=ru_RU.UTF-8
export LC_COLLATE=ru_RU.UTF-8
export LC_MONETARY=ru_RU.UTF-8
export LC_MESSAGES=ru_RU.UTF-8
export LC_PAPER=ru_RU.UTF-8
export LC_NAME=ru_RU.UTF-8
export LC_ADDRESS=ru_RU.UTF-8
export LC_TELEPHONE=ru_RU.UTF-8
export LC_MEASUREMENT=ru_RU.UTF-8
export LC_IDENTIFICATION=ru_RU.UTF-8
export LC_ALL=
chmod a+x $TMPFILE

su $MYLOGIN -c "$TERM -e $TMPFILE"
sleep 1
rm -f $TMPFILE
rmdir "$DIR"

Теперь применяем правила:

udevadm control --reload-rules && udevadm trigger

Монтируем флешку и проверяем!

Монтирование вручную

Примечание: Перед тем, как обвинить Arch Linux в том, что он не монтирует USB устройства, стоит проверить все доступные порты. Часть разъёмов могут не обслуживаться контроллером (или не подключены к контроллеру вообще, в случае портов на передней панели), и устройства физически не смогут монтироваться. Теоретически контроллер портов может оказаться выключенным; для того, чтобы это проверить, нужно зайти в BIOS и отыскать параметр с названием вроде "Onboard USB Controller" — должен быть "Enabled".

Где взять ядро, поддерживающее usb_storage

Если не используется самодельное (самосборное) ядро, то можно скачать одно из готовых, все имеющиеся ядра Arch Linux настроены должным образом. В случае самосборного ядра, следует убедиться, что при компиляции была включена поддержка SCSI, SCSI-Disk и usb_storage. Если установлена последняя версия udev, то можно просто подключить носитель, и система автоматически подгрузит все необходимые модули ядра. Более ранним версиям udev дополнительно потребуется наличие HotPlug. Либо то же самое можно сделать вручную:

# modprobe usb-storage
# modprobe sd_mod      (только для ядер без SCSI)

Опознавание устройств

Самое первое, что нужно знать об устройстве, так это его идентификатор, присвоенный ядром.

Использование системных имен (node names) ( /sd* )

Это наиболее простой способ, но присвоение имен зависит от порядка, в котором устройства были подключены. способы получения системных имён (именований по шине):

  • поиск среди результатов вывода команды dmesg системного имени устройства, для удобства можно использовать в сочетании с grep:
# dmesg | egrep "sd[a-z]"
  • выполнением команды:
# fdisk -l

которая отобразит все доступные таблицы разделов.

Примечание: Если среди результатов нет устройства, то можно использовать команду lsusb, чтобы убедиться, что оно действительно было опознано системой.
Использование UUID

Для каждого устройства существует UUID (Universally Unique Identifier — уникальный идентификатор как один из методов постоянных именований устройств), эти идентификаторы предназначены для отслеживания устройств в независимости от их системных имен, а значит расположения на шине и порядка обнаружения (например /dev/sda).

Чтобы узнать все UUIDы, известные системе, нужно выполнить:

# blkid -o list -c /dev/null
device         fs_type  label     mount point        UUID
------------------------------------------------------------------------------------------
/dev/sda1      ext2               /boot              7f4cef7e-7ee2-489a-b759-d52ba23b692c
/dev/sda2      swap               (not mounted)      a807fff3-e89f-46d0-ab17-9b7ad3efa7b5
/dev/sda3      ext4               /                  81917291-fd1a-4ffe-b95f-61c05cfba76f
/dev/sda4      ext4               /home              c4c23598-19fb-4562-892b-6fb18a09c7d3
/dev/sdb1      ext4     X2        /mnt/X1            4bf265f7-da17-4575-8758-acd40885617b
/dev/sdc1      ext4     X1        /mnt/X2            4bf265f7-da17-4575-8758-acd40885617b
/dev/sdd1      ext4     Y2        /mnt/Y2            8a976a06-3e56-476f-b73a-ea3cad41d915
/dev/sde1      ext4     Z2        /mnt/Z2            9d35eaae-983f-4eba-abc9-434ecd4da09c
/dev/sdf1      ext4     Y1        /mnt/Y1            e2ec37a9-0689-46a8-a07b-0609ce2b7ea2
/dev/sdg1      ext4     Z1        /mnt/Z1            9fa239c1-720f-42e0-8aed-39cf53a743ed
/dev/sdj1      ext4     RAPT      (not mounted)      a9ed7ecb-96ce-40fe-92fa-e07a532ed157
/dev/sdj2      swap               <swap>             20826c74-eb6d-46f8-84d8-69b933a4bf3f

Здесь можно видеть целый список дисков, видимых системой, и длинные строчки с символами. Так вот эти строчки и есть те самые uuidы.

  • Теперь нужно подключить USB устройство и подождать несколько секунд . . .
  • Заново выполнить blkid -o list -c /dev/null

Появилось новое устройство и UUID? Это и есть USB накопитель

Совет: Если blkid не работает так, как ожидалось (или не работает вообще), то можно заглянуть в поисках UUIDов в /dev/disk/by-uuid/:
$ ls -lF /dev/disk/by-uuid/

Монтирование USB флэш-памяти

Для этого нужно создать папку, в которую в дальнейшем будет монтироваться флэшка:

# mkdir /mnt/usbstick
От имени суперпользователя (root)

Монтировать устройство рутом при помощи команды (только нужно заменить device_node найденным устройством, как было показано выше):

# mount device_node /mnt/usbstick

или

# mount -U UUID /mnt/usbstick

Если mount не распознаёт формат устройства (файловой системы), то можно попробовать с ключом -t <тип файловой системы>, а также глянуть в mount(8) для просвещения.

Примечание: Если же вообще ничего не помогло, то, возможно, нужно чинить флэшку, см. Format a device. Но перед этим имеет смысл попробовать на другом компьютере или операционной системе.
От имени обычного пользователя при помощи mount

Чтобы непривилегированные пользователи могли записывать данные на USB носитель, нужно прописать следующую команду:

$ sudo mount -o gid=users,fmask=113,dmask=002 /dev/sda1 /mnt/usbstick
От имени обычного пользователя посредством fstab

Для того, чтобы простой поьзователь мог спокойно монтировать USB-накопитель через fstab, нужно добавить следующую строку в файл /etc/fstab:

/dev/sda1 /mnt/usbstick vfat user,noauto,noatime,flush 0 0

или, что ещё лучше:

UUID=E8F1-5438 /mnt/usbstick vfat user,noauto,noatime,flush 0 0

(см. описание для user и других параметров в статье main article)

Примечание: Здесь /dev/sda1 должно быть заменено на имя флэшки (если оно не /dev/sda1, конечно). Если непонятно, см. Монтирование USB флэш-памяти.

Все, теперь любой пользователь может монтировать флэшку при помощи:

$ mount /mnt/usbstick

И отмонтировать, используя:

$ umount /mnt/usbstick
Примечание: Извлекать флэшку, не выполнив размонтирование, опасно.