Как настроить петлевое устройство при запуске с сервисом?

Я устанавливаю устройство цикла для обратного файла необработанного образа виртуальной машины с помощью этой команды:

sudo losetup /dev/loop0 "/home/asus/VirtualBox VMs/Windows RAW/Windows 10.img" 

И это прекрасно работает.

$ losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                                            DIO LOG-SEC
/dev/loop0         0      0         0  0 /home/asus/VirtualBox VMs/Windows RAW/Windows 10.img   0     512

Но я хочу сделать это изменение постоянным, поэтому я создал это .sevice запускаться при запуске:

$ cat /etc/systemd/system/loops-setup.service
[Unit]
Description=Setup loop devices
DefaultDependencies=no
Conflicts=umount.target
Before=local-fs.target
After=systemd-udev-settle.service
Required=systemd-udev-settle.service

[Service]
Type=oneshot
ExecStart=/sbin/losetup /dev/loop0 "/home/asus/VirtualBox VMs/Windows RAW/Windows 10.img"
ExecStop=/sbin/losetup -d /dev/loop0
TimeoutSec=60
RemainAfterExit=yes

[Install]
WantedBy=local-fs.target
Also=systemd-udev-settle.service

Также эта услуга хорошо запускается вручную:

sudo systemctl start loops-setup

Но это не удалось запустить при запуске, и показывает эту ошибку:

May 11 19:57:17 ubuntu losetup[308]: losetup: /dev/loop0: failed to set up loop device: No such file or directory

Я думаю, это из-за иерархии услуг, и я должен изменить Before а также After варианты, но я не знаю, как это сделать.

Заранее спасибо.

1 ответ

Решение

Эта проблема вызвана двумя причинами:

1. Как упомянул @CharlesGreen systemd-udev-settle.service не может быть активирован:

$ sudo systemctl enable systemd-udev-settle.service
The unit files have no installation config (WantedBy=, RequiredBy=, Also=,
Alias= settings in the [Install] section, and DefaultInstance= for template
units). This means they are not meant to be enabled using systemctl.

Possible reasons for having this kind of units are:
• A unit may be statically enabled by being symlinked from another unit's
  .wants/ or .requires/ directory.
• A unit's purpose may be to act as a helper for some other unit which has
  a requirement dependency on it.
• A unit may be started when needed via activation (socket, path, timer,
  D-Bus, udev, scripted systemctl call, ...).
• In case of template units, the unit is meant to be enabled with some
  instance name specified.

Так что этот сервис остается неактивным:

$ sudo systemctl status systemd-udev-settle.service
● systemd-udev-settle.service - udev Wait for Complete Device Initialization
   Loaded: loaded (/usr/lib/systemd/system/systemd-udev-settle.service; static; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:udev(7)
           man:systemd-udevd.service(8)

2. Вторая проблема losetup команда должна получить доступ home раздел для настройки Windows 10.img, И этот раздел не монтируется при запуске.


Поэтому поменяйте сервис таким образом, решив проблему:

[Unit]
Description=Setup loop devices
DefaultDependencies=no
Conflicts=umount.target
Before=local-fs.target
After=systemd-udevd.service home.mount
Required=systemd-udevd.service

[Service]
Type=oneshot
ExecStart=/sbin/losetup /dev/loop0 "/home/asus/VirtualBox VMs/Windows RAW/Windows 10.img"
ExecStop=/sbin/losetup -d /dev/loop0
TimeoutSec=60
RemainAfterExit=yes

[Install]
WantedBy=local-fs.target
Also=systemd-udevd.service
Другие вопросы по тегам