Starting qemu-image creation.
This commit is contained in:
parent
f2fada8eae
commit
0438ade83a
1
build_packages
Normal file
1
build_packages
Normal file
@ -0,0 +1 @@
|
||||
syslinux
|
75
generate_qemu_img.pl
Normal file
75
generate_qemu_img.pl
Normal file
@ -0,0 +1,75 @@
|
||||
#!/usr/bin/env perl
|
||||
|
||||
use v5.36.0;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use utf8;
|
||||
|
||||
use Path::Tiny;
|
||||
use lib path(__FILE__)->parent->child('lib') . '';
|
||||
|
||||
use BaseUtils;
|
||||
|
||||
my $utils = BaseUtils->new;
|
||||
|
||||
main();
|
||||
|
||||
sub main() {
|
||||
die 'Must be superuser.' if $< != 0;
|
||||
my $source_dir = shift @ARGV or die 'No source dir passed.';
|
||||
$source_dir = path $source_dir;
|
||||
my $dest_img = shift @ARGV // 'gentoo.qcow2';
|
||||
if (-e $dest_img) {
|
||||
die "Image $dest_img already exists.";
|
||||
}
|
||||
$dest_img = path $dest_img;
|
||||
my $size_img = shift @ARGV // 1000;
|
||||
umountQemuNbd();
|
||||
modprobeNbd();
|
||||
createQemuImage($dest_img, $size_img);
|
||||
mountQemuNbd($dest_img);
|
||||
createPartitionTable();
|
||||
}
|
||||
|
||||
sub createPartitionTable {
|
||||
open my $fh, "|-", 'fdisk', '/dev/nbd1';
|
||||
print $fh <<'EOF';
|
||||
g
|
||||
n
|
||||
|
||||
|
||||
+20M
|
||||
t
|
||||
1
|
||||
n
|
||||
|
||||
|
||||
|
||||
w
|
||||
EOF
|
||||
close $fh;
|
||||
}
|
||||
|
||||
sub createQemuImage($dest_img, $size_img) {
|
||||
my $return_code = system 'qemu-img', 'create', '-f', 'qcow2', $dest_img, $size_img.'M';
|
||||
if ($return_code != 0) {
|
||||
die 'Unable to create qemu-img.';
|
||||
}
|
||||
}
|
||||
|
||||
sub modprobeNbd {
|
||||
system 'rmmod', '-f', 'nbd';
|
||||
system 'modprobe', 'nbd';
|
||||
}
|
||||
|
||||
sub mountQemuNbd($dest_img) {
|
||||
my $return_code = system 'qemu-nbd', '--connect=/dev/nbd1', $dest_img;
|
||||
if ($return_code != 0) {
|
||||
die 'Unable to mount qemu-nbd.';
|
||||
}
|
||||
}
|
||||
|
||||
sub umountQemuNbd {
|
||||
system 'qemu-nbd', '--disconnect', '/dev/nbd1';
|
||||
}
|
@ -24,10 +24,34 @@ sub main() {
|
||||
$utils->createBasicMountsChroot($target_dir);
|
||||
populateDirectory($destination_dir);
|
||||
my $mnt_gentoo = $target_dir->child('mnt/gentoo');
|
||||
$utils->createBasicMountsChroot($mnt_gentoo);
|
||||
populateDirectory($mnt_gentoo);
|
||||
$utils->mountRbind($destination_dir, $mnt_gentoo);
|
||||
my $packages = $utils->readPackagesToInstall();
|
||||
$utils->execChroot($target_dir, 'emerge', '--root', '/mnt/gentoo', '--noreplace', '-K', @$packages);
|
||||
$utils->execChroot($mnt_gentoo, 'rc-update add nginx default');
|
||||
_installEfiSyslinux($target_dir, $mnt_gentoo);
|
||||
}
|
||||
|
||||
sub _installEfiSyslinux($target_dir, $mnt_gentoo) {
|
||||
my @files = grep { -f $_ } $target_dir->child('usr/share/syslinux/efi64')->children;
|
||||
my $syslinux_dir = $mnt_gentoo->child('boot/efi/EFI/BOOT');
|
||||
$syslinux_dir->mkpath;
|
||||
for my $file (@files) {
|
||||
if ($file =~ /\.efi$/i) {
|
||||
my $return_code = system 'cp', '-v', $file, $syslinux_dir->child('BOOTx64.EFI');
|
||||
_errIfSyslinuxFail($return_code);
|
||||
next;
|
||||
}
|
||||
my $return_code = system 'cp', '-v', @files, $syslinux_dir;
|
||||
_errIfSyslinuxFail($return_code);
|
||||
}
|
||||
}
|
||||
|
||||
sub _errIfSyslinuxFail($return_code) {
|
||||
if ($return_code != 0) {
|
||||
die 'Unable to install syslinux EFI files.';
|
||||
}
|
||||
}
|
||||
|
||||
sub populateDirectory($dir) {
|
||||
|
@ -76,11 +76,26 @@ sub readPackagesToInstall {
|
||||
return \@packages;
|
||||
}
|
||||
|
||||
sub readBuildPackagesToInstall {
|
||||
my @packages;
|
||||
open my $fh, '<', path(__FILE__)->parent->parent->child('build_packages');
|
||||
while ( my $line = <$fh> ) {
|
||||
chomp $line;
|
||||
push @packages, $line;
|
||||
}
|
||||
close $fh;
|
||||
return \@packages;
|
||||
}
|
||||
|
||||
sub createBasicMountsChroot ($self, $target) {
|
||||
my $dest_proc = $target->child('proc');
|
||||
my $dest_dev = $target->child('dev');
|
||||
my $dest_sys = $target->child('sys');
|
||||
|
||||
$dest_proc->mkpath;
|
||||
$dest_dev->mkpath;
|
||||
$dest_sys->mkpath;
|
||||
|
||||
$self->mountType( 'proc', $dest_proc );
|
||||
$self->mountType( 'sysfs', $dest_sys );
|
||||
$self->mountRbind( '/dev', $dest_dev );
|
||||
|
@ -8,8 +8,10 @@ CXXFLAGS="${COMMON_FLAGS}"
|
||||
FCFLAGS="${COMMON_FLAGS}"
|
||||
FFLAGS="${COMMON_FLAGS}"
|
||||
MAKEOPTS="-j12"
|
||||
FEATURES="buildpkg"
|
||||
USE="-ncurses"
|
||||
FEATURES="buildpkg nodoc noman -nostrip"
|
||||
LINGUAS="en"
|
||||
L10N="en-GB"
|
||||
USE="-ncurses -doc"
|
||||
|
||||
# NOTE: This stage was built with the bindist Use flag enabled
|
||||
|
||||
|
@ -28,6 +28,7 @@ sub main {
|
||||
my $zz_use = path('zz-use');
|
||||
|
||||
my $packages = $utils->readPackagesToInstall();
|
||||
my $build_packages = $utils->readBuildPackagesToInstall();
|
||||
_checkValidSystem($target_dir);
|
||||
|
||||
_installMakeConf( $target_dir, $make_conf );
|
||||
@ -38,22 +39,20 @@ sub main {
|
||||
$utils->createBasicMountsChroot($target_dir);
|
||||
_webrsync($target_dir);
|
||||
_removePerlCleanerDep($target_dir);
|
||||
if ( $rebuild_bin ) {
|
||||
_rebuildBinaries($target_dir);
|
||||
}
|
||||
_updateSystem($target_dir);
|
||||
_depclean($target_dir);
|
||||
_installNeededPackages( $target_dir, $packages );
|
||||
_installNeededPackages( $target_dir, $packages, $build_packages, $rebuild_bin );
|
||||
}
|
||||
|
||||
sub _removePerlCleanerDep($target) {
|
||||
sub _removePerlCleanerDep ($target) {
|
||||
my $path = 'var/db/repos/gentoo/dev-lang/perl';
|
||||
my $perl_ebuild_dir = $target->child($path);
|
||||
for my $file ($perl_ebuild_dir->children) {
|
||||
next if ! -f $file;
|
||||
for my $file ( $perl_ebuild_dir->children ) {
|
||||
next if !-f $file;
|
||||
next if $file !~ /\.ebuild$/;
|
||||
system 'sed', '-i', '/perl-cleaner/d', $file;
|
||||
$utils->execChroot($target, 'ebuild', "/$path/@{[$file->basename]}", 'manifest');
|
||||
$utils->execChroot( $target, 'ebuild', "/$path/@{[$file->basename]}",
|
||||
'manifest' );
|
||||
}
|
||||
}
|
||||
|
||||
@ -83,15 +82,14 @@ sub _rebuildBinaries ($target) {
|
||||
}
|
||||
}
|
||||
|
||||
sub _installNeededPackages ( $target, $packages ) {
|
||||
sub _installNeededPackages ( $target, $packages, $build_packages, $rebuild_bin ) {
|
||||
my $return_code =
|
||||
$utils->execChroot( $target, 'emerge', '--noreplace', @$packages );
|
||||
$utils->execChroot( $target, 'emerge', ( $rebuild_bin ? ('-e') : ('--noreplace', ) ), @$packages, @$build_packages );
|
||||
if ( $return_code != 0 ) {
|
||||
die 'Unable to install needed packages.';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
sub _webrsync ($target) {
|
||||
my $return_code = $utils->execChroot( $target, 'emerge-webrsync' );
|
||||
if ( $return_code != 0 ) {
|
||||
|
Loading…
Reference in New Issue
Block a user