Моделирование пользовательского режима systemd

Поскольку вы не выключили виртуальную машину, процесс, использующий файл образа, все еще имеет открытый файл, и он еще не был удален. Пока процесс продолжает работать, вы сможете его восстановить.

Для этого ответа у меня есть образ 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: 

Восстановление завершено :-)

3
04.03.2017, 15:45
2 ответа

https://access.redhat.com/solutions/1293513, после обсуждения пользователя --, говорит, что RH обычно не поддерживает возможность обычных пользователей останавливать и запускать системные демоны; затем он показывает, как настроить sudo, чтобы позволить этим пользователям стать администраторами для запуска данного демона (, такого как демон журнала, который работает от имени пользователя root ). Но в статье отсутствует суть вопроса OP, который, похоже, позволяет пользователю управлять процессом в systemd, работающим от имени этого пользователя; не системный демон, а демон уровня пользователя -. --Пользователь касается ее, но статья быстро отклоняется по касательной.

Я подозреваю, что они хотят, чтобы вы выяснили, что копии данной службы могут быть запущены как root, но затем сбросить разрешения и стать пользователем на время действия команды. Вам нужно выяснить, как перейти от root к (, например )идентификатор и разрешения testuser, так же, как запускается служба moin.

Вкратце :пользователю нужно будет подняться до root, чтобы включить или управлять демоном, который сам понижает права пользователя как часть сценария запуска. Многие демоны (, например ntpd -u ), будут сбрасывать разрешения как часть вызова, и с помощью этого метода мы можем позволить пользователям управлять пользовательскими демонами без использования --пользовательской части системного холодильника -, которая Сам РХ даже ненавидит.

Да, он ненадолго становится корневым, и да, это проблема безопасности; и да, было бы лучше, если бы материнская компания поддерживала все части любимого сына своего любимого сына. Но имеем то, что имеем.

2
27.01.2020, 21:30

Для большинства случаев использования -(например. когда пользователь управляет своими файлами модулей ), 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

1
22.09.2020, 12:31

Теги

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