You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
347 lines
8.8 KiB
347 lines
8.8 KiB
#!/bin/bash
|
|
|
|
set -eu
|
|
|
|
|
|
distId() {
|
|
echo $1 |cut -d '/' -f 1
|
|
}
|
|
|
|
dist2codename() {
|
|
echo $1 |cut -d '/' -f 2
|
|
}
|
|
|
|
dist2filename() {
|
|
local id=$(distId $1)
|
|
local codename=$(dist2codename $1)
|
|
|
|
id=$(echo -n $id | cut -c 1 | tr '[[:lower:]]' '[[:upper:]]'; echo $id | cut -c 2-)
|
|
codename=$(echo -n $codename | cut -c 1 | tr '[[:lower:]]' '[[:upper:]]'; echo $codename | cut -c 2-)
|
|
|
|
echo $id$codename | tr -d ' '
|
|
}
|
|
|
|
FILENAME=$(dist2filename $DIST)
|
|
|
|
set -x
|
|
SCRIPT_BASE=~/vdn-bullseye/files/$FILENAME-base.sh
|
|
IMG_NAME=~/vdn-bullseye/files/$FILENAME-base.disk
|
|
|
|
exit 0
|
|
|
|
|
|
cat << EOF > /tmp/bootstrap/config
|
|
|
|
ROOT_PASSWD='iut*'
|
|
TEST_PASSWD='iut*'
|
|
|
|
|
|
ID=\$(echo \$DIST|cut -d '/' -f 1)
|
|
VERSION_CODENAME=\$(echo \$DIST|cut -d '/' -f 2)
|
|
|
|
|
|
KVERS=$(uname -r)
|
|
EOF
|
|
|
|
set -a
|
|
. /tmp/bootstrap/config
|
|
set +a
|
|
|
|
error() {
|
|
echo $@ >&2
|
|
exit 1
|
|
}
|
|
|
|
|
|
link() {
|
|
ls -l $1 | cut -d '>' -f 2- | cut -d ' ' -f 2
|
|
}
|
|
|
|
injectFileAndLink() {
|
|
local b=$(basename $1)
|
|
local d=$(dirname $1)
|
|
local l
|
|
|
|
#echo "--> $1"
|
|
|
|
[ ! -d $DST/$d ] && mkdir -p $DST/$d
|
|
[ ! -e $DST/$1 ] && {
|
|
#echo "cp $1 $DST/$1"
|
|
cp -a $1 $DST/$1
|
|
}
|
|
|
|
|
|
if [ -L $1 ]; then
|
|
l=$(link $1)
|
|
|
|
# Absolute link
|
|
if ! echo $l | grep -q '^/'; then
|
|
l=$d/$l
|
|
fi
|
|
|
|
injectFileAndLink $l
|
|
fi
|
|
}
|
|
|
|
injectDepends() {
|
|
|
|
local b d l ld
|
|
|
|
#echo "deps : $1"
|
|
|
|
! file $1 | grep -q 'dynamically linked' && return
|
|
|
|
# Dynmamic linker
|
|
|
|
l=$(ldd $1 | grep -v '=>' | grep ld-linux | sed -re 's/^[[:space:]]*//' | cut -d ' ' -f 1)
|
|
|
|
#echo " $l"
|
|
|
|
injectFileAndLink $l
|
|
|
|
# Libraries
|
|
|
|
for l in $(ldd $1 | grep '=>' | cut -d '>' -f 2 | cut -d ' ' -f 2); do
|
|
#echo " -> $l"
|
|
injectFileAndLink $l
|
|
done
|
|
}
|
|
|
|
injectCommandWithDepends() {
|
|
local f=$1
|
|
|
|
if ! echo $1 | grep -q '/'; then
|
|
f=$(whereis -b -B $SEARCH_DIRS -f $1 | cut -d ' ' -f 2)
|
|
fi
|
|
|
|
echo "*** $f"
|
|
|
|
[ -z "$f" ] && error "Command $f not found in $SEARCH_DIRS !"
|
|
|
|
injectFileAndLink $f
|
|
injectDepends $f
|
|
|
|
if [ -L $f ]; then
|
|
f=$(link $f)
|
|
injectCommandWithDepends $f
|
|
fi
|
|
}
|
|
|
|
|
|
|
|
[ -n "$KVERS" ] || { error "KVERS is empty !?! "; }
|
|
|
|
LOCAL_KERNEL=$(ls /boot/vmlinuz*$KVERS | head -n 1)
|
|
|
|
[ -n "$LOCAL_KERNEL" ] || { error "No kernel found in /boot for $KVERS"; }
|
|
|
|
LOCAL_INITRD=$(ls /boot/initrd*$KVERS | head -n 1)
|
|
|
|
[ -n "$LOCAL_INITRD" ] || { error "No initrd found in /boot for $KVERS"; }
|
|
|
|
FORMAT=$(file $LOCAL_INITRD)
|
|
case "$FORMAT" in
|
|
*cpio*) FORMAT=asciCpio;;
|
|
*Zstandard*) FORMAT=zStandard;;
|
|
*) echo "Unknown initrd format ($FORMAT)" >&2
|
|
exit 1
|
|
esac
|
|
|
|
if [ $FORMAT = zStandard ]; then
|
|
if [ -z "$(which zstdcat)" ]; then
|
|
echo "zstdcat not found ! Need zstd package !" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "$(which zstd)" ]; then
|
|
echo "zstd not found ! Need zstd package !" >&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
[ ! -d /tmp/bootstrap/initrd ] && mkdir -p /tmp/bootstrap/initrd
|
|
cd /tmp/bootstrap
|
|
|
|
if [ ! -e /tmp/bootstrap/initrd/init ]; then
|
|
echo "Extract $LOCAL_INITRD..."
|
|
case $FORMAT in
|
|
asciCpio) ( cd initrd && zcat $LOCAL_INITRD | cpio -idm > /dev/null);;
|
|
zStandard) ( cd initrd && zstdcat $LOCAL_INITRD | cpio -idm > /dev/null )
|
|
esac
|
|
fi
|
|
|
|
[ -e /tmp/bootstrap/initrd/init.bak ] || cp /tmp/bootstrap/initrd/init /tmp/bootstrap/initrd/init.bak
|
|
|
|
|
|
DST=/tmp/bootstrap/initrd
|
|
|
|
#rm -f $DST/bin/busybox $DST/usr/bin/busybox
|
|
|
|
#apt-get download haveged
|
|
#dpkg -x haveged*.deb initrd
|
|
|
|
#apt-get download libhavege2
|
|
#dpkg -x libhavege2*.deb initrd
|
|
|
|
apt-get download busybox
|
|
dpkg -x busybox_*.deb initrd
|
|
|
|
apt-get download debootstrap
|
|
dpkg -x debootstrap*.deb initrd
|
|
|
|
apt-get download file
|
|
dpkg -x file*.deb initrd
|
|
|
|
apt-get download libmagic-mgc
|
|
dpkg -x libmagic-mgc*.deb initrd
|
|
|
|
#apt-get download haveged
|
|
#dpkg -x haveged*.deb initrd
|
|
|
|
set +x
|
|
|
|
#[ ! -d initrd/sbin ] && mkdir initrd/sbin
|
|
|
|
cat << EOF > /tmp/bootstrap/initrd/init
|
|
#!/bin/busybox ash
|
|
|
|
EOF
|
|
|
|
set +u
|
|
[ -n "$http_proxy" ] && echo "export http_proxy=$http_proxy" >> /tmp/bootstrap/initrd/init
|
|
[ -n "$https_proxy" ] && echo "export https_proxy=$https_proxy" >> /tmp/bootstrap/initrd/init
|
|
set -u
|
|
|
|
cat << EOF >> /tmp/bootstrap/initrd/init
|
|
|
|
set -a
|
|
. /config
|
|
set +a
|
|
|
|
[ -d /dev ] || mkdir -m 0755 /dev
|
|
[ -d /proc ] || mkdir /proc
|
|
[ -d /sys ] || mkdir /sys
|
|
|
|
mkdir -p /var/lock
|
|
mount -t sysfs -o nodev,noexec,nosuid sysfs /sys
|
|
mount -t proc -o nodev,noexec,nosuid proc /proc
|
|
|
|
mkdir /dev/pts
|
|
mount -t devpts -o noexec,nosuid,gid=5,mode=0620 devpts /dev/pts
|
|
|
|
modprobe virtio_pci
|
|
modprobe virtio_blk
|
|
modprobe ext4
|
|
modprobe crc32c
|
|
|
|
modprobe virtio-net
|
|
|
|
mdev -s
|
|
|
|
if ! fdisk -l /dev/vda | grep -q /dev/vda1; then
|
|
echo -e "n\np\n1\n\n\nw\n" | fdisk /dev/vda
|
|
mdev -s
|
|
/bin/mke2fs -j -t ext4 /dev/vda1
|
|
fi
|
|
|
|
mkdir -p /tmp/d
|
|
mount /dev/vda1 /tmp/d || {
|
|
echo "Can't mount partition !" >&2
|
|
echo "Repair + exit to continue or poweroff -f to halt !"
|
|
/bin/busybox ash
|
|
}
|
|
|
|
ifconfig eth0 10.0.2.15
|
|
route add default gw 10.0.2.2
|
|
|
|
ln -sf /bin/bash /bin/sh
|
|
|
|
#/usr/sbin/haveged
|
|
|
|
if [ ! -d /tmp/d/bin ]; then
|
|
echo "Debootstrap $VERSION_CODENAME ..."
|
|
debootstrap --arch=amd64 $VERSION_CODENAME /tmp/d
|
|
fi
|
|
|
|
mount -o bind /dev /tmp/d/dev
|
|
mount -t devpts -o noexec,nosuid,gid=5,mode=0620 devpts /tmp/d/dev/pts
|
|
mount -o bind /proc /tmp/d/proc
|
|
mount -o bind /sys /tmp/d/sys
|
|
|
|
cp /config /tmp/d/root/config
|
|
cp /base.sh /tmp/d/root/base.sh
|
|
|
|
chroot /tmp/d /root/base.sh
|
|
|
|
#echo "In chroot exit to quit"
|
|
#chroot /tmp/d /bin/bash
|
|
|
|
|
|
#/bin/busybox ash
|
|
|
|
poweroff -f
|
|
|
|
EOF
|
|
|
|
chmod 755 /tmp/bootstrap/initrd/init
|
|
|
|
echo "Inject files and program with depends..."
|
|
|
|
[ ! -d $DST/bin ] && mkdir $DST/bin
|
|
|
|
injectCommandWithDepends /bin/bash
|
|
injectCommandWithDepends /sbin/modprobe
|
|
injectCommandWithDepends /sbin/fdisk
|
|
injectCommandWithDepends /sbin/mke2fs
|
|
injectCommandWithDepends /usr/bin/gpgv
|
|
injectCommandWithDepends /usr/bin/perl
|
|
|
|
#injectCommandWithDepends /usr/bin/file
|
|
#injectCommandWithDepends /usr/bin/ldd
|
|
#injectCommandWithDepends /usr/bin/strace
|
|
#injectCommandWithDepends /usr/bin/script
|
|
|
|
injectFileAndLink /lib/x86_64-linux-gnu/libresolv.so.2
|
|
injectFileAndLink /lib/x86_64-linux-gnu/libnss_files.so.2
|
|
injectFileAndLink /lib/x86_64-linux-gnu/libnss_dns.so.2
|
|
#injectFileAndLink /usr/lib/x86_64-linux-gnu/libidn2.so
|
|
|
|
cp /sbin/mke2fs $DST/bin/mke2fs
|
|
#injectCommandWithDepends /bin/grep
|
|
#mv $DST/usr/bin/grep $DST/bin/grep
|
|
|
|
injectCommandWithDepends /usr/bin/perl
|
|
#injectCommandWithDepends /usr/bin/wget
|
|
#cp /usr/bin/wget $DST/bin
|
|
|
|
mkdir -p $DST/usr/share/keyrings
|
|
cp /usr/share/keyrings/debian-archive-keyring.gpg $DST/usr/share/keyrings
|
|
|
|
cp /etc/resolv.conf $DST/etc/resolv.conf
|
|
cp /tmp/bootstrap/config $DST
|
|
cp $SCRIPT_BASE $DST/base.sh
|
|
|
|
# Build /tmp/bootstrap/initrd.img
|
|
|
|
if [ ! -e /tmp/bootstrap/initrd.img ]; then
|
|
echo "Create /tmp/bootstrap/initrd.img..."
|
|
case $FORMAT in
|
|
asciCpio) ( cd initrd && find . | cpio -o -H newc -R root:root | gzip -9 > /tmp/bootstrap/initrd.img);;
|
|
zStandard) ( cd initrd && find . | cpio -o -H newc -R root:root | zstd -9 > /tmp/bootstrap/initrd.img );;
|
|
esac
|
|
fi
|
|
|
|
[ ! -e $DISK ] && {
|
|
echo "Create sparse disk ($SIZE G)..."
|
|
dd of=$DISK count=0 bs=1G seek=$SIZE
|
|
}
|
|
|
|
qemu-system-x86_64 -kernel $LOCAL_KERNEL -smp 8 -enable-kvm -cpu host -device virtio-rng-pci,rng=rng0 -object rng-random,filename=/dev/urandom,id=rng0 -rtc base=localtime -m 3072M -serial mon:stdio -monitor null -nographic -initrd /tmp/bootstrap/initrd.img -append "root=/dev/vda boot=live ro console=ttyS0,115200n8 net.ifnames=0 noresume" -boot order=c -drive file=$DISK,if=virtio,format=raw -device virtio-net-pci,netdev=n0,mac=52:56:0A:E8:00:02 -netdev user,id=n0
|
|
|
|
|
|
exit 0
|
|
|
|
|
|
#qemu-system-x86_64 -smp 8 -enable-kvm -cpu host -device virtio-rng-pci,rng=rng0 -object rng-random,filename=/dev/urandom,id=rng0 -pidfile /tmp/vdn-davalan/vdn-tiny-davalan-pid -rtc base=localtime -m 2048M -serial mon:stdio -monitor null -vnc unix:/tmp/vdn-davalan/vdn-vnc-davalan-tiny-socket -spice unix,disable-ticketing,addr=/tmp/vdn-davalan/vdn-spice-davalan-tiny-socket -device virtio-serial -chardev spicevmc,id=vdagent,debug=0,name=vdagent -device virtserialport,chardev=vdagent,name=com.redhat.spice.0 -initrd /home/davalan/vdn-bullseye/files/initrd-tgz.img-5.10.0-15-amd64 -kernel /home/davalan/vdn-bullseye/files/vmlinuz-5.10.0-15-amd64 -append root=/dev/vda1 ro console=ttyS0,115200n8 vdn-emulator=kvm vdn-mode=tgz net.ifnames=0 noresume -boot order=c -drive file=/home/davalan/vdn-bullseye/files/DebianBullseye-amd64.disk,if=virtio,snapshot=on,format=raw -drive file=/home/scratch/davalan/vdn-save/demo-bullseye/tiny.tgz,if=virtio,media=disk,format=raw -drive file=/tmp/vdn-davalan/vdn-tiny-davalan-part,if=virtio,media=disk,format=raw -drive file=/tmp/vdn-davalan/vdn-tiny-davalan-swap,if=virtio,media=disk,format=raw -drive file=/tmp/vdn-davalan/vdn-tiny-davalan-config.tgz,if=virtio,media=disk,format=raw -device virtio-net-pci,mac=52:56:0A:E8:00:00 -nic none -device virtio-net-pci,netdev=n2,mac=52:56:0A:E8:00:01 -netdev socket,id=n2,mcast=234.0.10.232:9810 -device virtio-net-pci,netdev=n0,mac=52:56:0A:E8:00:02 -netdev user,id=n0,hostfwd=tcp::5022-:22
|
|
|