Как определить имя работающей виртуальной машины QEMU?

Короткий ответ - нет, сервер примет любой действительный логин с точки зрения сервера.

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

Обратите внимание, что этого может быть достаточно для «средних» пользователей и требует, чтобы вы также контролировали клиентов. Опытные пользователи найдут способ подделать переменную CLIENTUSER, используемую ниже.

Используя директиву AcceptEnv в /etc/ssh/sshd_config, вы можете принять, например, переменную с именем CLIENTUSER:

AcceptEnv CLIENTUSER

Следующим шагом является принудительное использование команды входа пользователей в оболочку входа, например:

ForceCommand /bin/bash -l

Перезапустите службу sshd и добавьте следующее в /etc/profile

if [ -z "$CLIENTUSER" ] || [ "$CLIENTUSER" != "user3" ] && [ ! -z "$SSH_CLIENT" ]
then
       echo 'Client logon not allowed'
       logout
fi

Вышеуказанное выгоните из системы каждого клиента, который не отправит переменную CLIENTUSER или не отправит переменную CLIENTUSER с другим значением, чем user3.

Вы можете проверить это с помощью следующей клиентской командной строки:

$ ssh user2@host
Client logon not allowed

$ CLIENTUSER=user3 ssh -o "SendEnv CLIENTUSER" user2@host
user2@host $

Как видите, CLIENTUSER можно легко подделать из командной строки. Чтобы предотвратить это, вы можете добавить следующее в client '/etc/profile:

declare -r CLIENTUSER="$USER"

Когда пользователь попытается изменить значение переменной CLIENTUSER, он получит следующую ошибку:

bash: CLIENTUSER: readonly variable
2
23.05.2017, 21:43
1 ответ

virsh— это инструмент командной строки для управления libvirtструктурой управления виртуализацией. В этой структуре вы должны определить виртуальные машины, используя любой гипервизор, поддерживаемый libvirt, включая qemu, xen, virtualboxчерез интерфейс управления.

libvirtобеспечивает уровень абстракции выше таких вещей, как qemu. С ним вы не запустите qemuнапрямую. Вместо этого libvirtзапустит qemuс некоторыми специальными параметрами, позволяющими взаимодействовать с qemu.

Например, в моей системе libvirtзапустил qemu с этими параметрами для одной из своих виртуальных машин:

qemu-system-x86_64  -enable-kvm \
                    -name freebsd11.0 -S \
                    -machine pc-i440fx-wily,accel=kvm,usb=off \
                    -cpu Nehalem \
                    -m 1536 \
                    -realtime mlock=off \
                    -smp 3,sockets=3,cores=1,threads=1 \
                    -uuid 82f3448e-2767-46b1-a7d1-7072184ef924 \
                    -no-user-config \
                    -nodefaults \
                    -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/domain-freebsd11.0/monitor.sock,server,nowait \
                    -mon chardev=charmonitor,id=monitor,mode=control \
                    -rtc base=utc,driftfix=slew \
                    -global kvm-pit.lost_tick_policy=discard \
                    -no-hpet \
                    -no-shutdown \
                    -global PIIX4_PM.disable_s3=1 \
                    -global PIIX4_PM.disable_s4=1 \
                    -boot strict=on \
                    -device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x6.0x7 \
                    -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x6 \
                    -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x6.0x1 \
                    -device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x6.0x2 \
                    -device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x5 \
                    -drive file=/home/chazelas/Downloads/FreeBSD-11.0-RC1-amd64.qcow2,format=qcow2,if=none,id=drive-virtio-disk0 \
                    -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x7,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 \
                    -netdev tap,fd=26,id=hostnet0,vhost=on,vhostfd=28 \
                    -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:11:8a:53,bus=pci.0,addr=0x3 \
                    -chardev pty,id=charserial0 \
                    -device isa-serial,chardev=charserial0,id=serial0 \
                    -chardev spicevmc,id=charchannel0,name=vdagent \
                    -device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,id=channel0,name=com.redhat.spice.0 \
                    -spice port=5900,addr=127.0.0.1,disable-ticketing,image-compression=off,seamless-migration=on \
                    -device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864,vgamem_mb=16,bus=pci.0,addr=0x2 \
                    -device intel-hda,id=sound0,bus=pci.0,addr=0x4 \
                    -device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0 \
                    -chardev spicevmc,id=charredir0,name=usbredir \
                    -device usb-redir,chardev=charredir0,id=redir0 \
                    -chardev spicevmc,id=charredir1,name=usbredir \
                    -device usb-redir,chardev=charredir1,id=redir1 \
                    -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x8 \
                    -msg timestamp=on

В основном это спецификация виртуального оборудования виртуальной машины, но вы также видите:

-chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/domain-freebsd11.0/monitor.sock,server,nowait 
-mon chardev=charmonitor,id=monitor,mode=control

Указывает канал, с которым libvirtможет взаимодействовать сqemu(с использованием некоторого JSON -на основе машинного протокола)

Но вы бы не использовали это напрямую. Вы должны ввести virshкоманды, такие как virsh shutdown. virshпередаст их демону libvirtd, который, в свою очередь, преобразует их в qemuконкретные инструкции, используя этот канал.

Однако в вашем случае вы не используете libvirt.Вы не определили виртуальную машину с помощью virt-manager,virt-install(или virsh define/create). Вместо этого вы сами запустили qemu.

libvirt, если он установлен, он ничего не знает об этой виртуальной машине. Так что нет смысла пытаться использовать virshдля взаимодействия с ним.

Как вы начали qemu, вы не указали какой-либо конкретный канал монитора для взаимодействия с ним, поэтому вы получите значение по умолчанию.

По умолчанию вы обычно получаете графическую консоль SDL .

В нем вы можете набрать Ctrl+Alt+2 , чтобы получить человеческий интерфейс монитора. Это интерфейс командной строки. Вы увидите

 (qemu) 

подсказка, где вы можете вводить команды. Попробуйте helpдля сводки.

Если вы дали имя своей виртуальной машине с помощью -name, вы сможете получить его с помощью команды info name.

Здесь вы должны запустить команду savevmqemu. Но чтобы использовать команду savevm, AFAIK, у вас должен быть хотя бы один образ диска qcow2, подключенный к виртуальной машине, что, похоже, не ваш случай.

Чтобы приостановить и сохранить состояние виртуальной машины, вы можете выполнить (в приглашении (qemu)):

migrate "exec:gzip>/path/to/savedstate.gz"

При этом виртуальная машина приостанавливается, а сжатое состояние сохраняется в файл. Затем вы можете quitи позже вернуть виртуальную машину из этого сохраненного состояния, добавив -incoming 'exec:gunzip</path/to/savestate.gz'в командную строку qemu-system.

Есть много вещей, которые вы можете сделать, если вы хорошо знаете qemu, но если вы хотите облегчить себе жизнь, вы, вероятно, будете использовать управляющие оболочки вокруг qemu, такие как libvirt.

1
27.01.2020, 22:18

Теги

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