[devel] libguestfs

Alexey Shabalin a.shabalin на gmail.com
Вт Ноя 18 19:48:32 MSK 2014


Вечер добрый.
Опишу прогресс над адаптацией libguestfs для ALTLinux.
И прошу знатоков подсказать где я могу ошибаться.

В двух словах, как работают утилиты из состава libguestfs.
Для работы утилит, запускается виртуальная машина с помощью qemu, в
параметрах которой указывается ядро и образ initrd, внутри которого
установлена минимальная система и утилиты для работы с файловыми
системами (fsck.*, resizefs и т.п.). Внутри этой виртуалки также
запускается демон guestfsd который принимает указания снаружи от
утилит и выполняет необходимые действия.
Основная проблема - подготовить этот самый initrd (appliance).
В fedora для изготовления appliance используется проект supermin
(бывший febootstrap). В принципе я адаптировал supermin для работы с
apt-rpm, но решил отказаться от этого. Мне больше понравился подход
opensuse, где initrd (appliance) генерируется с помощью
mkinitrd(правда модифицированных).

Что сделано:
- используется make-initrd из master
git://git.altlinux.org/people/legion/packages/make-initrd.git
- для нового  make-initrd также нужен и новый sysvinit-initramfs из
master git://git.altlinux.org/people/legion/packages/sysvinit.git

- копируем текущее ядро в /usr/lib64/guestfs/vmlinuz.x86_64
- chmod 644 /usr/lib64/guestfs/vmlinuz.x86_64
- изготавливаем initrd:
   в /etc/initrd.mk.d/guestfs.mk
--------
IMAGEFILE = /usr/$(LIBNAME)/guestfs/initramfs.$(ARCH).img
FEATURES += guestfs
--------

  в /usr/share/make-initrd/features/guestfs/config.mk
--------
DISABLE_FEATURES += plymouth
FEATURES += devmapper qemu # в дальнейшем также понадобятся mdadm lvm btrfs
GUESTFS_DATADIR = \
        $(FEATURESDIR)/guestfs/data


GUESTFS_FILES   = \
        /usr/sbin/guestfsd \
        /usr/sbin/parted \
        $(wildcard /sbin/mount*) \
        $(wildcard /sbin/fsck*) \
        $(wildcard /sbin/mkfs*) \
        $(wildcard /sbin/*resize*) \
        $(wildcard /sbin/*disk)
--------

  в /usr/share/make-initrd/features/guestfs/rules.mk

--------
MODULES_ADD += drivers/scsi/ drivers/ata/ fs/

guestfs:
        @echo "Adding guestfs support ..."
        @put-tree "$(ROOTDIR)" $(GUESTFS_DATADIR)
        @put-file "$(ROOTDIR)" $(GUESTFS_FILES)

pack: guestfs
--------

в /usr/share/make-initrd/features/guestfs/data/etc/rc.d/init.d/guestfsd
--------
#!/bin/sh
### BEGIN INIT INFO
# Provides:            guestfsd
# Required-Start:      uevent
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start:       3 4 5
# Default-Stop:
# Short-Description:   guestfsd daemon
### END INIT INFO

. /etc/init.d/template

NAME=guestfsd
PIDFILE=/var/run/$NAME.pid
LOCKFILE=/var/lock/subsys/$NAME

start() {

#       start_daemon --lockfile "$LOCKFILE" --pidfile "$PIDFILE"
--displayname "$NAME" -- $NAME
        start_daemon --displayname "$NAME" -- $NAME
        RETVAL=$?
        return $RETVAL

}

stop()
{
        stop_daemon --pidfile "$PIDFILE" --lockfile "$LOCKFILE"
--no-announce -- $NAME
        RETVAL=$?
        return $RETVAL
}

restart()
{
        stop
        start
}

switch "${1-}"

--------

  в /usr/share/make-initrd/features/guestfs/data/etc/udev/rules.d
-----------
# For libguestfs, create /dev/disk/guestfs/<serial>
# and /dev/disk/guestfs/<serial><partnum>

KERNEL=="sd*[!0-9]", ENV{DEVTYPE}=="disk", ENV{ID_SCSI_SERIAL}=="?*", \
  SYMLINK+="disk/guestfs/$env{ID_SCSI_SERIAL}"
KERNEL=="sd*", ENV{DEVTYPE}=="partition", ENV{ID_SCSI_SERIAL}=="?*", \
  SYMLINK+="disk/guestfs/$env{ID_SCSI_SERIAL}%n"

# As written, it's likely the above only works with virtio-scsi
# because ID_SCSI_SERIAL is specific to the output of the 'scsi_id'
# program.  The following will not work because ID_SERIAL contains
# some unwanted text.

#KERNEL=="vd*[!0-9]", ATTRS{serial}=="?*", ENV{ID_SERIAL}="$attr{serial}", \
#  SYMLINK+="disk/guestfs/$env{ID_SERIAL}"
#KERNEL=="vd*[0-9]", ATTRS{serial}=="?*", ENV{ID_SERIAL}="$attr{serial}", \
#  SYMLINK+="disk/guestfs/$env{ID_SERIAL}%n"

-----------

- make-initrd
- chmod 644 /usr/lib64/guestfs/initramfs.x86_64.img

 initrd (appliance) готов. приступаем к тестированию.

export LIBGUESTFS_BACKEND=direct
libguestfs-test-tool
и загрузка виртуалки замерзает на этапе старта udev:
INIT: version 2.88 booting
INIT: Entering runlevel: 3
Mounting filesystem [/dev]: \x1b[72G[ \x1b[1m\x1b[32mDONE\x1b[39;49m\x1b[0;10m ]
Mounting filesystem [/proc]: \x1b[72G[
\x1b[1m\x1b[32mDONE\x1b[39;49m\x1b[0;10m ]
Mounting filesystem [/sys]: \x1b[72G[ \x1b[1m\x1b[32mDONE\x1b[39;49m\x1b[0;10m ]
Mounting filesystem [/run]: \x1b[72G[ \x1b[1m\x1b[32mDONE\x1b[39;49m\x1b[0;10m ]
Mounting filesystem [/dev/pts]: \x1b[72G[
\x1b[1m\x1b[32mDONE\x1b[39;49m\x1b[0;10m ]
Parsing cmdline arguments: \x1b[72G[ \x1b[1m\x1b[32mDONE\x1b[39;49m\x1b[0;10m ]
Creating /etc/fstab: S30fstab: Root device unspecified.
\x1b[72G[\x1b[1m\x1b[31mFAILED\x1b[39;49m\x1b[0;10m]
Starting lo interface: \x1b[72G[ \x1b[1m\x1b[32mDONE\x1b[39;49m\x1b[0;10m ]
Starting timerd service: \x1b[72G[ \x1b[1m\x1b[32mDONE\x1b[39;49m\x1b[0;10m ]
Loading modules before udev:
\x1b[72G[\x1b[1m\x1b[31mFAILED\x1b[39;49m\x1b[0;10m]
Starting udevd service:  Сигнал таймера

Вот тут я не пойму почему udev не стартует, и прошу подсказки, с чем
это может быть связано.
Хочется для начала добиться работы qemu с указанием ядра и initrd,
хоть и без guestfsd.
/usr/bin/qemu-kvm \
    -global virtio-blk-pci.scsi=off \
    -nodefconfig \
    -enable-fips \
    -nodefaults \
    -display none \
    -cpu host \
    -machine accel=kvm:tcg \
    -m 500 \
    -no-reboot \
    -rtc driftfix=slew \
    -no-hpet \
    -global kvm-pit.lost_tick_policy=discard \
    -kernel /usr/lib64/guestfs/vmlinuz.x86_64 \
    -initrd /usr/lib64/guestfs/initramfs.x86_64.img \
    -device virtio-scsi-pci,id=scsi \
    -drive file=/tmp/.private/shabalin/libguestfsrjal5E/scratch.1,cache=unsafe,format=raw,id=hd0,if=none
\
    -device scsi-hd,drive=hd0 \
    -device virtio-serial-pci \
    -serial stdio \
    -device sga \
    -chardev socket,path=/tmp/.private/shabalin/libguestfsrjal5E/guestfsd.sock,id=channel0
\
    -device virtserialport,chardev=channel0,name=org.libguestfs.channel.0 \
    -append 'panic=1 console=ttyS0 udevtimeout=6000
udev.event-timeout=6000 no_timer_check acpi=off printk.time=1
cgroup_disable=memory selinux=0 guestfs_verbose=1 TERM=xterm'


Проблемы упаковки пока тоже в отдаленном будущем.

-- 
Alexey Shabalin


Подробная информация о списке рассылки Devel