Вопрос или проблема
Я пытаюсь смонтировать устройство CIFS после загрузки системы (используя systemd
), но система пытается смонтировать файловую систему до того, как сеть будет установлена, и поэтому это завершается неудачей.
После входа в систему я могу смонтировать его без каких-либо проблем, используя sudo mount -a
.
Как мне сказать моему Arch (arm), чтобы он ждал, пока сеть станет доступной?
Добавление _netdev
в параметры монтирования в /etc/fstab
может быть достаточным.
Юниты монтирования, относящиеся к локальным и сетевым файловым системам, различаются по их спецификации типа файловой системы. В некоторых случаях этого недостаточно (например, для монтирования на основе сетевых блочных устройств, таких как iSCSI), в этом случае
_netdev
может быть добавлен к строке параметров монтирования юнита, что заставляетsystemd
рассматривать юнит монтирования как сетевой монтируемый ресурс.
Кроме того, systemd
поддерживает явные зависимости порядка между записями монтирования и другими юнитами: добавление x-systemd.after=network-online.target
к параметрам монтирования может сработать, если _netdev
недостаточно.
См. документацию юнита монтирования systemd для получения подробной информации.
Добавьте _netdev
к записям в /etc/fstab
, о которых идет речь. Из страниц справки для `mount(8)’:
_netdev
Файловая система находится на устройстве, которое требует сетевого
доступа (используется для предотвращения попыток системы по монтированию
этих файловых систем до того, как сеть будет включена на
системе).
Вместо того, чтобы бороться с предположениями systemd
и устаревшими параметрами, которые могут работать или не работать, создайте свою службу и сделайте так, чтобы ваша цель монтирования зависела от нее.
Мои SMB-ресурсы смонтированы с 192.168.1.2, измените на то, что верно в вашем случае.
# /etc/systemd/system/wait-for-ping.service
[Unit]
Description=Блокирует до тех пор, пока успешно не выполнит пинг 192.168.1.2
After=network-online.target
[Service]
ExecStartPre=/usr/bin/bash -c "while ! ping -c1 192.168.1.2; do sleep 1; done"
ExecStart=/usr/bin/bash -c "echo готово к работе"
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Включите эту службу с помощью:
sudo systemctl daemon-reload
sudo systemctl enable --now wait-for-ping.service
Затем отредактируйте ваш fstab следующим образом, чтобы включить это в качестве последнего параметра монтирования:
x-systemd.after=wait-for-ping.service
Сделайте еще один systemctl daemon-reload
, и вы сможете проверить, что ваша цель монтирования имеет установленный правильный параметр. Моя цель монтирования – /mnt/media
, что создает mnt-media.mount
, поэтому выполните:
systemctl cat mnt-media.mount
Это должно иметь заголовок, подобный этому:
# Автоматически сгенерировано генератором fstab systemd
[Unit]
Documentation=man:fstab(5) man:systemd-fstab-generator(8)
SourcePath=/etc/fstab
After=wait-for-ping.service
# ... остальная часть файла продолжается ...
Перезагрузите вашу машину, и вы должны увидеть, что ваши монтирования ожидают, пока пинг не пройдет успешно.
Это немного коряво, но все параметры _netdev и x-systemd не помогли, так как WINS/DNS все еще не работал.
Я решил эту проблему с помощью записи в корневом crontab:
@reboot /usr/bin/mount -a
Это выполняется поздно в процессе загрузки.
Таким образом, даже если systemd
не смонтировал CIFS монтирование, определенное в fstab, позже mount -a
выполняется снова, и в этот раз монтирование успешно.
Использование только x-systemd.after=network-online.target
, как предложено в принятом ответе, не сработало для меня, но следующая комбинация параметров сработала:
x-systemd.automount,x-systemd.mount-timeout=30,_netdev,x-systemd.after=network-online.target
Ответ или решение
Для решения проблемы с монтированием CIFS-устройств при загрузке системы на Arch (arm), необходимо гарантировать, что сеть будет доступна перед тем, как произойдет попытка монтирования. Давайте рассмотрим несколько подходов, которые могут помочь вам добиться этого.
1. Использование параметров в /etc/fstab
Добавление параметра _netdev
в вашу запись /etc/fstab
— это первый шаг для обозначения того, что файловая система требует сетевого доступа. Это известно как механизм, который предотвращает попытки смонтировать файловые системы до того, как сеть будет активирована. Пример записи в файле /etc/fstab
может выглядеть так:
//192.168.1.2/sharename /mnt/media cifs credentials=/etc/sambapass,uid=1000,gid=1000,_netdev 0 0
2. Зависимости systemd
Если добавление _netdev
недостаточно, можно явно установить зависимости между монтированием и состоянием сети с помощью параметра x-systemd.after=network-online.target
. Это гарантирует, что монтирование будет выполнено только после того, как сеть будет доступна. Ваша запись в /etc/fstab
может выглядеть так:
//192.168.1.2/sharename /mnt/media cifs credentials=/etc/sambapass,uid=1000,gid=1000,_netdev,x-systemd.after=network-online.target 0 0
3. Создание пользовательского сервиса systemd
Для более надежного решения можно создать сервис systemd, который будет ожидать, пока сервер будет доступен. Пример создания такого сервиса:
-
Создайте новый файл сервиса:
sudo nano /etc/systemd/system/wait-for-ping.service
-
Вставьте следующий код:
[Unit] Description=Blocks until it successfully pings 192.168.1.2 After=network-online.target [Service] ExecStartPre=/usr/bin/bash -c "while ! ping -c1 192.168.1.2; do sleep 1; done" ExecStart=/usr/bin/bash -c "echo good to go" RemainAfterExit=yes [Install] WantedBy=multi-user.target
-
Включите и запустите сервис:
sudo systemctl daemon-reload sudo systemctl enable --now wait-for-ping.service
-
Добавьте указание на созданный сервис в файл
/etc/fstab
://192.168.1.2/sharename /mnt/media cifs credentials=/etc/sambapass,uid=1000,gid=1000,_netdev,x-systemd.after=wait-for-ping.service 0 0
4. Использование кронтаба
Если предыдущие варианты не сработали, еще одним способом является использование задания в cron
для выполнения команды mount -a
позднее в процессе загрузки:
-
Откройте кронтаб для редактирования:
sudo crontab -e
-
Добавьте следующую строку:
@reboot /usr/bin/mount -a
5. Резюме
В случае, если простое добавление _netdev
или использование x-systemd.after=network-online.target
не справляются с задачей, создайте специальный сервис systemd, который будет следить за доступностью сети. Как крайний случай, использование задания в cron
может помочь решить проблему с зависанием при загрузке. Всё это совместно поможет вам добиться успешного монтирования CIFS-устройств после загрузки Arch (arm) системы.
Не забудьте сделать повторную проверку и перезагрузить вашу систему после внесения изменений, чтобы убедиться, что всё работает как задумано.