qemu 运行ubuntu系统
加载ubuntu
# 注意:修改成自己对应的文件路径
# 创建镜像
dd if=/dev/zero of=ubuntu.img bs=1M count=8192
# 使用qemu-img 创建 推荐
qemu-img create -f qcow2 ubuntu.img 40G
# 从官网下载镜像
# 初次加载安装,跟普通的安装系统一样
./build/qemu-system-x86_64 \
-m 2G -smp 2 \
--enable-kvm \
-boot order=dc \
-hda ubuntu.img \
-cdrom ubuntu-20.04.4-live-server-amd64.iso \
-vnc :1
# 这里还需要vncview去连接,端口号为 5901
# 后面的直接从磁盘启动即可
./build/qemu-system-x86_64 \
-m 2G -smp 2 \
--enable-kvm \
-boot order=c \
-hda ubuntu.img \
-nic user,id=virtionet1,model=virtio-net-pci,hostfwd=tcp::8869-:22 \
-vnc :1
# -nic 设置网卡选项,hostfwd表示宿主机的8869端口映射到虚拟机的22端口,能通过ssh连接
安装成功后,首次普通启动
如果命令行出现警告 WARNING: Image format was not specified for '' and probing guessed raw. Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted. Specify the 'raw' format explicitly to remove the restrictions.
指定文件格式
# 查看镜像文件信息
./build/qemu-img info filename
# hda 是 -drive file=file,index=0,media=disk 的简写形式
./build/qemu-system-x86_64 \
-m 2G -smp 2 \
--enable-kvm \
-boot order=c \
-drive file=ubuntu.imgindex=0,media=disk,format=qcow2 \
-nic user,id=virtionet1,model=virtio-net-pci,hostfwd=tcp::8869-:22 \
-vnc :1
qemu和宿主机共享磁盘
# 创建硬盘镜像
qemu-img create -f raw disk.raw 10G
# 格式化
mkfs -t ext4 ./disk.raw
# 以 loop 方式将磁盘镜像文件挂载到一个目录上,方便操作镜像中的文件
sudo mount -o loop ./disk.raw ./img
# 卸载镜像
sudo umount ./disk.raw
# 启动虚拟机时,使用-hdb增加一个磁盘
./build/qemu-system-x86_64 \
-m 2G -smp 2 \
--enable-kvm \
-boot order=c \
-hda ubuntu.img \
-hdb ./disk.raw \
-nic user,id=virtionet1,model=virtio-net-pci,hostfwd=tcp::8869-:22 \
-vnc :1
使用 lsblk
查看添加上的磁盘
使用mount命令挂载/dev/sdb
到某个目录,如 sudo mount /dev/sdb /mnt/sdb
, 可以在/mnt/sdb
目录下访问共享磁盘
# 初次需要创建目录
sudo mkdir /mnt/sdb
sudo mount /dev/sdb /mnt/sdb
编译内核
参考 Ubuntu下编译内核
sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev dwarves zstd
# 清空之前的配置
make mrproper
# 拷贝机器上存在的配置
cp /boot/config-`uname -r` ./.config
# 先加载load→OK→Save→OK→EXIT→EXIT,进行微调
make menuconfig
# make zImage # 生成内核镜像
# make modules # 编译所有内核模块
# 编译,相当于make zImage 和 make modules 两个命令
make -j$(nproc)
# 或
# make bzImage -j$(nproc)
# 编译模块
# make modules -j$(nproc)
# 安装
sudo make install
# 模块安装
sudo make modules_install
# 更新grub
sudo update-grub2
编译出现的错误,可能的解决方案
Q1: FAILED: load BTF from vmlinux: Unknown error -2make
: *** [Makefile:1162: vmlinux] Error 255
- 可能是分配给虚拟机较小,调整内存如
2G->4G
Q2: make modules_install报错make[1]: *** [arch/x86/crypto/aegis128-aesni.ko] Error 1 Makefile
- 在编译前配置阶段编辑
vim .config
, 通过搜索把CONFIG_SYSTEM_TRUSTED_KEYS="debian/canonical-certs.pem"
修改成CONFIG_SYSTEM_TRUSTED_KEYS=""
, 对于CONFIG_MODULE_SIG_KEY=""
不一定要修成空,可能也会安装不上
Q3: 在执行安装发现 Write error : cannot write compressed block
- 检查是否
/boot
是否足够
Q4: 在直接make & sudo make install
安装的内核,在启动时ifconfig -a
没有检查出相应网卡
- 相关的驱动是编译成模块,而在编译时没有安装相关模块, 可以修改配置文件,比如 修改
CONFIG_E1000=y
直接编译到内核中 - 检查
/lib/modules/$(uname -r)/
是否存在相关模块,然后通过insmod
进行安装
sudo vim /etc/default/grub
# 修改内容为
GRUB_DEFAULT=0
# GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT1=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="maybe-ubiquity"
GRUB_CMDLINE_LINUX=""
# 修改成功后,进行更新
sudo update-grub2
qcow2 扩容
# 先关闭虚拟机再扩容
qemu-img resize ubuntu.img +20G
# 查看镜像信息
qemu-img info ubuntu.img
# 查看磁盘信息
sudo fdisk -l
# 对于我这里是 sda,磁盘容量已达30g, 但后面的分区大小信息还是原先的10g
Disk /dev/sda: 30 GiB, 32212254720 bytes, 62914560 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 6457B4B2-9E0C-4FEE-8586-1412B99781D5
Device Start End Sectors Size Type
/dev/sda1 2048 4095 2048 1M BIOS boot
/dev/sda2 4096 1861631 1857536 907M Linux filesystem
/dev/sda3 1861632 20969471 19107840 9.1G Linux filesystem
# 分区管理
sudo fdisk /dev/sda
# n->回车->回车->回车
# 修改磁盘格式,
Command (m for help): t
Partition number (1-4, default 4): 4
Partition type (type L to list all types): 8e
# 创建一个新的pv并添加到要扩容的vg中,首先查看Volume group 信息
sudo vgdisplay
sudo pvcreate /dev/sda4
# 我这里VG Name 是 ubuntu-vg
# 如果 mkdir failed: No space left on device 原先的分区空间满了,先删除一些东西
sudo vgextend ubuntu-vg /dev/sda4
# 使用查看文件系统信息
df -TH
/dev/mapper/ubuntu--vg-ubuntu--lv ext4 9.0G 5.0G 3.6G 59% /
# 扩容,需要比增加的空间要少一些
sudo lvresize -L +19G /dev/mapper/ubuntu--vg-ubuntu--lv
# 重置文件系统大小
sudo resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
qemu user hostfwd问题
编译安装新内核后,无法使用ssh 连接,host 能访问hostfwd 端口,但好像guest 却没有收到转发的内容
在guest 内部访问防火墙状态报:
sudo make modules_install
安装内核时也需要安装相应的模块,但SSH连接不上
经排查发现:正常情况下安装5.10
内核是可以的,但我这里是调试TCP协议栈时,修改了一些代码,把修改过的该回去后SSH能正常连接