Поскольку вы не выключили виртуальную машину, процесс, использующий файл образа, все еще имеет открытый файл, и он еще не был удален. Пока процесс продолжает работать, вы сможете его восстановить.
Для этого ответа у меня есть образ kvm под названием testdelete
. ВМ работает, но я удалил файл.
Сначала нужно найти процесс, использующий этот файл. Самый простой способ - lsof
.
# lsof | grep /var/lib/libvirt/images/testdelete.img
qemu-kvm 29627 qemu 9u REG 9,0 2147483648 399357 /var/lib/libvirt/images/testdelete.img (deleted)
Это говорит мне, что это процесс 29627 и дескриптор файла 9. Давайте посмотрим на это
# cd /proc/29627/fd
# ls -l 9
lrwx------ 1 qemu qemu 64 Jul 21 18:13 9 -> /var/lib/libvirt/images/testdelete.img (deleted)
Хорошо, отлично. Это совпадает. Теперь давайте восстановим его! Вам нужен диск с достаточным количеством свободного места для хранения всего образа
В идеале ваша виртуальная машина должна находиться в состоянии покоя, насколько это возможно; поскольку мы копируем необработанный образ диска, мы подвергаемся риску повреждения, если некоторые процессы записывают данные на диск. Мы можем попытаться минимизировать этот риск, посылая сигнал STOP.
# kill -STOP 29627
Это эффективно "замораживает" процесс. Резервное копирование, которое мы сейчас делаем, будет эквивалентно тому, что происходит после жесткого сбоя; при перезагрузке ОС выполнит fsck
(или эквивалент) для восстановления.
Теперь мы можем скопировать данные
# dd if=9 of=/home/sweh/recovered.img bs=1M
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 5.74931 s, 374 MB/s
Это выглядит идеально; образ диска был 2 Гб, и это то, что он скопировал.
Этот образ выглядит хорошо?
# cd /home/sweh
# sfdisk -l recovered.img
Disk recovered.img: cannot get geometry
Disk recovered.img: 261 cylinders, 255 heads, 63 sectors/track
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0
Device Boot Start End #cyls #blocks Id System
recovered.img1 0+ 65- 66- 524288 82 Linux swap / Solaris
recovered.img2 * 65+ 261- 196- 1571840 83 Linux
recovered.img3 0 - 0 0 0 Empty
recovered.img4 0 - 0 0 0 Empty
Да, это похоже на мою таблицу разделов. На этом этапе вы можете провести другие тесты, чтобы убедиться, что образ выглядит хорошо.
Вот и все! Вы восстановили файл образа.
ПРИМЕЧАНИЕ: В этом примере я собираюсь убить существующий процесс qemu
. Этот шаг необратим, потому что он приводит к освобождению диска. Если вы хотите провести некоторое тестирование "параллельного запуска", вы можете создать новый файл образа и virsh define
новую ВМ для его использования.
Давайте перезапустим ВМ с помощью этого. Уничтожим старую ВМ, скопируем файл данных на место и перезапустим ее.
# virsh destroy testdelete
# cp -v recovered.img /var/lib/libvirt/images/testdelete.img
`recovered.img' -> `/var/lib/libvirt/images/testdelete.img'
# virsh start testdelete
Domain testdelete started
Мы можем подключиться к консоли?
# virsh console testdelete
Connected to domain testdelete
Escape character is ^]
CentOS release 6.8 (Final)
Kernel 2.6.32-642.3.1.el6.x86_64 on an x86_64
dhcp226.spuddy.org login:
Восстановление завершено :-)
https://access.redhat.com/solutions/1293513, после обсуждения пользователя --, говорит, что RH обычно не поддерживает возможность обычных пользователей останавливать и запускать системные демоны; затем он показывает, как настроить sudo, чтобы позволить этим пользователям стать администраторами для запуска данного демона (, такого как демон журнала, который работает от имени пользователя root ). Но в статье отсутствует суть вопроса OP, который, похоже, позволяет пользователю управлять процессом в systemd, работающим от имени этого пользователя; не системный демон, а демон уровня пользователя -. --Пользователь касается ее, но статья быстро отклоняется по касательной.
Я подозреваю, что они хотят, чтобы вы выяснили, что копии данной службы могут быть запущены как root, но затем сбросить разрешения и стать пользователем на время действия команды. Вам нужно выяснить, как перейти от root к (, например )идентификатор и разрешения testuser, так же, как запускается служба moin.
Вкратце :пользователю нужно будет подняться до root, чтобы включить или управлять демоном, который сам понижает права пользователя как часть сценария запуска. Многие демоны (, например ntpd -u ), будут сбрасывать разрешения как часть вызова, и с помощью этого метода мы можем позволить пользователям управлять пользовательскими демонами без использования --пользовательской части системного холодильника -, которая Сам РХ даже ненавидит.
Да, он ненадолго становится корневым, и да, это проблема безопасности; и да, было бы лучше, если бы материнская компания поддерживала все части любимого сына своего любимого сына. Но имеем то, что имеем.
Для большинства случаев использования -(например. когда пользователь управляет своими файлами модулей ), systemd 219 для RHEL7 работает нормально, вам просто нужно включить его. Tableau Server для Linux, например, поставляется с пользовательским сервисом, который включает пользовательский экземпляр :
.# cat /etc/systemd/system/user@29575.service
[Unit]
Description=User Manager for UID %i
After=systemd-user-sessions.service
# These are present in the RHEL8 version of this file except that the unit is Requires, not Wants.
# It's listed as Wants here so that if this file is used in a RHEL7 settings, it will not fail.
# If a user upgrades from RHEL7 to RHEL8, this unit file will continue to work until it's
# deleted the next time they upgrade Tableau Server itself.
After=user-runtime-dir@%i.service
Wants=user-runtime-dir@%i.service
[Service]
LimitNOFILE=infinity
LimitNPROC=infinity
User=%i
PAMName=systemd-user
Type=notify
# PermissionsStartOnly is deprecated and will be removed in future versions of systemd
# This is required for all systemd versions prior to version 231
PermissionsStartOnly=true
ExecStartPre=/bin/loginctl enable-linger %i
ExecStart=-/lib/systemd/systemd --user
Slice=user-%i.slice
KillMode=mixed
Delegate=yes
TasksMax=infinity
Restart=always
RestartSec=15
[Install]
WantedBy=default.target
Вам по-прежнему потребуется XDG _RUNTIME _DIR в .bashrc
или .profile
при взаимодействии с экземпляром:
# cat /home/$(id -un 29575)/.bashrc
#!/bin/bash
[ -z "${XDG_RUNTIME_DIR}" ] && export XDG_RUNTIME_DIR=/run/user/$(id -ru)
# systemctl daemon-reload
# systemctl enable user@29575.service
Created symlink from /etc/systemd/system/default.target.wants/user@29575.service to /etc/systemd/system/user@29575.service.
# systemctl start user@29575.service
# su -l -s /bin/bash -c "systemctl --user status" $(id -un 29575)
● hostname
State: running
Jobs: 0 queued
Failed: 0 units
Since: Tue 2020-09-22 12:12:48 UTC; 5min ago
CGroup: /user.slice/user-29575.slice/user@29575.service
├─18802 /lib/systemd/systemd --user
└─18804 (sd-pam)
Предоставленоhttps://access.redhat.com/solutions/3461241