Предполагая, что это не просто проблема с каким-то сторожевым устройством, вы можете попробовать перехватить цель kexec
для systemd. Обычно это используется для загрузки ядра kdump для дампа памяти, но вы действительно можете настроить эту цель для выполнения чего угодно.
Я создал модуль systemd с именем kexec-sleep
и поместил его в /etc/systemd/system/kexec-sleep.service
(. Я не уверен, что эти строки Requires
/After
/Before
верны, но они работали у меня в виртуальном машина):
[Unit]
Description=Sleep forever at kexec
DefaultDependencies=no
Requires=umount.target
After=umount.target
Before=final.target
[Service]
Type=oneshot
ExecStart=/sbin/kexec-sleep
KillMode=none
[Install]
WantedBy=kexec.target
Это вызовет /sbin/kexec-sleep
, который является просто сценарием оболочки (, показанным ниже ). Он пытается перемонтировать корневую файловую систему только для чтения -, поэтому она должна оставаться в чистом состоянии, пока устройство не выключится. У меня есть несколько sleep
s, которые, вероятно, длиннее, чем вам нужно, плюс подсказка в конце, которая позволит вам перезагрузиться без необходимости тянуть шнур питания.
#!/bin/sh
stty sane < /dev/console # enable automatic CRLF output on console
exec < /dev/console > /dev/console 2>&1 # redirect stdio to/from console
echo "Sleeping several seconds for processes to terminate..."
sleep 10
# kill some expected processes
killall dhclient
# sleep again...
sleep 5
echo "Processes still running:"
/bin/ps --ppid 2 -p 2 --deselect # list non-kernel processes
echo "Attempting to remount root filesystem read-only..."
sync; sync; sync
mount -o remount,ro /
grep /dev/sda /proc/mounts
while true; do
echo "System paused. Type 'reboot' to reboot"
read -p '> ' entry
if [ "$entry" = "reboot" ]; then
/sbin/reboot -f
fi
done
После создания этих файлов запустите chmod +x /sbin/kexec-sleep
и systemctl enable kexec-sleep
.
Чтобы вызвать это вместо обычного завершения работы, запустите systemctl kexec
.
При условии, что /media/myuser/btrbaks
является точкой монтирования раздела btrfs, который находится на внешнем диске (подробности о разделах и монтировании см. в конце ), здесь команды, которые нужно запускать только в первый раз.
Создайте каталог для резервных копий:
sudo mkdir /media/myuser/btrbaks/BACKUPS
Создайте подтом @, который будет местом назначения команды rsync
sudo btrfs subvolume create /media/myuser/btrbaks/BACKUPS/@
Здесь команды, которые нужно запускать для каждой резервной копии
Рсинхронизация:
sudo rsync -aAXv --delete --exclude=/dev/* --exclude=/proc/* --exclude=/sys/* --exclude=/tmp/* --exclude=/run/* --exclude=/mnt/* --exclude=/media/* --exclude="swapfile" --exclude="lost+found" --exclude=/home/* --exclude=/root/* / /media/myuser/btrbaks/BACKUPS/@/
Моментальный снимок Btrfs:
sudo btrfs subvolume snapshot /media/myuser/btrbaks/BACKUPS/@ /media/myuser/btrbaks/BACKUPS/@_bak_`date +%Y.%m.%d_%H.%M.%S`
Затем вы можете проверить:
sudo btrfs subvolume list /media/attilio/btrbaks/
ID 279 gen 109 top level 5 path BACKUPS/@
ID 280 gen 109 top level 5 path BACKUPS/@_bak_2020.09.14_08.12.2
Если ваша система загружается, вы можете восстановить ее с помощью:
sudo rsync -aAXv --dry-run --delete --exclude=/dev/* --exclude=/proc/* --exclude=/sys/* --exclude=/tmp/* --exclude=/run/* --exclude=/mnt/* --exclude=/media/* --exclude="swapfile" --exclude="lost+found" --exclude=/home/* --exclude=/root/* /media/attilio/btrbaks/BACKUPS/@/ /
Не забудьте удалить параметр --dry-run
, чтобы выполнить реальное восстановление.
Поскольку @
указывает на вашу последнюю резервную копию, вы можете изменить ее с помощью @_bak_2020.09.14_08.12.22
или любого другого снимка.
Если ваша система не загружается, вы можете загрузиться с живого USB и выполнить ту же команду, изменив rsync <source>
и<destination>
Это конфигурация моего оборудования:
/dev/sda5 ext4 / # system installation
/dev/sdb3 btrfs /media/myuser/btrbaks # external drive has several partitions, one is btrfs and here is the mount point that is automatically assigned by linux mint
Вы также можете конвертировать ext4 в btrfs без переустановки. Снапшоты и живая система теперь используют один и тот же раздел.
Преобразование включает несколько шагов:
Примечание.:Сначала протестируйте его на виртуальной машине. Я еще не делал и мог что-то забыть.
sudo -i
btrfs-convert /dev/sda1
(, предполагая, что /dev/sda1
является вашим разделом)mount /dev/sda1 /mnt
@
:btrfs sub snap /mnt /mnt/@
btrfs sub create /mnt/@home && rsync -HAXav /mnt/home/ /mnt/@/home/
ls -l /dev/disk/by-uuid | grep sda1
/
в /mnt/@/etc/fstab
, на 2 линии:UUID=xxxxxxxx-xxxx-xxxx-xxxxxxxx / btrfs defaults,subvol=@ 0 1 UUID=xxxxxxxx-xxxx-xxxx-xxxxxxxx /home btrfs defaults,subvol=@home 0 2
и замените(xxxxxxxx-xxxx-xxxx-xxxxxxxx
своим реальнымUUID
).
linux
в /mnt/boot/grub/grub.cfg
, наlinux /@/boot/vmlinuz-YYYY root=UUID=XXXX ro rootflags=subvol=@
(с YYYY
в качестве версии ядра, которая у нее была изначально, и XXXX
сноваUUID
)и запуститеcp /mnt/boot/grub/grub.cfg /mnt/@/boot/grub/grub.cfg
sudo -i
@
и вашем @home
подтомах:mkdir /mnt/fullbtrfs && mount /dev/sda1 /mnt/fullbtrfs && rm -rf /mnt/fullbtrfs/[a-z]* && umount /mnt/fullbtrfs
update-grub