Compulsory kernel options
CONFIG_E1000=y
create rootfs
readonly BASEDIR=$(readlink -f $(dirname $0))/
QEMU_PATH=${BASEDIR}/
QEMU_BUILD_PATH=${QEMU_PATH}/build/
IMAGE_NAME=qemu-image.img
qemu-img create ${QEMU_PATH}/${IMAGE_NAME} 100g
mkfs.ext4 ${QEMU_PATH}/${IMAGE_NAME}
mkdir -p ${QEMU_PATH}/mount-point.dir
sudo mount -o loop ${QEMU_PATH}/${IMAGE_NAME} ${QEMU_PATH}/mount-point.dir/
sudo apt install debootstrap debian-keyring debian-archive-keyring
# When debootstrap install if wget error occurs,
# add proxy configuration to /etc/wgetrc (http_proxy, https_proxy, ftp_proxy)
sudo debootstrap --no-check-certificate --arch amd64 lunar ${QEMU_PATH}/mount-point.dir/
# mkdir - ${QEMU_PATH}/mnt
sudo mount ${IMAGE_NAME} ${QEMU_PATH}/mnt
cd ${QEMU_PATH}/mnt
sudo chroot .
# After creating rootfs,
# 1) Change root password
# $ passwd
# 2) (Optional) Add proxy configuration
# Open /etc/profile, and add proxy configuration
# export HTTP_PROXY="http://:/"
# export HTTPS_PROXY="http://:/"
# $ sh /etc/profile
# 3) (Optional) Add local Ubuntu repository mirrors
# Open /etc/apt/sources.list, and add repository mirrors
# 4) Package update
# $ apt update
# $ apt upgrade
# $ apt install nano pciutils debian-keyring debian-archive-keyring openssh-server net-tools ifupdown
# 5) Modify sshd config
# $ vi /etc/ssh/sshd_config
# ...
# PermitRootLogin yes
# ...
# 6) Modify network config
# $ vi /etc/network/interfaces
# # add below lines
# auto ens3
# iface ens3 inet dhcp
# # for q35 machine
# auto enp0s2
# iface enp0s2 inet dhcp
# alternative network config
# $ vi /etc/netplan/00-installer-config.yaml
# # add below lines
# network:
# ethernets:
# ens3:
# dhcp4: true
# enp0s2:
# dhcp4: true
# version: 2
# 7) Quit
# $ exit
After create the rootfs and compiler the kernel
SMDK_KERNEL_PATH=${BASEDIR}/Bede-linux/
ROOTFS_PATH=${BASEDIR}
MONITOR_PORT=45454
QEMU_SYSTEM_BINARY=`which qemu-system-x86_64`
BZIMAGE_PATH=${SMDK_KERNEL_PATH}/arch/x86_64/boot/bzImage
INITRD_PATH=/boot/initrd.img-6.4.0+
IMAGE_PATH=${ROOTFS_PATH}/qemu-image.img
function print_usage(){
echo ""
echo "Usage:"
echo " $0 [-x vm_index(0-9)]"
echo ""
}
while getopts "x:" opt; do
case "$opt" in
x)
if [ $OPTARG -lt 0 ] || [ $OPTARG -gt 9 ]; then
echo "Error: VM count should be 0-9"
exit 2
fi
VMIDX=$OPTARG
;;
*)
print_usage
exit 2
;;
esac
done
if [ -z ${VMIDX} ]; then
NET_OPTION="-net user,hostfwd=tcp::2242-:22,hostfwd=tcp::6379-:6379,hostfwd=tcp::11211-:11211, -net nic"
else
echo "Info: Running VM #${VMIDX}..."
MONITOR_PORT="4545${VMIDX}"
IMAGE_PATH=$(echo ${IMAGE_PATH} | sed 's/.img/-'"${VMIDX}"'.img/')
MACADDR="52:54:00:12:34:${VMIDX}${VMIDX}"
TAPNAME="tap${VMIDX}"
NET_OPTION="-net nic,macaddr=${MACADDR} -net tap,ifname=${TAPNAME},script=no"
IFCONFIG_TAPINFO=`ifconfig | grep ${TAPNAME}`
if [ -z "${IFCONFIG_TAPINFO}" ]; then
log_error "${TAPNAME} SHOULD be up for using network in VM. Run 'setup_bridge.sh' in /path/to/SMDK/lib/qemu/"
exit 2
fi
fi
if [ ! -f "${QEMU_SYSTEM_BINARY}" ]; then
log_error "qemu-system-x86_64 binary does not exist. Run 'build_lib.sh qemu' in /path/to/SMDK/lib/"
exit 2
fi
if [ ! -f "${BZIMAGE_PATH}" ]; then
log_error "SMDK kernel image does not exist. Run 'build_lib.sh kernel' in /path/to/SMDK/lib/"
exit 2
fi
if [ ! -f "${IMAGE_PATH}" ]; then
log_error "QEMU rootfs ${IMAGE_PATH} does not exist. Run 'create_rootfs.sh' in /path/to/SMDK/lib/qemu/"
exit 2
fi
# echo sudo ${QEMU_SYSTEM_BINARY} \
# -smp 3 \
# -numa node,cpus=0-2,memdev=mem0,nodeid=0 \
# -object memory-backend-ram,id=mem0,size=8G \
# -kernel ${BZIMAGE_PATH} \
# -initrd ${INITRD_PATH} \
# -drive file=${IMAGE_PATH},index=0,media=disk,format=raw \
# -drive file=${IMAGE1_PATH},index=1,media=disk,format=raw \
# -enable-kvm \
# -monitor telnet::${MONITOR_PORT},server,nowait \
# -serial mon:stdio \
# -nographic \
# -append "root=/dev/sda rw console=ttyS0 nokaslr memblock=debug loglevel=7" \
# -m 8G,slots=4,maxmem=32G \
# -device virtio-crypto-pci,id=crypto0,cryptodev=cryptodev0 \
# -object cryptodev-backend-builtin,id=cryptodev0 \
# -object secret,id=sec0,file=./Drywall/passwd.txt \
# ${NET_OPTION}
${QEMU_SYSTEM_BINARY} \
-S -s -smp 4 \
-numa node,cpus=0,memdev=mem0,nodeid=0 \
-object memory-backend-ram,id=mem0,size=8G \
-numa node,cpus=1,memdev=mem1,nodeid=1 \
-object memory-backend-ram,id=mem1,size=8G \
-numa node,cpus=2,memdev=mem2,nodeid=2 \
-object memory-backend-ram,id=mem2,size=8G \
-numa node,cpus=3,memdev=mem3,nodeid=3 \
-object memory-backend-ram,id=mem3,size=8G \
-kernel ${BZIMAGE_PATH} \
-initrd ${INITRD_PATH} \
-drive file=${IMAGE_PATH},index=0,media=disk,format=raw \
-serial mon:stdio \
-nographic \
-append "root=/dev/sda rw console=ttyS0 memblock=debug loglevel=7 cgroup_no_v1=1" \
-m 32G,slots=4,maxmem=36G \
-nic bridge,br=virbr0,model=virtio-net-pci,mac=02:76:7d:d7:1e:3f