Привет, у меня есть простой hookscript, чтобы убедиться, что необходимые точки монтирования для контейнеров монтируются на хосте при запуске. Монтирование работает как ожидалось, но размонтирование в фазе post-stop не работает. Триггер post-stop выполняется (я протестировал это, создав временный файл в фазе post-stop), но кажется, что ресурсы еще не освобождаются гостевой системой (см. ). Что я могу сделать, чтобы правильно размонтировать диски после завершения работы контейнера, если нельзя использовать фазу hook post-stop? Разве это не должно быть правильным местом для этого?
Код:
```
#!/usr/bin/perl
# Пример hook script для PVE guests (hookscript config option)
# Можно установить это через pct/qm с
# pct set <vmid> -hookscript <volume-id>
# qm set <vmid> -hookscript <volume-id>
# где <volume-id> должен быть исполняемым файлом в папке snippets
# любого хранилища с директориями, например:
# qm set 100 -hookscript local:snippets/hookscript.pl
use strict;
use warnings;
print "GUEST HOOK: " . join(' ', @ARGV). "\n";
# Первый аргумент - vmid
my $vmid = shift;
# Второй аргумент - фаза
my $phase = shift;
if ($phase eq 'pre-start') {
# Первая фаза 'pre-start' будет выполнена перед запуском гостевой
# системы. Завершение с кодом != 0 приведет к отмене запуска
print "$vmid запускается, выполняются подготовки.\n";
system("mount /mnt/lxc/$vmid/*");
# print "подготовки не удались, отмена."
# exit(1);
} elsif ($phase eq 'post-start') {
# Вторая фаза 'post-start' будет выполнена после того, как гостевая
# система успешно запустится.
print "$vmid успешно запущен.\n";
} elsif ($phase eq 'pre-stop') {
# Третья фаза 'pre-stop' будет выполнена перед остановкой гостевой
# системы через API. Не будет выполнена, если гостевая система
# остановлена изнутри, например, командой 'poweroff'.
print "$vmid будет остановлен.\n";
} elsif ($phase eq 'post-stop') {
# Последняя фаза 'post-stop' будет выполнена после остановки гостевой.
# Эта фаза должна выполняться даже в случае сбоя гостевой системы
# или ее неожиданной остановки.
print "$vmid остановлен. Выполняется очистка.\n";
# Сейчас не работает, потому что passthrough устройства освобождаются только после post-stop
#system("umount /mnt/lxc/$vmid/*");
} else {
die "получена неизвестная фаза '$phase'\n";
}
exit(0);
```
Вот мой /etc/fstab (удашены IP-адреса и точки монтирования):
```
# lxc file shares
//ipaddr/mountpoint1 /mnt/lxc/178/mountpoint1 cifs nofail,credentials=/root/.smbcredentials_1,uid=100000,gid=100000 0 0
//ipaddr/mountpoint2 /mnt/lxc/178/mountpoint2 cifs nofail,credentials=/root/.smbcredentials_1,uid=100000,gid=100000 0 0
//ipaddr/mountpoint3 /mnt/lxc/178/mountpoint3 cifs nofail,credentials=/root/.smbcredentials_1,uid=100000,gid=100000 0 0
//ipaddr/mountpoint4 /mnt/lxc/179/mountpoint4 cifs nofail,credentials=/root/.smbcredentials_1,uid=100000,gid=100000 0 0
//ipaddr/mountpoint5 /mnt/lxc/176/mountpoint5 cifs nofail,credentials=/root/.smbcredentials_2,uid=100000,gid=100000 0 0
```
Вот вывод журнала из journalctl -r:
```
Apr 02 13:51:37 hypercat systemd[1]: pve-container@179.service: Деактивирован успешно.
Apr 02 13:51:37 hypercat pct[303863]: <root@pam> завершение задачи UPID:hypercat:0004A2F9:00453686:67ED24C1:vzshutdown:179:root@>
Apr 02 13:51:37 hypercat kernel: EXT4-fs (dm-21): размонтирование файловой системы 0ed234dc-aff3-4891-90f3-f8feafef1d33.
Apr 02 13:51:36 hypercat pvestatd[1248]: не удалось получить PID для CT 179 (не работает?).
Apr 02 13:51:36 hypercat kernel: audit: type=1400 audit(1743594696.243:77): apparmor="STATUS" operation="profile_remove>
Apr 02 13:51:36 hypercat audit[304043]: AVC apparmor="STATUS" operation="profile_remove" profile="/usr/bin/lxc-start" n>
Apr 02 13:51:29 hypercat pct[303865]: остановка CT 179: UPID:hypercat:0004A2F9:00453686:67ED24C1:vzshutdown:179:root@pam:
Apr 02 13:51:29 hypercat pct[303863]: <root@pam> запуск задачи UPID:hypercat:0004A2F9:00453686:67ED24C1:vzshutdown:179:>
Apr 02 13:51:16 hypercat pct[303367]: <root@pam> завершение задачи UPID:hypercat:0004A108:004530A7:67ED24B2:vzstart:179:root@pam>
Apr 02 13:51:15 hypercat kernel: audit: type=1400 audit(1743594675.617:76): apparmor="STATUS" operation="profile_load" >
Apr 02 13:51:15 hypercat audit[303398]: AVC apparmor="STATUS" operation="profile_load" profile="/usr/bin/lxc-start" nam>
Apr 02 13:51:15 hypercat kernel: EXT4-fs (dm-21): смонтирована файловая система 0ed234dc-aff3-4891-90f3-f8feafef1d33.
Apr 02 13:51:14 hypercat pct[303368]: запуск CT 179: UPID:hypercat:0004A108:004530A7:67ED24B2:vzstart:179:root@pam:
Apr 02 13:51:14 hypercat pct[303367]: <root@pam> запуск задачи UPID:hypercat:0004A108:004530A7:67ED24B2:vzstart:179:root@pam:
Apr 02 13:51:14 hypercat kernel: CIFS: Попытка смонтировать //ipaddr/mountpoint4
Apr 02 13:51:14 hypercat kernel: CIFS: включение опции forcegid mount явно, так как gid= указано.
Apr 02 13:51:14 hypercat kernel: CIFS: включение опции forceuid mount явно, так как uid= указано.
```
Код:
```
#!/usr/bin/perl
# Пример hook script для PVE guests (hookscript config option)
# Можно установить это через pct/qm с
# pct set <vmid> -hookscript <volume-id>
# qm set <vmid> -hookscript <volume-id>
# где <volume-id> должен быть исполняемым файлом в папке snippets
# любого хранилища с директориями, например:
# qm set 100 -hookscript local:snippets/hookscript.pl
use strict;
use warnings;
print "GUEST HOOK: " . join(' ', @ARGV). "\n";
# Первый аргумент - vmid
my $vmid = shift;
# Второй аргумент - фаза
my $phase = shift;
if ($phase eq 'pre-start') {
# Первая фаза 'pre-start' будет выполнена перед запуском гостевой
# системы. Завершение с кодом != 0 приведет к отмене запуска
print "$vmid запускается, выполняются подготовки.\n";
system("mount /mnt/lxc/$vmid/*");
# print "подготовки не удались, отмена."
# exit(1);
} elsif ($phase eq 'post-start') {
# Вторая фаза 'post-start' будет выполнена после того, как гостевая
# система успешно запустится.
print "$vmid успешно запущен.\n";
} elsif ($phase eq 'pre-stop') {
# Третья фаза 'pre-stop' будет выполнена перед остановкой гостевой
# системы через API. Не будет выполнена, если гостевая система
# остановлена изнутри, например, командой 'poweroff'.
print "$vmid будет остановлен.\n";
} elsif ($phase eq 'post-stop') {
# Последняя фаза 'post-stop' будет выполнена после остановки гостевой.
# Эта фаза должна выполняться даже в случае сбоя гостевой системы
# или ее неожиданной остановки.
print "$vmid остановлен. Выполняется очистка.\n";
# Сейчас не работает, потому что passthrough устройства освобождаются только после post-stop
#system("umount /mnt/lxc/$vmid/*");
} else {
die "получена неизвестная фаза '$phase'\n";
}
exit(0);
```
Вот мой /etc/fstab (удашены IP-адреса и точки монтирования):
```
# lxc file shares
//ipaddr/mountpoint1 /mnt/lxc/178/mountpoint1 cifs nofail,credentials=/root/.smbcredentials_1,uid=100000,gid=100000 0 0
//ipaddr/mountpoint2 /mnt/lxc/178/mountpoint2 cifs nofail,credentials=/root/.smbcredentials_1,uid=100000,gid=100000 0 0
//ipaddr/mountpoint3 /mnt/lxc/178/mountpoint3 cifs nofail,credentials=/root/.smbcredentials_1,uid=100000,gid=100000 0 0
//ipaddr/mountpoint4 /mnt/lxc/179/mountpoint4 cifs nofail,credentials=/root/.smbcredentials_1,uid=100000,gid=100000 0 0
//ipaddr/mountpoint5 /mnt/lxc/176/mountpoint5 cifs nofail,credentials=/root/.smbcredentials_2,uid=100000,gid=100000 0 0
```
Вот вывод журнала из journalctl -r:
```
Apr 02 13:51:37 hypercat systemd[1]: pve-container@179.service: Деактивирован успешно.
Apr 02 13:51:37 hypercat pct[303863]: <root@pam> завершение задачи UPID:hypercat:0004A2F9:00453686:67ED24C1:vzshutdown:179:root@>
Apr 02 13:51:37 hypercat kernel: EXT4-fs (dm-21): размонтирование файловой системы 0ed234dc-aff3-4891-90f3-f8feafef1d33.
Apr 02 13:51:36 hypercat pvestatd[1248]: не удалось получить PID для CT 179 (не работает?).
Apr 02 13:51:36 hypercat kernel: audit: type=1400 audit(1743594696.243:77): apparmor="STATUS" operation="profile_remove>
Apr 02 13:51:36 hypercat audit[304043]: AVC apparmor="STATUS" operation="profile_remove" profile="/usr/bin/lxc-start" n>
Apr 02 13:51:29 hypercat pct[303865]: остановка CT 179: UPID:hypercat:0004A2F9:00453686:67ED24C1:vzshutdown:179:root@pam:
Apr 02 13:51:29 hypercat pct[303863]: <root@pam> запуск задачи UPID:hypercat:0004A2F9:00453686:67ED24C1:vzshutdown:179:>
Apr 02 13:51:16 hypercat pct[303367]: <root@pam> завершение задачи UPID:hypercat:0004A108:004530A7:67ED24B2:vzstart:179:root@pam>
Apr 02 13:51:15 hypercat kernel: audit: type=1400 audit(1743594675.617:76): apparmor="STATUS" operation="profile_load" >
Apr 02 13:51:15 hypercat audit[303398]: AVC apparmor="STATUS" operation="profile_load" profile="/usr/bin/lxc-start" nam>
Apr 02 13:51:15 hypercat kernel: EXT4-fs (dm-21): смонтирована файловая система 0ed234dc-aff3-4891-90f3-f8feafef1d33.
Apr 02 13:51:14 hypercat pct[303368]: запуск CT 179: UPID:hypercat:0004A108:004530A7:67ED24B2:vzstart:179:root@pam:
Apr 02 13:51:14 hypercat pct[303367]: <root@pam> запуск задачи UPID:hypercat:0004A108:004530A7:67ED24B2:vzstart:179:root@pam:
Apr 02 13:51:14 hypercat kernel: CIFS: Попытка смонтировать //ipaddr/mountpoint4
Apr 02 13:51:14 hypercat kernel: CIFS: включение опции forcegid mount явно, так как gid= указано.
Apr 02 13:51:14 hypercat kernel: CIFS: включение опции forceuid mount явно, так как uid= указано.
```
