On 2/22/19 3:07 AM, Richard W.M. Jones wrote:
From: "Richard W.M. Jones" <rjones(a)redhat.com>
This plugin allows you to create a complete ext2, ext3 or ext4
filesystem in a GPT partitioned disk image. This can be attached as a
disk to a Linux virtual machine. It is implemented using e2fsprogs
mke2fs ā-dā option thus allowing the implementation to be very small
and simple, with all the hard work done by mke2fs.
Although there is some overlap with nbdkit-iso-plugin and
nbdkit-floppy-plugin, the implementations and use cases of all three
+static int64_t
+estimate_size (void)
+{
+ r = pclose (fp);
+ if (r == -1) {
+ nbdkit_error ("pclose: %m");
+ free (line);
+ return -1;
+ }
+ if (WIFEXITED (r) && WEXITSTATUS (r) != 0) {
+ nbdkit_error ("du command failed with exit code %d", WEXITSTATUS (r));
+ return -1;
+ }
+
Doesn't cover if the process died due to signal.
+static int
+mke2fs (const char *filename)
+{
+ /* Run the command. */
+ nbdkit_debug ("%s", command);
+ r = system (command);
+ free (command);
+
+ if (WIFEXITED (r) && WEXITSTATUS (r) != 0) {
+ nbdkit_error ("mke2fs command failed with exit code %d", WEXITSTATUS
(r));
+ return -1;
+ }
+ else if (WIFSIGNALED (r)) {
+ nbdkit_error ("mke2fs command was killed by signal %d", WTERMSIG (r));
+ return -1;
+ }
+ else if (WIFSTOPPED (r)) {
+ nbdkit_error ("mke2fs command was stopped by signal %d", WSTOPSIG (r));
+ return -1;
+ }
+
WIFSTOPPED() branch is unreachable.
+=item nbdkit --filter=cow linuxdisk /path/to/directory
+
+Add a writable overlay (see L<nbdkit-cow-filter(1)>, allowing the disk
+to be written by the client. B<Multiple clients must not be allowed
+to connect at the same time> (even if they all mount it read-only) as
+this will cause disk corruption.
Not a cause for changing any of the wording, but just to make sure I
understand: even when a filesystem is mounted read-only, the kernel may
still write to the underlying block device (such as fsck or journal
updates), and THESE writes must only be done by a single writer, hence
allowing multiple writers to a cow wrapper around the read-only file
system indeed risks races where one writer corrupts another.
+=item Create a minimal virtual appliance
+
+This creates and boots a minimal L<busybox(1)>-based virtual
+appliance. This assumes that your kernel (F</boot/vmlinuz>) contains
+the ext2 or ext4 driver compiled in, but most Linux distro kernels
+have that.
+
+ mkdir root root/bin root/dev root/proc root/sbin root/sys
+ mkdir root/usr root/usr/bin root/usr/sbin
Worth 'mkdir -p' in this example?
+ sudo mknod root/dev/console c 5 1
+ cp /sbin/busybox root/sbin/
+ ln root/sbin/busybox root/sbin/init
+ ln root/sbin/busybox root/bin/ls
+ ln root/sbin/busybox root/bin/sh
+ nbdkit -U - linuxdisk root --run '
+ qemu-kvm -display none -kernel /boot/vmlinuz -drive
file=nbd:unix:$unixsocket,snapshot=on -append "console=ttyS0 root=/dev/sda1 rw"
-serial stdio
+ '
+
+You can drop any extra files you need into the F<root/> directory and
+they will be copied into the appliance before boot. After booting
+type these commands to complete the environmental setup:
+
+ /sbin/busybox --install
+ mount -t proc proc /proc
+ mount -t sysfs sys /sys
Pretty cool!
I think you're ready to go, with minor tweaks to child process status
handling.
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3226
Virtualization:
qemu.org |
libvirt.org