[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: screen - запуск программ при старте



On Wed, Nov 05, 2008 at 10:25:54PM -0500, Nicholas wrote:
> Dmitri V. Ivanov wrote:
> 
> >Сам использую detached screen чтобы цеплять monitor и serial от
> >kvm/qemu. Написанное мной пока крайне сырое, но тоже могу показать (а
> >вдруг кто чего подскажет).
> 
> Пока не совсем понял что значит "цеплять monitor и serial". Например:
> запускается kvm с помошью команды
> kvm -daemonize -vnc 192.168.1.1:3 -m 256 -hda vm.qcow2
> после чего можно подключиться к его терминалу с помощью  vncviewer
> 192.168.1.1:3 .
> 
> Вы используете какой-то другой метод ?

Да. У меня машина имеет -vnc none -monitor pty -serial pty

qemu при запуске пишет что-то вроде "character device mapped to
/dev/pty/5"

Я ловлю эти строчки, и по ним делаю окошки в screen-е. screen
предварительно запускаю в сразу detached режиме (указывая имя сессии).

Каждую строчку я привожу к виду /dev/pty/<number>, а дальше это дело
цепляю примерно так 
screen -S <session name> -X screen -t <title> /dev/pty/5

Насколько я угадал (в документации этого нет, в код qemu не смотрел),
первая из этих строчек - monitor. В нем можно сказать например
system_powerdown, и vm аккуратно сделает shutdown.

Для serial console в inittab гостя указываем тип терминала screen (в
примерах vt100).

Вообще-то для этого есть libvirt (как я понял, написав уже свою
заготовку), но я ее пока не понимаю.

У меня пока получилась такая заготовка:
==============
#!/bin/sh

# Command to run KVM. All options except -monitor pty -serial -pty. Ones would
# be added by script itself
cmdline='qemu-system-x86_64 -m 256 -drive file=/home/dima/test1.img,if=virtio,boot=on -net nic,vlan=0,macaddr=00:16:3e:56:63:74,model=virtio -net tap,vlan=0,script=/etc/kvm/add2lan -kernel /boot/vmlinuz-2.6.26-bpo.1-686 -initrd /home/dima/initrd.img -append "root=/dev/vda1 ro console=ttyS0" -vnc none -daemonize'

# What to pass into screen. Always put 'monitor' first. May be up to four
# 'serial' (according to qemu-doc)
ptys='monitor serial'

# Name for screen session. Just a word - no dots, commas and spaces
sessname='vmbinder'

# Get attached or detached session with name $sessname and maximal PID (With hope it's last session). 
# sessrname gets value PID.${sessname}
sessrname=$(screen -ls|sed -n -e "\%^[[:space:]][[:space:]]*[[:digit:]]*\.${sessname}[[:space:]].*\(At\|De\)tached% {s/^[[:space:]]*\([^[:space:]]*\)[[:space:]].*$/\1/p}"| sort -t '.' -k 1,1n - | tail -n 1)
# If no desired session - start one
sessisnew=''
if test -z "$sessrname"; then
	screen -dmS $sessname
	sessrname=$(screen -ls|sed -n -e "\%^[[:space:]][[:space:]]*[[:digit:]]*\.${sessname}[[:space:]].*\(At\|De\)tached% {s/^[[:space:]]*\([^[:space:]]*\)[[:space:]].*$/\1/p}"| sort -t '.' -k 1,1n - | tail -n 1)
	screen -S $sessrname -p 0 -X title PlaceHolder
	sessisnew='1'
fi
#
appendptys=''
number='1'
for item in $ptys; do
	if test "$item" == "monitor"; then
		appendptys="$appendptys -monitor pty"
		number='0'
	else
		appendptys="$appendptys -serial pty"
	fi
done
set $ptys
#qemu-system-x86_64 -m 256 -drive file=/home/dima/test1.img,if=virtio,boot=on -kernel /boot/vmlinuz-2.6.26-bpo.1-686 -initrd /home/dima/initrd.img -append "root=/dev/vda1 ro console=ttyS0" -vnc none -monitor pty -serial pty -daemonize 2>&1 |

(eval ${cmdline}${appendptys} 2>&1) |
sed -n -e '\%[[:space:]]% {s@^.*[[:space:]]/@/@p}'|
while read line
do
	title=$1
	shift
	test "$number" != '0' && title="${title}$number"
	number=$(($number + 1))
	screen -S $sessrname -X screen -t $title $line
done
# If we are started new screen kill PlaceHolder window (one isn't needed for normal operations)
test -n "$sessisnew" && screen -S $sessrname -p PlaceHolder -X kill

================

В планах сделать из этого комплектик для скриптового запуска-остановки
виртуальной машины (мне нужна одна, но по идее можно и несколько).

WBR
Dmitri Ivanov


Reply to: