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

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

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
[ 1112] Но он не запустился при запуске и показывает эту ошибку:

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
задан 11 May 2019 в 23:56

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
0
ответ дан 11 May 2019 в 23:56

Другие вопросы по тегам:

Похожие вопросы: