Я настраиваю устройство петли для обратного файла необработанного образа виртуальной машины с помощью этой команды:
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. Как упомянул @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