60c80ad26d
Why I did it Fix the build unstable issue caused by the kvm 9000 port is not ready to use in 2 seconds. 2022-09-02T10:57:30.8122304Z + /usr/bin/kvm -m 8192 -name onie -boot order=cd,once=d -cdrom target/files/bullseye/onie-recovery-x86_64-kvm_x86_64_4_asic-r0.iso -device e1000,netdev=onienet -netdev user,id=onienet,hostfwd=:0.0.0.0:3041-:22 -vnc 0.0.0.0:0 -vga std -drive file=target/sonic-6asic-vs.img,media=disk,if=virtio,index=0 -drive file=./sonic-installer.img,if=virtio,index=1 -serial telnet:127.0.0.1:9000,server 2022-09-02T10:57:30.8123378Z + sleep 2.0 2022-09-02T10:57:30.8123889Z + '[' -d /proc/284923 ']' 2022-09-02T10:57:30.8124528Z + echo 'to kill kvm: sudo kill 284923' 2022-09-02T10:57:30.8124994Z to kill kvm: sudo kill 284923 2022-09-02T10:57:30.8125362Z + ./install_sonic.py 2022-09-02T10:57:30.8125720Z Trying 127.0.0.1... 2022-09-02T10:57:30.8126041Z telnet: Unable to connect to remote host: Connection refused How I did it Waiting more time until the tcp port 9000 is ready, waiting for 60 seconds in maximum.
145 lines
2.8 KiB
Bash
Executable File
145 lines
2.8 KiB
Bash
Executable File
#!/bin/bash -ex
|
|
|
|
# Copyright (C) 2014 Curt Brune <curt@cumulusnetworks.com>
|
|
#
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
|
|
MEM=8192
|
|
DISK=$1
|
|
ONIE_RECOVERY_ISO=$2
|
|
INSTALLER=$3
|
|
DISK_SIZE=$4
|
|
|
|
INSTALLER_DISK="./sonic-installer.img"
|
|
|
|
# VM will listen on telnet port $KVM_PORT
|
|
KVM_PORT=9000
|
|
|
|
on_exit()
|
|
{
|
|
rm -f $kvm_log
|
|
}
|
|
|
|
on_error()
|
|
{
|
|
netstat -antp
|
|
ps aux
|
|
echo "============= kvm_log =============="
|
|
cat $kvm_log
|
|
}
|
|
|
|
create_disk()
|
|
{
|
|
echo "Creating SONiC kvm disk : $DISK of size $DISK_SIZE GB"
|
|
qemu-img create -f qcow2 $DISK ${DISK_SIZE}G
|
|
}
|
|
|
|
prepare_installer_disk()
|
|
{
|
|
fallocate -l 4096M $INSTALLER_DISK
|
|
|
|
mkfs.vfat $INSTALLER_DISK
|
|
|
|
tmpdir=$(mktemp -d)
|
|
|
|
mount -o loop $INSTALLER_DISK $tmpdir
|
|
|
|
cp $INSTALLER $tmpdir/onie-installer.bin
|
|
|
|
umount $tmpdir
|
|
}
|
|
|
|
wait_kvm_ready()
|
|
{
|
|
local count=30
|
|
local waiting_in_seconds=2.0
|
|
for ((i=1; i<=$count; i++)); do
|
|
sleep $waiting_in_seconds
|
|
echo "$(date) [$i/$count] waiting for the port $KVM_PORT ready"
|
|
if netstat -l | grep -q ":$KVM_PORT"; then
|
|
break
|
|
fi
|
|
done
|
|
}
|
|
|
|
apt-get install -y net-tools
|
|
create_disk
|
|
prepare_installer_disk
|
|
|
|
echo "Prepare memory for KVM build: $vs_build_prepare_mem"
|
|
mount proc /proc -t proc || true
|
|
free -m
|
|
if [[ "$vs_build_prepare_mem" == "yes" ]]; then
|
|
# Force o.s. to drop cache and compact memory so that KVM can get 2G memory
|
|
bash -c 'echo 1 > /proc/sys/vm/drop_caches'
|
|
# Not all kernels support compact_memory
|
|
if [[ -w '/proc/sys/vm/compact_memory' ]]
|
|
then
|
|
bash -c 'echo 1 > /proc/sys/vm/compact_memory'
|
|
fi
|
|
free -m
|
|
fi
|
|
|
|
kvm_log=$(mktemp)
|
|
trap on_exit EXIT
|
|
trap on_error ERR
|
|
|
|
echo "Installing SONiC"
|
|
|
|
/usr/bin/kvm -m $MEM \
|
|
-name "onie" \
|
|
-boot "order=cd,once=d" -cdrom "$ONIE_RECOVERY_ISO" \
|
|
-device e1000,netdev=onienet \
|
|
-netdev user,id=onienet,hostfwd=:0.0.0.0:3041-:22 \
|
|
-vnc 0.0.0.0:0 \
|
|
-vga std \
|
|
-drive file=$DISK,media=disk,if=virtio,index=0 \
|
|
-drive file=$INSTALLER_DISK,if=virtio,index=1 \
|
|
-serial telnet:127.0.0.1:$KVM_PORT,server > $kvm_log 2>&1 &
|
|
|
|
kvm_pid=$!
|
|
|
|
wait_kvm_ready
|
|
|
|
[ -d "/proc/$kvm_pid" ] || {
|
|
echo "ERROR: kvm died."
|
|
cat $kvm_log
|
|
exit 1
|
|
}
|
|
|
|
echo "to kill kvm: sudo kill $kvm_pid"
|
|
|
|
./install_sonic.py
|
|
|
|
kill $kvm_pid
|
|
|
|
echo "Booting up SONiC"
|
|
|
|
/usr/bin/kvm -m $MEM \
|
|
-name "onie" \
|
|
-device e1000,netdev=onienet \
|
|
-netdev user,id=onienet,hostfwd=:0.0.0.0:3041-:22 \
|
|
-vnc 0.0.0.0:0 \
|
|
-vga std \
|
|
-snapshot \
|
|
-drive file=$DISK,media=disk,if=virtio,index=0 \
|
|
-serial telnet:127.0.0.1:$KVM_PORT,server > $kvm_log 2>&1 &
|
|
|
|
kvm_pid=$!
|
|
|
|
wait_kvm_ready
|
|
|
|
[ -d "/proc/$kvm_pid" ] || {
|
|
echo "ERROR: kvm died."
|
|
cat $kvm_log
|
|
exit 1
|
|
}
|
|
|
|
echo "to kill kvm: sudo kill $kvm_pid"
|
|
|
|
./check_install.py -u $SONIC_USERNAME -P $PASSWD -p $KVM_PORT
|
|
|
|
kill $kvm_pid
|
|
|
|
exit 0
|