kameleon-builder 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.editorconfig +0 -0
- data/.env +63 -15
- data/.gitignore +1 -0
- data/README.rst +4 -2
- data/Vagrantfile +13 -52
- data/bin/kameleon +5 -0
- data/completion/_kameleon.zsh +18 -0
- data/completion/kameleon.bash +13 -0
- data/completion/kameleon.fish +10 -0
- data/contrib/polipo_env.sh +2 -0
- data/contrib/steps/export/save_as_g5k.yaml +63 -0
- data/contrib/steps/setup/add_to_sudoers.yaml +5 -0
- data/docs/Makefile +10 -6
- data/docs/README.md +17 -0
- data/docs/source/_static/kameleon-logo.png +0 -0
- data/docs/source/_static/kameleon-logo.xcf +0 -0
- data/docs/source/_static/kameleon-long.png +0 -0
- data/docs/source/aliases.rst +4 -2
- data/docs/source/checkpoint.rst +2 -0
- data/docs/source/commands.rst +4 -3
- data/docs/source/conf.py +15 -7
- data/docs/source/context.rst +7 -4
- data/docs/source/faq.rst +39 -1
- data/docs/source/getting_started.rst +227 -1
- data/docs/source/grid5000_tutorial.rst +110 -0
- data/docs/source/index.rst +7 -2
- data/docs/source/installation.rst +12 -4
- data/docs/source/persistent_cache.rst +34 -0
- data/docs/source/recipe.rst +23 -16
- data/docs/source/use_cases.rst +93 -0
- data/docs/source/workspace.rst +2 -0
- data/kameleon-builder.gemspec +7 -1
- data/lib/kameleon.rb +3 -6
- data/lib/kameleon/cli.rb +104 -50
- data/lib/kameleon/compat.rb +39 -0
- data/lib/kameleon/context.rb +43 -13
- data/lib/kameleon/engine.rb +118 -77
- data/lib/kameleon/environment.rb +3 -5
- data/lib/kameleon/error.rb +15 -9
- data/lib/kameleon/logger.rb +7 -4
- data/lib/kameleon/persistent_cache.rb +139 -0
- data/lib/kameleon/recipe.rb +200 -81
- data/lib/kameleon/shell.rb +51 -16
- data/omnibus/.gitignore +11 -0
- data/omnibus/.kitchen.yml +25 -0
- data/omnibus/Berksfile +9 -0
- data/omnibus/Berksfile.lock +25 -0
- data/omnibus/Gemfile +12 -0
- data/omnibus/README.md +94 -0
- data/omnibus/config/projects/kameleon.rb +23 -0
- data/omnibus/config/software/kameleon.rb +24 -0
- data/omnibus/config/software/polipo.rb +30 -0
- data/omnibus/config/software/ruby.rb +158 -0
- data/omnibus/files/mac_dmg/Resources/background.png +0 -0
- data/omnibus/files/mac_dmg/Resources/icon.png +0 -0
- data/omnibus/files/mac_pkg/Resources/background.png +0 -0
- data/omnibus/files/mac_pkg/Resources/license.html +1 -0
- data/omnibus/files/mac_pkg/Resources/welcome.html +9 -0
- data/omnibus/omnibus.rb +27 -0
- data/omnibus/package-scripts/kameleon/makeselfinst +27 -0
- data/omnibus/package-scripts/kameleon/postrm +9 -0
- data/templates/archlinux-desktop.yaml +25 -0
- data/templates/archlinux.yaml +106 -0
- data/templates/debian-testing.yaml +25 -0
- data/templates/debian7-desktop.yaml +25 -0
- data/templates/{debian-wheezy-docker.yaml → debian7-docker.yaml} +30 -16
- data/templates/debian7-g5k.yaml +97 -0
- data/templates/debian7-oar-dev.yaml +51 -0
- data/templates/debian7.yaml +128 -0
- data/templates/extend.erb +23 -0
- data/templates/fedora-rawhide.yaml +30 -0
- data/templates/fedora20-desktop.yaml +21 -0
- data/templates/fedora20.yaml +105 -0
- data/templates/{debian-wheezy-chroot.yaml → old-debian7.yaml} +51 -38
- data/templates/{aliases → steps/aliases}/defaults.yaml +37 -12
- data/templates/steps/bootstrap/archlinux/arch_bootstrap.yaml +219 -0
- data/templates/steps/bootstrap/archlinux/install_bootloader.yaml +46 -0
- data/templates/steps/bootstrap/archlinux/populate_disk.yaml +39 -0
- data/templates/steps/bootstrap/debian/debootstrap.yaml +18 -10
- data/templates/steps/bootstrap/debian/debootstrap_arm.yaml +31 -0
- data/templates/steps/bootstrap/fedora/liveos_bootstrap.yaml +123 -0
- data/templates/steps/bootstrap/g5k_reserv.yaml +70 -0
- data/templates/steps/bootstrap/initialize_disk_chroot.yaml +84 -0
- data/templates/steps/bootstrap/initialize_disk_qemu.yaml +72 -0
- data/templates/steps/bootstrap/install_bootloader.yaml +42 -0
- data/templates/steps/bootstrap/prepare_chroot.yaml +126 -0
- data/templates/steps/bootstrap/prepare_docker.yaml +19 -8
- data/templates/steps/bootstrap/prepare_qemu.yaml +47 -0
- data/templates/steps/bootstrap/start_chroot.yaml +11 -2
- data/templates/steps/bootstrap/start_docker.yaml +2 -2
- data/templates/steps/bootstrap/start_qemu.yaml +75 -0
- data/templates/steps/bootstrap/ubuntu/debootstrap.yaml +27 -0
- data/templates/steps/breakpoint.yaml +2 -0
- data/templates/{checkpoints → steps/checkpoints}/docker.yaml +0 -0
- data/templates/steps/checkpoints/qcow2.yaml +38 -0
- data/templates/steps/checkpoints/qemu.yaml +39 -0
- data/templates/steps/export/clean_appliance.yaml +7 -1
- data/templates/steps/export/compact_qcow_img.yaml +12 -0
- data/templates/steps/export/save_appliance.yaml +58 -0
- data/templates/steps/export/save_appliance_from_g5k.yaml +47 -0
- data/templates/steps/export/save_vagrant_box.yaml +29 -0
- data/templates/steps/setup/archlinux/configure_keyboard.yaml +9 -0
- data/templates/steps/setup/archlinux/configure_network.yaml +9 -0
- data/templates/steps/setup/archlinux/configure_ruby.yaml +7 -0
- data/templates/steps/setup/archlinux/configure_system.yaml +20 -0
- data/templates/steps/setup/archlinux/install_dev_tools.yaml +18 -0
- data/templates/steps/setup/archlinux/install_gnome.yaml +27 -0
- data/templates/steps/setup/archlinux/install_software.yaml +9 -0
- data/templates/steps/setup/archlinux/install_yaourt.yaml +29 -0
- data/templates/steps/setup/autologin.yaml +16 -0
- data/templates/steps/setup/create_group.yaml +12 -0
- data/templates/steps/setup/create_user.yaml +9 -10
- data/templates/steps/setup/debian/configure_apt.yaml +65 -0
- data/templates/steps/setup/debian/configure_kernel.yaml +18 -0
- data/templates/steps/setup/debian/{keyboard_config.yaml → configure_keyboard.yaml} +1 -1
- data/templates/steps/setup/debian/{network_config.yaml → configure_network.yaml} +0 -0
- data/templates/steps/setup/debian/{system_config.yaml → configure_system.yaml} +0 -0
- data/templates/steps/setup/debian/install_gnome.yaml +13 -0
- data/templates/steps/setup/debian/install_kde.yaml +13 -0
- data/templates/steps/setup/debian/install_software.yaml +2 -0
- data/templates/steps/setup/debian/oar/oar_debian_config_frontend.yaml +8 -0
- data/templates/steps/setup/debian/oar/oar_debian_config_node.yaml +5 -0
- data/templates/steps/setup/debian/oar/oar_debian_config_server.yaml +5 -0
- data/templates/steps/setup/debian/oar/oar_prereq_install.yaml +16 -0
- data/templates/steps/setup/debian/setup_vagrant_box.yaml +52 -0
- data/templates/steps/setup/debian/upgrade_system.yaml +15 -0
- data/templates/steps/setup/fedora/configure_network.yaml +30 -0
- data/templates/steps/setup/fedora/configure_system.yaml +59 -0
- data/templates/steps/setup/fedora/install_software.yaml +3 -0
- data/templates/steps/setup/fedora/update_system.yaml +10 -0
- data/templates/steps/setup/oar/oar_config_devel.yaml +21 -0
- data/templates/steps/setup/oar/oar_config_frontend.yaml +38 -0
- data/templates/steps/setup/oar/oar_config_node.yaml +4 -0
- data/templates/steps/setup/oar/oar_config_server.yaml +25 -0
- data/templates/steps/setup/oar/oar_config_system.yaml +34 -0
- data/templates/steps/setup/oar/oar_devel_prereq_install.yaml +5 -0
- data/templates/steps/setup/oar/oar_git_install.yaml +21 -0
- data/templates/steps/setup/ubuntu/configure_apt.yaml +67 -0
- data/templates/ubuntu-12.04-desktop.yaml +25 -0
- data/templates/ubuntu-12.04.yaml +128 -0
- data/templates/ubuntu-14.04-desktop.yaml +27 -0
- data/templates/ubuntu-14.04.yaml +25 -0
- data/templates/vagrant-debian7.yaml +31 -0
- data/version.txt +1 -1
- metadata +155 -28
- checksums.yaml +0 -7
- data/templates/checkpoints/qcow2.yaml +0 -44
- data/templates/fedora-docker.yaml +0 -96
- data/templates/steps/bootstrap/fedora/docker_bootstrap.yaml +0 -25
- data/templates/steps/bootstrap/fedora/yum_bootstrap.yaml +0 -22
- data/templates/steps/bootstrap/prepare_appliance_with_nbd.yaml +0 -93
- data/templates/steps/export/build_appliance_from_docker.yaml +0 -105
- data/templates/steps/export/save_appliance_from_nbd.yaml +0 -54
- data/templates/steps/setup/debian/kernel_install.yaml +0 -20
- data/templates/steps/setup/debian/software_install.yaml +0 -15
- data/templates/steps/setup/fedora/kernel_install.yaml +0 -27
- data/templates/steps/setup/fedora/software_install.yaml +0 -10
@@ -0,0 +1,123 @@
|
|
1
|
+
# # Bootstrap
|
2
|
+
- include: >
|
3
|
+
python yum rpm initscripts passwd rsyslog vim-minimal dhclient chkconfig
|
4
|
+
rootfiles policycoreutils fedora-release openssh-server net-tools nc
|
5
|
+
traceroute kernel syslinux-extlinux systemd procps-ng console-setup
|
6
|
+
bash grep coreutils findutils sed cpio cyrus-sasl file-libs gawk xz
|
7
|
+
|
8
|
+
- mirrorlist_server: mirrors.kernel.org
|
9
|
+
- mirror_distrib_path: fedora/releases/$${release}/Fedora/$$arch/os
|
10
|
+
- mirrorlist_url_rsync: $$mirrorlist_server::$$mirror_distrib_path
|
11
|
+
|
12
|
+
- download_live_os:
|
13
|
+
- check_cmd_out: rsync
|
14
|
+
- exec_out: |
|
15
|
+
if [ ! -d "$$rootfs_download_path" ]; then
|
16
|
+
if [ ! -f "./LiveOS/squashfs.img" ]; then
|
17
|
+
echo "Downloading LiveOS squashfs file system from $$mirrorlist_url_rsync ..."
|
18
|
+
rsync -avh --progress $$mirrorlist_url_rsync/LiveOS .
|
19
|
+
echo "Download of squashfs image complete."
|
20
|
+
else
|
21
|
+
echo "Using cached LiveOS squashfs file system."
|
22
|
+
fi
|
23
|
+
fi
|
24
|
+
|
25
|
+
- copy_ro_to_rw:
|
26
|
+
- exec_out: |
|
27
|
+
if [ ! -d "$$rootfs_download_path" ]; then
|
28
|
+
mkdir -p squashfs readonlyfs partial
|
29
|
+
mount -o loop ./LiveOS/squashfs.img squashfs || \
|
30
|
+
fail Mount of LiveOS squashfs image failed! You mush have squashfs support available to mount image.
|
31
|
+
mount -o loop squashfs/LiveOS/rootfs.img readonlyfs
|
32
|
+
rsync -aAHS readonlyfs/ partial/
|
33
|
+
fi
|
34
|
+
- umount_out: readonlyfs
|
35
|
+
- umount_out: squashfs
|
36
|
+
|
37
|
+
- bootstrap_partial:
|
38
|
+
- exec_out: |
|
39
|
+
if [ ! -d "$$rootfs_download_path" ]; then
|
40
|
+
mount -o bind /dev partial/dev
|
41
|
+
mount -o bind /dev/pts partial/dev/pts
|
42
|
+
mount -t proc /proc partial/proc
|
43
|
+
mount -t sysfs /sys partial/sys
|
44
|
+
test -f partial/etc/mtab || cat /proc/mounts > partial/etc/mtab
|
45
|
+
cp /etc/resolv.conf partial/etc/
|
46
|
+
rsync -av $$mirrorlist_url_rsync/Packages/r/rpm-[0-9]* $$mirrorlist_url_rsync//Packages/y/yum-[0-9]* partial
|
47
|
+
chroot partial rpm -ivh --nodeps --replacepkgs rpm-* yum-* > /dev/null
|
48
|
+
rsync -av $$mirrorlist_url_rsync/Packages/f/fedora-release-$${release}* partial
|
49
|
+
mkdir -p partial/run/install
|
50
|
+
chroot partial rpm --nodeps -ivh fedora-release-*
|
51
|
+
sed -i "s|\$basearch|$$arch|" partial/etc/yum.repos.d/*
|
52
|
+
chroot partial rpm --root /run/install --nodeps -ivh fedora-release-*
|
53
|
+
sed -i "s|\$basearch|$$arch|" partial/run/install/etc/yum.repos.d/*
|
54
|
+
chroot partial yum --installroot /run/install -y --nogpgcheck install $$include
|
55
|
+
fi
|
56
|
+
- umount_out: partial/dev/pts
|
57
|
+
- umount_out: partial/dev
|
58
|
+
- umount_out: partial/proc
|
59
|
+
- umount_out: partial/sys
|
60
|
+
|
61
|
+
- create_rootfs:
|
62
|
+
- exec_out: |
|
63
|
+
if [ ! -d "$$rootfs_download_path" ]; then
|
64
|
+
mkdir -p $$rootfs_download_path
|
65
|
+
rsync -aAX --delete --one-file-system \
|
66
|
+
--exclude '/.kameleon_timestamp' \
|
67
|
+
--exclude '/dev/*' \
|
68
|
+
--exclude '/proc/*' \
|
69
|
+
--exclude '/sys/*' \
|
70
|
+
partial/run/install/* $$rootfs_download_path
|
71
|
+
fi
|
72
|
+
|
73
|
+
- download_pxeboot_initrd:
|
74
|
+
- exec_out: |
|
75
|
+
wget -c -O $$rootfs_download_path/boot/initrd.img \
|
76
|
+
http://$$mirrorlist_server/$$mirror_distrib_path/images/pxeboot/initrd.img \
|
77
|
+
2>&1 | tail -f
|
78
|
+
|
79
|
+
- download_pxeboot_vmlinuz:
|
80
|
+
- exec_out: |
|
81
|
+
wget -c -O $$rootfs_download_path/boot/vmlinuz \
|
82
|
+
http://$$mirrorlist_server/$$mirror_distrib_path/images/pxeboot/vmlinuz \
|
83
|
+
2>&1 | tail -f
|
84
|
+
|
85
|
+
- enable_sshd_service:
|
86
|
+
- exec_out: |
|
87
|
+
chroot $$rootfs_download_path \
|
88
|
+
ln -sf \
|
89
|
+
'/usr/lib/systemd/system/sshd.service' \
|
90
|
+
'/etc/systemd/system/multi-user.target.wants/sshd.service'
|
91
|
+
|
92
|
+
- enable_dhcp_service:
|
93
|
+
- exec_out: |
|
94
|
+
echo -n 'root:root' | chroot $$rootfs_download_path chpasswd
|
95
|
+
chroot $$rootfs_download_path \
|
96
|
+
ln -sf \
|
97
|
+
'/usr/lib/systemd/system/network.service' \
|
98
|
+
'/etc/systemd/system/multi-user.target.wants/network.service'
|
99
|
+
|
100
|
+
- enable_networking:
|
101
|
+
- write_out:
|
102
|
+
- $$rootfs_download_path/etc/sysconfig/network-scripts/ifcfg-eth0
|
103
|
+
- |
|
104
|
+
DEVICE=eth0
|
105
|
+
BOOTPROTO=dhcp
|
106
|
+
ONBOOT=yes
|
107
|
+
HOSTNAME=fedora-$${release}
|
108
|
+
NM_CONTROLLED=no
|
109
|
+
TYPE=Ethernet
|
110
|
+
- write_out:
|
111
|
+
- $$rootfs_download_path/etc/sysconfig/network
|
112
|
+
- |
|
113
|
+
NETWORKING=yes
|
114
|
+
HOSTNAME=fedora-$${release}
|
115
|
+
|
116
|
+
- clean:
|
117
|
+
- on_bootstrap_clean:
|
118
|
+
- umount_out: partial/dev/pts
|
119
|
+
- umount_out: partial/dev
|
120
|
+
- umount_out: partial/proc
|
121
|
+
- umount_out: partial/sys
|
122
|
+
- umount_out: readonlyfs
|
123
|
+
- umount_out: squashfs
|
@@ -0,0 +1,70 @@
|
|
1
|
+
- create_local_ssh_config_base:
|
2
|
+
- write_local:
|
3
|
+
- $$ssh_config_file
|
4
|
+
- |
|
5
|
+
Host *
|
6
|
+
UserKnownHostsFile /dev/null
|
7
|
+
StrictHostKeyChecking no
|
8
|
+
ConnectTimeout 2
|
9
|
+
LogLevel FATAL
|
10
|
+
ForwardAgent yes
|
11
|
+
Protocol 2
|
12
|
+
ControlPath /tmp/$${kameleon_short_uuid}%r@%h:%p
|
13
|
+
ControlMaster auto
|
14
|
+
ControlPersist yes
|
15
|
+
Compression yes
|
16
|
+
Host g5kaccess
|
17
|
+
User $$g5k_user
|
18
|
+
Hostname access.grid5000.fr
|
19
|
+
Host $$g5k_site
|
20
|
+
User $$g5k_user
|
21
|
+
ProxyCommand ssh -F $$ssh_config_file g5kaccess "nc -q 1 $$g5k_site %p"
|
22
|
+
|
23
|
+
- deploy_image:
|
24
|
+
- exec_out: echo "Deploying image $$kenv with kadeploy"
|
25
|
+
- exec_out: sleep 1
|
26
|
+
- exec_out: echo "Submitting a job for deployment"
|
27
|
+
# We wait long to keep the job
|
28
|
+
# We submit a job only if there is no job already
|
29
|
+
- exec_out : |
|
30
|
+
oarstat | grep -q "$$kameleon_recipe_name" \
|
31
|
+
|| oarsub -n "$$kameleon_recipe_name" -l walltime=$$walltime -t deploy "sleep 100000"
|
32
|
+
- exec_out : |
|
33
|
+
echo -n "Waiting for the reservation to be ready"
|
34
|
+
until $(oarstat -fu $$g5k_user | grep -q "state = Running")
|
35
|
+
do
|
36
|
+
echo -n .
|
37
|
+
sleep 2
|
38
|
+
done
|
39
|
+
sleep 1
|
40
|
+
echo " ~> OK"
|
41
|
+
- exec_out: echo "Getting the machine name"
|
42
|
+
- exec_out: export machine=`oarstat -fu $$g5k_user | grep assigned_hostnames | cut -d ' ' -f 7`
|
43
|
+
- exec_out: echo "Deploying environment $$kenv on $machine"
|
44
|
+
- exec_out: kadeploy3 -e $$kenv -m $machine -k
|
45
|
+
- pipe:
|
46
|
+
- exec_out: echo $machine
|
47
|
+
- exec_local: cat >$$kameleon_cwd/g5k_machine
|
48
|
+
- exec_out: sleep 1
|
49
|
+
|
50
|
+
- create_out_ssh_config:
|
51
|
+
- write_out:
|
52
|
+
- $$out_cwd/ssh_config
|
53
|
+
- |
|
54
|
+
Host $$kameleon_recipe_name
|
55
|
+
User root
|
56
|
+
Hostname $machine
|
57
|
+
UserKnownHostsFile /dev/null
|
58
|
+
StrictHostKeyChecking no
|
59
|
+
ConnectTimeout 2
|
60
|
+
LogLevel FATAL
|
61
|
+
ForwardAgent yes
|
62
|
+
Protocol 2
|
63
|
+
|
64
|
+
- append_ssh_node_config:
|
65
|
+
- append_local:
|
66
|
+
- $$ssh_config_file
|
67
|
+
- |
|
68
|
+
Host $$kameleon_recipe_name
|
69
|
+
User root
|
70
|
+
ProxyCommand ssh -F $$ssh_config_file $$g5k_site "nc -q 1 `cat $$kameleon_cwd/g5k_machine | awk '{print $NF}'` %p"
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# Initialize disk
|
2
|
+
|
3
|
+
# this step create the appliance disk and initialize the
|
4
|
+
# checkpoint mechanism with Qemu Network Block Device (NBD)
|
5
|
+
|
6
|
+
- create_initial_image:
|
7
|
+
- check_cmd_out: qemu-img
|
8
|
+
- exec_out: mkdir -p $$kameleon_cwd/checkpoints
|
9
|
+
- exec_out: |
|
10
|
+
if [ ! -e "$$image_disk" ] ; then
|
11
|
+
qemu-img create -f qcow2 -o preallocation=metadata $$kameleon_cwd/checkpoints/base.qcow2 $$image_size
|
12
|
+
# keep a link to the last checkpoint disk
|
13
|
+
ln -sf $$kameleon_cwd/checkpoints/base.qcow2 $$image_disk
|
14
|
+
fi
|
15
|
+
|
16
|
+
- load_nbd_module:
|
17
|
+
- on_checkpoint: redo
|
18
|
+
- on_bootstrap_init:
|
19
|
+
- exec_out: |
|
20
|
+
lsmod | grep nbd >/dev/null \
|
21
|
+
|| modprobe nbd max_part=63 \
|
22
|
+
|| fail failed to load nbd module into kernel
|
23
|
+
|
24
|
+
- attach_nbd_device:
|
25
|
+
# this microstep must be skipped because it is already done by the
|
26
|
+
# checkpoint restore function
|
27
|
+
- on_checkpoint: redo
|
28
|
+
- check_cmd_out: qemu-nbd
|
29
|
+
- exec_out: echo Connecting $$image_disk to nbd device $$nbd_device
|
30
|
+
- exec_out: echo "sync" ; sync
|
31
|
+
- exec_out: qemu-nbd -d $$nbd_device
|
32
|
+
- exec_out: qemu-nbd -c $$nbd_device $(readlink $$image_disk) -n || fail nbd device $$nbd_device is unavailable
|
33
|
+
|
34
|
+
- detach_nbd_device:
|
35
|
+
# this miscrostep must be done again ensure that the nbd device is
|
36
|
+
# detached
|
37
|
+
- on_checkpoint: redo
|
38
|
+
- on_export_clean:
|
39
|
+
- exec_out: echo "sync" ; sync
|
40
|
+
- exec_out: qemu-nbd -d $$nbd_device
|
41
|
+
- exec_out: "pgrep qemu-nbd | xargs -I {} kill -9 {} || true"
|
42
|
+
|
43
|
+
- partition_disk:
|
44
|
+
- check_cmd_out: parted
|
45
|
+
- exec_out: |
|
46
|
+
echo "Partitioning disk..."
|
47
|
+
parted $${nbd_device} mklabel msdos
|
48
|
+
parted $${nbd_device} mkpart primary 0% 100%
|
49
|
+
parted $${nbd_device} set 1 boot on
|
50
|
+
- exec_out: |
|
51
|
+
echo Creating root partition...
|
52
|
+
mkfs.$$filesystem_type -q $${nbd_device}p1 || fail cannot create / ext4
|
53
|
+
|
54
|
+
- mount_mountdir:
|
55
|
+
- on_checkpoint: redo
|
56
|
+
- exec_out: mkdir -p $$rootfs
|
57
|
+
- exec_out: "echo Mounting root partition... ; mount $${nbd_device}p1 $$rootfs || fail cannot mount /"
|
58
|
+
- on_export_clean:
|
59
|
+
- exec_out: "echo try umount $$rootfs... ; mountpoint -q $$rootfs && umount -f -l $$rootfs || true"
|
60
|
+
|
61
|
+
- copy_rootfs:
|
62
|
+
- check_cmd_out: rsync
|
63
|
+
- exec_out: echo "Copying rootfs to $$rootfs..."
|
64
|
+
- exec_out: |
|
65
|
+
rsync -aAX --delete --one-file-system\
|
66
|
+
--exclude '/.kameleon_timestamp' \
|
67
|
+
--exclude '/dev/*' \
|
68
|
+
--exclude '/proc/*' \
|
69
|
+
--exclude '/sys/*' \
|
70
|
+
$$rootfs_download_path/* $$rootfs
|
71
|
+
- exec_out: echo "sync..." ; sync
|
72
|
+
|
73
|
+
- create_fstab:
|
74
|
+
- write_out:
|
75
|
+
- $$rootfs/etc/fstab
|
76
|
+
- |
|
77
|
+
# /etc/fstab: static file system information.
|
78
|
+
#
|
79
|
+
# Use 'blkid' to print the universally unique identifier for a
|
80
|
+
# nbd_device; this may be used with UUID= as a more robust way to name nbd_devices
|
81
|
+
# that works even if disks are added and removed. See fstab(5).
|
82
|
+
#
|
83
|
+
# <file system> <mount point> <type> <options> <dump> <pass>
|
84
|
+
UUID=`blkid -s UUID -o value $${nbd_device}p1` / $$filesystem_type errors=remount-ro 0 1
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# Initialize disk
|
2
|
+
|
3
|
+
# this step create the appliance disk and initialize the
|
4
|
+
# checkpoint mechanism with Qemu Network Block Device (NBD)
|
5
|
+
|
6
|
+
- create_initial_image:
|
7
|
+
- check_cmd_out: qemu-img
|
8
|
+
- exec_out: |
|
9
|
+
rm -f $$image_disk
|
10
|
+
qemu-img create -f qcow2 -o preallocation=metadata $$image_disk $$image_size
|
11
|
+
|
12
|
+
- load_nbd_module:
|
13
|
+
- on_checkpoint: redo
|
14
|
+
- on_bootstrap_init:
|
15
|
+
- exec_out: |
|
16
|
+
lsmod | grep nbd >/dev/null \
|
17
|
+
|| modprobe nbd max_part=63 \
|
18
|
+
|| fail failed to load nbd module into kernel
|
19
|
+
|
20
|
+
- attach_nbd_device:
|
21
|
+
# this microstep must be skipped because it is already done by the
|
22
|
+
# checkpoint restore function
|
23
|
+
- on_checkpoint: redo
|
24
|
+
- check_cmd_out: qemu-nbd
|
25
|
+
- exec_out: echo Connecting $$image_disk to nbd device $$nbd_device
|
26
|
+
- exec_out: qemu-nbd -c $$nbd_device $$image_disk -n || fail nbd device $$nbd_device is unavailable
|
27
|
+
|
28
|
+
- detach_nbd_device:
|
29
|
+
# this miscrostep must be done again ensure that the nbd device is
|
30
|
+
# detached
|
31
|
+
- on_checkpoint: redo
|
32
|
+
- on_bootstrap_clean:
|
33
|
+
- exec_out: echo "sync" ; sync
|
34
|
+
- exec_out: qemu-nbd -d $$nbd_device
|
35
|
+
- exec_out: "pgrep qemu-nbd | xargs -I {} kill -9 {} || true"
|
36
|
+
|
37
|
+
- partition_disk:
|
38
|
+
- check_cmd_out: parted
|
39
|
+
- exec_out: |
|
40
|
+
echo "Partitioning disk..."
|
41
|
+
parted $${nbd_device} mklabel msdos
|
42
|
+
parted $${nbd_device} mkpart primary 0% 100%
|
43
|
+
parted $${nbd_device} set 1 boot on
|
44
|
+
- exec_out: |
|
45
|
+
echo Creating root partition...
|
46
|
+
mkfs.$$filesystem_type -q $${nbd_device}p1 || fail cannot create / ext4
|
47
|
+
|
48
|
+
- mount_mountdir:
|
49
|
+
- on_checkpoint: redo
|
50
|
+
- exec_out: mkdir -p $$rootfs
|
51
|
+
- exec_out: "echo Mounting root partition... ; mount $${nbd_device}p1 $$rootfs || fail cannot mount /"
|
52
|
+
- on_bootstrap_clean:
|
53
|
+
- exec_out: "echo try umount $$rootfs... ; mountpoint -q $$rootfs && umount -f -l $$rootfs || true"
|
54
|
+
|
55
|
+
- copy_rootfs:
|
56
|
+
- check_cmd_out: rsync
|
57
|
+
- exec_out: echo "Copying rootfs to $$rootfs..."
|
58
|
+
- exec_out: rsync -aAX --exclude '/.kameleon_timestamp' $$rootfs_download_path/* $$rootfs
|
59
|
+
- exec_out: echo "sync..." ; sync
|
60
|
+
|
61
|
+
- create_fstab:
|
62
|
+
- write_out:
|
63
|
+
- $$rootfs/etc/fstab
|
64
|
+
- |
|
65
|
+
# /etc/fstab: static file system information.
|
66
|
+
#
|
67
|
+
# Use 'blkid' to print the universally unique identifier for a
|
68
|
+
# nbd_device; this may be used with UUID= as a more robust way to name nbd_devices
|
69
|
+
# that works even if disks are added and removed. See fstab(5).
|
70
|
+
#
|
71
|
+
# <file system> <mount point> <type> <options> <dump> <pass>
|
72
|
+
UUID=`blkid -s UUID -o value $${nbd_device}p1` / $$filesystem_type errors=remount-ro 0 1
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# Install extlinux bootloader
|
2
|
+
|
3
|
+
- install_bootloader:
|
4
|
+
- rescue:
|
5
|
+
- exec_out: LC_ALL=POSIX chroot $$rootfs bash -c "command -V extlinux 2> /dev/null"
|
6
|
+
- breakpoint: "extlinux is missing"
|
7
|
+
- exec_out: LC_ALL=POSIX chroot $$rootfs extlinux --install /boot/extlinux 2>&1
|
8
|
+
- exec_out: |
|
9
|
+
MBR_PATH=
|
10
|
+
PATHS=("$$rootfs/usr/share/syslinux/mbr.bin"
|
11
|
+
"$$rootfs/usr/lib/bios/syslinux/mbr.bin"
|
12
|
+
"$$rootfs/usr/lib/syslinux/bios/mbr.bin"
|
13
|
+
"$$rootfs/usr/lib/extlinux/mbr.bin"
|
14
|
+
"$$rootfs/usr/lib/syslinux/mbr.bin")
|
15
|
+
for element in "${PATHS[@]}"
|
16
|
+
do
|
17
|
+
if [ -f "$element" ]; then
|
18
|
+
MBR_PATH="$element"
|
19
|
+
break
|
20
|
+
fi
|
21
|
+
done
|
22
|
+
if [ "$MBR_PATH" == "" ]; then
|
23
|
+
fail "unable to locate the extlinux mbr"
|
24
|
+
else
|
25
|
+
dd if="$MBR_PATH" of="$$nbd_device" bs=440 2>&1
|
26
|
+
fi
|
27
|
+
- exec_out: echo " sync..." ; sync
|
28
|
+
- write_out:
|
29
|
+
- $$rootfs/boot/extlinux/extlinux.conf
|
30
|
+
- |
|
31
|
+
default linux
|
32
|
+
timeout 1
|
33
|
+
|
34
|
+
label linux
|
35
|
+
kernel ../`basename $$rootfs/boot/vmlinuz*`
|
36
|
+
append initrd=../`basename $$rootfs/boot/init*` root=UUID=`blkid -s UUID -o value $${nbd_device}p1` ro
|
37
|
+
- exec_out: echo " sync..." ; sync
|
38
|
+
- on_bootstrap_clean:
|
39
|
+
- exec_out: |
|
40
|
+
dir=$$rootfs/var/lib/os-prober/mount
|
41
|
+
test ! -d "$dir" || (umount -f -l "$dir" && rmdir "$dir")
|
42
|
+
|
@@ -0,0 +1,126 @@
|
|
1
|
+
# create the appliance disk and initialize the checkpoint mechanism with Qemu
|
2
|
+
# Network Block Device (NBD)
|
3
|
+
|
4
|
+
- create_initial_image:
|
5
|
+
- check_cmd_out: qemu-img
|
6
|
+
- exec_out: mkdir -p checkpoints
|
7
|
+
- exec_out: |
|
8
|
+
if [ $$consider_checkpoint = true ]; then
|
9
|
+
if [ ! -e "$$image_disk" ] ; then
|
10
|
+
qemu-img create -f qcow2 checkpoints/base_$$image_disk $$image_size
|
11
|
+
# keep a link to the last checkpoint disk
|
12
|
+
ln -sf checkpoints/base_$$image_disk $$image_disk
|
13
|
+
fi
|
14
|
+
else
|
15
|
+
qemu-img create -f qcow2 $$image_disk $$image_size
|
16
|
+
fi
|
17
|
+
|
18
|
+
- load_nbd_module:
|
19
|
+
- on_checkpoint: redo
|
20
|
+
- on_bootstrap_init:
|
21
|
+
- exec_out: |
|
22
|
+
lsmod | grep nbd >/dev/null \
|
23
|
+
|| modprobe nbd max_part=63 \
|
24
|
+
|| fail failed to load nbd module into kernel
|
25
|
+
|
26
|
+
- attach_nbd_device:
|
27
|
+
# this microstep must be skipped because it is already done by the
|
28
|
+
# checkpoint restore function
|
29
|
+
- on_checkpoint: redo
|
30
|
+
- check_cmd_out: qemu-nbd
|
31
|
+
- exec_out: echo Connecting $$image_disk to nbd device $$nbd_device
|
32
|
+
- exec_out: echo "sync" ; sync
|
33
|
+
- exec_out: qemu-nbd -d $$nbd_device
|
34
|
+
- exec_out: |
|
35
|
+
if [ $$consider_checkpoint = true ]; then
|
36
|
+
REAL_PATH="$(readlink $$image_disk)"
|
37
|
+
else
|
38
|
+
REAL_PATH="$$image_disk"
|
39
|
+
fi
|
40
|
+
qemu-nbd -c $$nbd_device $REAL_PATH -n || fail nbd device $$nbd_device is unavailable
|
41
|
+
|
42
|
+
- detach_nbd_device:
|
43
|
+
# this miscrostep must be done again ensure that the nbd device is
|
44
|
+
# detached
|
45
|
+
- on_checkpoint: redo
|
46
|
+
- on_export_clean:
|
47
|
+
- exec_out: echo "sync" ; sync
|
48
|
+
- exec_out: qemu-nbd -d $$nbd_device
|
49
|
+
- exec_out: "pgrep qemu-nbd | xargs -I {} kill -9 {} || true"
|
50
|
+
|
51
|
+
- partition_disk:
|
52
|
+
- check_cmd_out: parted
|
53
|
+
- exec_out: |
|
54
|
+
echo "Partitioning disk..."
|
55
|
+
parted $${nbd_device} mklabel msdos
|
56
|
+
parted $${nbd_device} mkpart primary 0% 100%
|
57
|
+
parted $${nbd_device} set 1 boot on
|
58
|
+
- exec_out: |
|
59
|
+
echo Creating root partition...
|
60
|
+
mkfs.$$filesystem_type -q $${nbd_device}p1 || fail cannot create / ext4
|
61
|
+
|
62
|
+
- mount_rootfs:
|
63
|
+
- exec_out: mkdir -p $$rootfs
|
64
|
+
- exec_out: "echo Mounting root partition... ; mount $${nbd_device}p1 $$rootfs || fail cannot mount /"
|
65
|
+
- on_clean:
|
66
|
+
- exec_out: "echo try umount $$rootfs... ; mountpoint -q $$rootfs && umount -f -l $$rootfs || true"
|
67
|
+
|
68
|
+
- copy_rootfs:
|
69
|
+
- check_cmd_out: rsync
|
70
|
+
- exec_out: echo "Copying rootfs to $$rootfs..."
|
71
|
+
- exec_out: rsync -aAX --exclude '/.kameleon_timestamp' $$rootfs_partial/* $$rootfs
|
72
|
+
- exec_out: echo "sync..." ; sync
|
73
|
+
|
74
|
+
- create_fstab:
|
75
|
+
- write_out:
|
76
|
+
- $$rootfs/etc/fstab
|
77
|
+
- |
|
78
|
+
# /etc/fstab: static file system information.
|
79
|
+
#
|
80
|
+
# Use 'blkid' to print the universally unique identifier for a
|
81
|
+
# device; this may be used with UUID= as a more robust way to name devices
|
82
|
+
# that works even if disks are added and removed. See fstab(5).
|
83
|
+
#
|
84
|
+
# <file system> <mount point> <type> <options> <dump> <pass>
|
85
|
+
UUID=`blkid -s UUID -o value $${nbd_device}p1` / $$filesystem_type errors=remount-ro 0 1
|
86
|
+
|
87
|
+
- mount_chroot:
|
88
|
+
- check_cmd_out: chroot
|
89
|
+
- exec_out: mount -o bind /dev $$rootfs/dev
|
90
|
+
- exec_out: mount -o bind /dev/pts $$rootfs/dev/pts
|
91
|
+
- exec_out: mount -t proc /proc $$rootfs/proc
|
92
|
+
- exec_out: mount -t sysfs /sys $$rootfs/sys
|
93
|
+
- exec_out: test -f $$rootfs/etc/mtab || cat /proc/mounts > $$rootfs/etc/mtab
|
94
|
+
|
95
|
+
- umount_chroot:
|
96
|
+
- on_clean:
|
97
|
+
- exec_out: echo try umount $$rootfs/sys... ; mountpoint -q $$rootfs/sys && umount -f -l $$rootfs/sys || true
|
98
|
+
- exec_out: echo try umount $$rootfs/proc... ; mountpoint -q $$rootfs/proc && umount -f -l $$rootfs/proc || true
|
99
|
+
- exec_out: echo try umount $$rootfs/dev/pts... ; mountpoint -q $$rootfs/dev/pts && umount -f -l $$rootfs/dev/pts || true
|
100
|
+
- exec_out: echo try umount $$rootfs/dev... ; mountpoint -q $$rootfs/dev && umount -f -l $$rootfs/dev || true
|
101
|
+
|
102
|
+
- configure_sshd:
|
103
|
+
- exec_out: echo -e 'y\n' | ssh-keygen -q -t dsa -f $$insecure_ssh_key -N ''
|
104
|
+
- exec_out: cat $$insecure_ssh_key
|
105
|
+
- exec_out: chroot $$rootfs mkdir -p /root/.ssh
|
106
|
+
- exec_out: |
|
107
|
+
cat $${insecure_ssh_key}.pub | tee -a $$rootfs/root/.ssh/authorized_keys
|
108
|
+
- write_out:
|
109
|
+
- $$ssh_config_file
|
110
|
+
- |
|
111
|
+
Host $$kameleon_recipe_name
|
112
|
+
HostName 127.0.0.1
|
113
|
+
Port $${qemu_ssh_port}
|
114
|
+
User root
|
115
|
+
IdentityFile $$insecure_ssh_key
|
116
|
+
UserKnownHostsFile /dev/null
|
117
|
+
StrictHostKeyChecking no
|
118
|
+
PasswordAuthentication no
|
119
|
+
IdentitiesOnly yes
|
120
|
+
LogLevel FATAL
|
121
|
+
ForwardAgent yes
|
122
|
+
ControlPath $(pwd)/master-%l-%r@%h:%p
|
123
|
+
ControlMaster auto
|
124
|
+
ControlPersist yes
|
125
|
+
Compression yes
|
126
|
+
Protocol 2
|