tests: Split images -> tests/data + tests/guests
[libguestfs.git] / tests / guests / guest-aux / make-fedora-img.pl
1 #!/usr/bin/perl
2 # libguestfs
3 # Copyright (C) 2010-2011 Red Hat Inc.
4 #
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 2 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
19 # Make a standard test image which is used by all the tools test
20 # scripts.  This test image is supposed to look like a Fedora
21 # installation, or at least enough of one to fool the inspection API
22 # heuristics.
23
24 use strict;
25 use warnings;
26
27 use Sys::Guestfs;
28 use File::Temp;
29
30 my @images;
31 my $g = Sys::Guestfs->new();
32
33 my $bootdev;
34 my $rootdev;
35
36 foreach ('LAYOUT', 'SRCDIR') {
37   defined($ENV{$_}) or die "Missing environment variable: $_";
38 }
39
40 if ($ENV{LAYOUT} eq 'partitions') {
41   push (@images, 'fedora.img.tmp');
42
43   open(my $fstab, '>', 'fstab.tmp') or die;
44   print $fstab <<EOF;
45 LABEL=BOOT /boot ext2 default 0 0
46 LABEL=ROOT / ext2 default 0 0
47 EOF
48   close($fstab) or die;
49
50   $bootdev = '/dev/sda1';
51   $rootdev = '/dev/sda2';
52
53   open(my $img, '>', 'fedora.img.tmp') or die;
54   truncate($img, 512*1024*1024) or die;
55   close($img) or die;
56
57   $g->add_drive('fedora.img.tmp');
58   $g->launch();
59
60   $g->part_init('/dev/sda', 'mbr');
61   $g->part_add('/dev/sda', 'p', 64, 524287);
62   $g->part_add('/dev/sda', 'p', 524288, -64);
63 }
64
65 elsif ($ENV{LAYOUT} eq 'partitions-md') {
66   push(@images, 'fedora-md1.img.tmp', 'fedora-md2.img.tmp');
67
68   open(my $fstab, '>', 'fstab.tmp') or die;
69   print $fstab <<EOF;
70 /dev/md0 /boot ext2 default 0 0
71 LABEL=ROOT / ext2 default 0 0
72 EOF
73   close($fstab) or die;
74
75   $bootdev = '/dev/md/boot';
76   $rootdev = '/dev/md/root';
77
78   foreach my $img (@images) {
79     open(my $fh, '>', $img) or die;
80     truncate($fh, 512*1024*1024) or die;
81     close($fh) or die;
82
83     $g->add_drive($img);
84   }
85
86   $g->launch();
87
88   # Format the disks.
89   foreach ('a', 'b') {
90     $g->part_init("/dev/sd$_", 'mbr');
91     $g->part_add("/dev/sd$_", 'p', 64, 524287);
92     $g->part_add("/dev/sd$_", 'p', 524288, -64);
93   }
94
95   $g->md_create('boot', ['/dev/sda1', '/dev/sdb1']);
96   $g->md_create('root', ['/dev/sda2', '/dev/sdb2']);
97
98   open(my $mdadm, '>', 'mdadm.tmp') or die;
99   print $mdadm <<EOF;
100 MAILADDR root
101 AUTO +imsm +1.x -all
102 EOF
103
104   my $i = 0;
105   foreach ('boot', 'root') {
106     my %detail = $g->md_detail("/dev/md/$_");
107     print $mdadm "ARRAY /dev/md$i level=raid1 num-devices=2 UUID=",
108                  $detail{uuid}, "\n";
109     $i++;
110   }
111
112   close($mdadm) or die;
113 }
114
115 else {
116   print STDERR "$0: Unknown LAYOUT: ",$ENV{LAYOUT},"\n";
117   exit 1;
118 }
119
120 $g->pvcreate($rootdev);
121 $g->vgcreate('VG', [$rootdev]);
122 $g->lvcreate('Root', 'VG', 32);
123 $g->lvcreate('LV1', 'VG', 32);
124 $g->lvcreate('LV2', 'VG', 32);
125 $g->lvcreate('LV3', 'VG', 64);
126
127 # Phony /boot filesystem
128 $g->mkfs_opts('ext2', $bootdev, blocksize => 4096);
129 $g->set_e2label($bootdev, 'BOOT');
130 $g->set_e2uuid($bootdev, '01234567-0123-0123-0123-012345678901');
131
132 # Phony root filesystem.
133 $g->mkfs_opts('ext2', '/dev/VG/Root', blocksize => 4096);
134 $g->set_e2label('/dev/VG/Root', 'ROOT');
135 $g->set_e2uuid('/dev/VG/Root', '01234567-0123-0123-0123-012345678902');
136
137 # Enough to fool inspection API.
138 $g->mount_options('', '/dev/VG/Root', '/');
139 $g->mkdir('/boot');
140 $g->mount_options('', $bootdev, '/boot');
141 $g->mkdir('/bin');
142 $g->mkdir('/etc');
143 $g->mkdir('/etc/sysconfig');
144 $g->mkdir('/usr');
145 $g->mkdir_p('/var/lib/rpm');
146
147 $g->upload('fstab.tmp', '/etc/fstab');
148 $g->write('/etc/redhat-release', 'Fedora release 14 (Phony)');
149 $g->write('/etc/fedora-release', 'Fedora release 14 (Phony)');
150 $g->write('/etc/sysconfig/network', 'HOSTNAME=fedora.invalid');
151
152 if (-f 'mdadm.tmp') {
153   $g->upload('mdadm.tmp', '/etc/mdadm.conf');
154   unlink('mdadm.tmp') or die;
155 }
156
157 $g->upload('guest-aux/fedora-name.db', '/var/lib/rpm/Name');
158 $g->upload('guest-aux/fedora-packages.db', '/var/lib/rpm/Packages');
159
160 $g->upload($ENV{SRCDIR}.'/../data/bin-x86_64-dynamic', '/bin/ls');
161
162 $g->mkdir('/boot/grub');
163 $g->touch('/boot/grub/grub.conf');
164
165 # Test files.
166 $g->write('/etc/test1', 'abcdefg');
167 $g->write('/etc/test2', '');
168 $g->write('/etc/test3',
169 'a
170 b
171 c
172 d
173 e
174 f
175 ');
176 $g->write('/bin/test1', 'abcdefg');
177 $g->write('/bin/test2', 'zxcvbnm');
178 $g->write('/bin/test3', '1234567');
179 $g->write('/bin/test4', '');
180 $g->ln_s('/bin/test1', '/bin/test5');
181 $g->mkfifo(0777, '/bin/test6');
182 $g->mknod(0777, 10, 10, '/bin/test7');
183
184 # Other filesystems.
185 # Note that these should be empty, for testing virt-df.
186 $g->mkfs_opts('ext2', '/dev/VG/LV1', blocksize => 4096);
187 $g->mkfs_opts('ext2', '/dev/VG/LV2', blocksize => 1024);
188 $g->mkfs_opts('ext2', '/dev/VG/LV3', blocksize => 2048);
189
190 # Cleanup
191 unlink('fstab.tmp') or die;
192 foreach my $img (@images) {
193   $img =~ /^(.*)\.tmp$/ or die;
194   rename($img, $1) or die;
195 }