mirror of
https://github.com/linka-cloud/d2vm.git
synced 2024-11-25 17:16:25 +00:00
117 lines
2.3 KiB
Bash
Executable File
117 lines
2.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
OUT="/dev/null"
|
|
|
|
if [[ -n "$DEBUG" ]]; then
|
|
set -x
|
|
OUT="/dev/stderr"
|
|
fi
|
|
set -e
|
|
|
|
SRC=${1:-rootfs.tar}
|
|
DISK_NAME=${2:-disk0}
|
|
SIZE=${3:-10G}
|
|
|
|
BLOCK="$DISK_NAME.raw"
|
|
QCOW2="$DISK_NAME.qcow2"
|
|
MOUNTPOINT=/mnt
|
|
|
|
cleanup() {
|
|
rm -rf $BLOCK
|
|
}
|
|
|
|
make_img() {
|
|
echo "Creating raw image of size $SIZE"
|
|
fallocate -l $SIZE $BLOCK &> $OUT
|
|
(
|
|
echo n # Add a new partition
|
|
echo p # Primary partition
|
|
echo 1 # Partition number
|
|
echo # First sector (Accept default: 1)
|
|
echo # Last sector (Accept default: varies)
|
|
echo a
|
|
echo w # Write changes
|
|
) | fdisk $BLOCK &> $OUT
|
|
}
|
|
|
|
mount_img() {
|
|
echo "Mounting image"
|
|
DEVICE_ROOT=$(losetup --show -f $BLOCK)
|
|
kpartx -v -a $DEVICE_ROOT &> $OUT
|
|
DEVICE=/dev/mapper/"$(basename ${DEVICE_ROOT})p1"
|
|
mkfs.ext4 $DEVICE &> $OUT
|
|
mount $DEVICE $MOUNTPOINT
|
|
}
|
|
|
|
unmount_img() {
|
|
echo "Unmounting image"
|
|
umount $MOUNTPOINT/
|
|
kpartx -d $DEVICE_ROOT &> $OUT
|
|
losetup -d $DEVICE_ROOT &> $OUT
|
|
}
|
|
|
|
copy_rootfs() {
|
|
echo "Copying root file system"
|
|
tar -xvf $SRC -C $MOUNTPOINT &> $OUT
|
|
}
|
|
|
|
setup_rootfs() {
|
|
echo "Setting up root file system"
|
|
uuid=$(blkid -s UUID -o value $DEVICE)
|
|
|
|
mkdir -p $MOUNTPOINT/etc/
|
|
echo "UUID=$uuid / ext4 errors=remount-ro 0 1" > $MOUNTPOINT/etc/fstab
|
|
|
|
echo "nameserver 8.8.8.8" > $MOUNTPOINT/etc/resolv.conf
|
|
|
|
echo localhost > $MOUNTPOINT/etc/hostname
|
|
|
|
cat <<EOF > $MOUNTPOINT/etc/hosts
|
|
127.0.0.1 localhost
|
|
|
|
# The following lines are desirable for IPv6 capable hosts
|
|
::1 ip6-localhost ip6-loopback
|
|
fe00::0 ip6-localnet
|
|
ff00::0 ip6-mcastprefix
|
|
ff02::1 ip6-allnodes
|
|
ff02::2 ip6-allrouters
|
|
ff02::3 ip6-allhosts
|
|
EOF
|
|
|
|
rm -rf $MOUNTPOINT/usr/sbin/policy-rc.d
|
|
}
|
|
|
|
install_kernel() {
|
|
echo "Installing linux kernel"
|
|
extlinux --install $MOUNTPOINT/boot/ &> $OUT
|
|
|
|
cat <<EOF > $MOUNTPOINT/boot/syslinux.cfg
|
|
DEFAULT linux
|
|
SAY Now booting the kernel from EXTLINUX...
|
|
LABEL linux
|
|
KERNEL /boot/vmlinuz
|
|
APPEND ro root=/dev/sda1 initrd=/boot/initrd.img net.ifnames=0 console=tty0 console=ttyS0,115200n8
|
|
EOF
|
|
}
|
|
|
|
setup_mbr() {
|
|
echo "Setting up boot loader"
|
|
dd if=/usr/lib/EXTLINUX/mbr.bin of=$BLOCK bs=440 count=1 conv=notrunc &> $OUT
|
|
}
|
|
|
|
convert() {
|
|
echo "Converting image to QCOW2"
|
|
echo ""
|
|
qemu-img convert $BLOCK -O qcow2 $QCOW2
|
|
}
|
|
|
|
cleanup
|
|
make_img
|
|
mount_img
|
|
copy_rootfs
|
|
setup_rootfs
|
|
install_kernel
|
|
unmount_img
|
|
setup_mbr
|
|
convert
|