当前位置: 首页 > news >正文

qemu 安装ubuntu22.04虚拟机 -纯命令行-可ssh-带网络-编译安装 linux kernel-编译安装 kernel module

 tar -xjf  xxx.tar.bz2

1,预备系统盘数据

1.1 下载光盘


注意需要 liver-server

$ wget https://releases.ubuntu.com/22.04.4/ubuntu-22.04.4-live-server-amd64.iso

1.2 挂载并拷贝


 

$ sudo mkdir /mnt/iso_ubuntu-22.04.4-live-server-amd64
$ sudo mount     ubuntu-22.04.4-live-server-amd64.iso  /mnt/iso_ubuntu-22.04.4-live-server-amd64/ -o loop
$ cp -r /mnt/iso_ubuntu-22.04.4-live-server-amd64     ./iso_ubuntu-220404/

确认文件文件路径:

$ ls ./iso_ubuntu-22.04.4-live-server-amd64/casper/initrd
$ ls ./iso_ubuntu-22.04.4-live-server-amd64/casper/vmlinuz


后变安装时会用到。


2,预备构建 qemu 的依赖

2.1 预备普通依赖

sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients virtinst bridge-utils virt-manager  virt-viewersudo apt-get install libpixman-1-dev


如果系统中没有 ninja,则需要安装
检验:
 

$ ninja --version


2.2 预备网络 -net user 依赖

//slirp 为用户网络配置
 

sudo apt-get install libslirp-dev
sudo apt-get install samba

安装好后可以重启一下
sudo reboot


3,下载 qemu 并编译

3.1 下载源码

$ git clone https://github.com/qemu/qemu.git
$ cd qemu
$ mkdir build
$ cd build


3.2 配置编译选项

3.2.1 无配置选项配置

$ ../configure

3.3.2 带选项配置

$ ../configure --enable-slirp --enable-slirp-smbd --smbd=/home/hipper/ex_ubuntu-22.4.4-live-server_qemu/smba_00 --enable-kvm --enable-debug --target-list="riscv32-softmmu riscv64-softmmu x86_64-softmmu"

--enable-slirp: 为 -net user,载安装ubuntu时会自动配置网络,并安装成功后,可以ssh访问本虚拟机
--target-list: 指定虚拟的的cpu arch 类型,省略此,会全部编译,时间为3倍长。


提前标注:
开启 -net user 模式的启动配置(安装完后的重启):
 

$ ./qemu/build/qemu-system-x86_64 -hda ubuntu.img -m 1024 -net nic -net user,smb=/home/hipper/ex_ubuntu-22.4.4-live-server_qemu/smba_00

3.3.3 编译 qemu

$ make
$ ls


4,安装虚拟机系统

4.1 加入相关组

sudo usermod -aG kvm $USER
sudo usermod -aG libvirt $USER

4.2 创建硬盘

创建虚拟机的磁盘映像

$ ./qemu/build/qemu-img create ubuntu-220404-kernel-00.qcow2 -f qcow2 50G


4.3 安装虚拟机系统

sudo ./qemu/build/qemu-system-x86_64 -m 32768M -smp 6 -boot c -cpu host \
-hda  ubuntu-220404-kernel-00.qcow2 \
-net nic -net user,smb=/home/hipper/ex_ubuntu-22.4.4-live-server_qemu/smba_00 \
--enable-kvm  --nographic -append console=ttyS0  \
-cdrom  ubuntu-22.04.4-live-server-amd64.iso  \
-kernel ./ubuntu-220404/iso_ubuntu-22.04.4-live-server-amd64/casper/vmlinuz  \
-initrd  ./ubuntu-220404/iso_ubuntu-22.04.4-live-server-amd64/casper/initrd

安装完成后关掉当前终端,重开一个终端。

4.4 启动新虚拟机

sudo usermod -aG kvm $USER  \
&& sudo usermod -aG libvirt $USER  \
&& sudo ./qemu/build/qemu-system-x86_64 -m 32768M -smp 6 -boot c -cpu host \
-hda  ubuntu-220404-kernel-00.qcow2 --enable-kvm  --nographic \
-net nic -net user,smb=/home/hipper/ex_ubuntu-22.4.4-live-server_qemu/smba_00,hostfwd=tcp::2222-:22

 

直接登陆进来,也可以考虑 ssh进来。

4.5 ssh 链接虚拟机


启动选项 hostfwd=tcp::2222-:22      是为 ssh 预备端口


其中heihei是虚拟机中的用户名;而 10.208.15.202 是宿主机的ip地址
这样,只要能够ssh进宿主机的机器,也能ssh进 heihei的虚拟机,pwd用heihei的。

sudo ./qemu/build/qemu-system-x86_64 -m 32768M -smp 6 -boot c -cpu host \
-hda  ubuntu-220404-kernel-00.qcow2 --enable-kvm  --nographic \
-net nic -net user,smb=/home/hipper/ex_ubuntu-22.4.4-live-server_qemu/smba_00,hostfwd=tcp::2222-:22

至此可以正常使用 虚拟机了。
而且可以在任何机器上 ssh 进虚拟机:


hostfwd=tcp::2222-:22      是为 ssh 预备端口

ssh 链接虚拟机:
ssh -p 2222 user-virtual@host-ip

实例:
 

$ ssh -p2222 heihei@10.208.15.202


5. 虚拟机中编译安装 linux kernel

5.1,下载对应版本的linux kernel源代码

5.1.1 apt 下载对应发型版的 linux kernel

$ apt install linux-source
$ ls /usr/src/

linux-source-5.15.0.tar.bz2 


可以看到多了一个文件夹和软连接文件,指向文件夹内的linux kernel 源码打包文件

拷贝到自己的工作目录下:


$ cp linux-source-5.15.0.tar.bz2 ~/kernel_debug/

查看本机kernel版本:
    uname -a

$ uname  -a


Linux heihei-server 5.15.0-112-generic #122-Ubuntu SMP
所以下载对应版本: 5.15 linux kernel

5.2 编译 debug 版本的vmlinux并安装

5.2.1 解压kernel


 

$ tar -xvjf linux-source-5.15.0.tar.bz2

5.2.2 安装依赖

在虚拟机中安装配置和编译 Linux kernel 的依赖包:

#配置kernel 和 编译kernel 的依赖包
sudo apt-get update && \
sudo apt-get install libncurses-dev && \
sudo apt-get install build-essential  && \
sudo apt-get install flex bison && \
sudo apt-get install libssl-dev && \
sudo apt-get install binutils && \
sudo apt-get install libelf-dev && \
sudo apt-get install openssh-server && \
sudo apt-get install vim && \
sudo apt-get install bc && \
sudo apt-get install dwarves && \
sudo apt-get install zstd

5.2.3 配置 kernel

查看本机kernel配置文件

$ ls /boot/


 将发行版中的configxxx文件,拷贝至解压好的 kernel 目录下:

 配置kernel 开启 debug info,以便可以调试

首先根据旧的config文件生成新的配置:

$ make oldconfig
#然后一路回车

在 Linux 内核中执行 make oldconfig 后,如果你一路回车(即对所有提示都按回车键),系统会使用每个新选项的默认值。这通常是一个安全且方便的方式来更新内核配置,特别是当你不确定每个新选项的具体含义时。

开启 debug info,以便可以调试:

$ make menuconfig

 进入初始界面:

选中:

kernel hacking ->

compile-time checks and compiler options ->

compile the kernel with debug info

如下图,移动到本项后敲空格键

然后移动到 <Save> 回车并保存为 .config

然后一层层  <Exit> 出来

确认验证保存正确:

$ grep -rn  DEBUG_INFO .config

修改一下 .config

CONFIG_SYSTEM_TRUSTED_KEYS="debian/canonical-certs.pem"
CONFIG_SYSTEM_REVOCATION_KEYS="debian/canonical-revoked-certs.pem"

都设置成空字符串,如上图。

否则会报错:

make[1]: *** No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'.  Stop.

 反正自己玩,安全性在发行版了再说吧。

5.2.3 编译安装kernel

安装依赖:


sudo apt-get update
sudo apt-get install libssl-dev
sudo apt-get install binutils
sudo apt-get install libelf-dev
sudo apt-get install dwarves

内存够大:
 

$ make -j
$ sudo make modules_install
$ sudo make install

编译完成:

安装内核模块:

安装内核:

更新引导加载程序:

    查看grub版本,版本号大于2.0,系统中便是使用了 grub2:

$ grub-install --version

 

$ sudo update-grub
$ sudo update-grub2

 重新启动

$ sudo reboot

5.2.4 内核编译相关命令备忘

1.清理工作目标

make clean: 删除编译中间文件,但是保留配置
make mrproper:删除包括配置文件的所有构建文件
make distclean:执行mrproper所做的一切,并删除备份文件

2.配置内核

make menuconfig:文本图形方式配置内核
make oldconfig:基于当前的.config文件提示更新内核
make defconfig:生成默认的内核配置
make allmodconfig:所有的可选的选项构建成模块
make allyesconfig:生成全部选择是内核配置
make noconfig:生成全部选择否的内核配置

3.构建内核目标

make all:构建所有目标
make bzImage:构建内核映像
make modules:构建所有驱动
make dir/:构建指定目录
make dir/file.[s|o|i]:构建指定文件
make dir/file.ko:构建指定驱动

4.安装模块和内核

sudo make modules_install:安装模块,即各种驱动及其相关的ko
sudo make install:安装内核 vmlinux 等

5.打包,redhat only

make rpm:打包内核的 RMP 安装包
make rpm-pkg: 打包带源码的内核 rpm 安装包

/*************************

5.3 开启debug虚拟机模式

未完待续。。。

5.3 这块再整理一篇新的log吧,本篇幅有点长,可能不利于阅读

5.3.1 宿主机编译虚拟机的 vmlinux

5.3.1.1配置调试信息

同虚拟机中

5.3.1.2 编译但不安装

参考虚拟机中的编译

5.3.1 开机debug

sudo ./qemu/build/qemu-system-x86_64 \
-kernel  ./linux-source-5.15.0/arch/x86_64/boot/bzImage \
-m 32768M -smp 6 -boot c -cpu host \
-hda  ubuntu-220404-kernel-00.qcow2 --enable-kvm  --nographic \
-net nic -net user,smb=/home/hipper/ex_ubuntu-22.4.4-live-server_qemu/smba_00,hostfwd=tcp::2222-:22 \
-s -S -append "nokaslr init=/init console=ttyAMA0"


会卡在这里不动

5.3.2 gdb 链接qemu

宿主机中,打断点,continue
 

$ gdb
(gdb) show configuration # 关注--host以及--target参数
(gdb) file ./vmlinux  # 加载kernel符号表
(gdb) target remote :1234 # 链接qemu中的gdb-server
(gdb) b start_kernel # 设置断点
(gdb) c

***********************/

6,编译安装用户自定义 kenrel module

6.1,示例代码

it is simple,but useful,hahahaha:

内核模块源代码

hello.c :

#include <linux/module.h>static int __init hello_init(void)
{printk(KERN_INFO "hello linux kernel\n");return 0;
}static void __exit hello_exit(void)
{printk(KERN_INFO "good bye\n");
}module_init(hello_init);
module_exit(hello_exit);MODULE_LICENSE("Dua BSD/GPL");
MODULE_AUTHOR("MIUMIU");
MODULE_VERSION("v1.0");

Makefile:

KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)obj-m := hello.oall:make -C $(KERNELDIR) M=$(PWD) modulesclean:rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.mod *.order *.symvers

6.2,编译安装

编译

$ make$ ls


安装内核模块:

$ sudo insmod hello.ko$ sudo dmesg


卸载内核模块

$ sudo rmmod hello$ sudo dmesg

7, 遇到的问题汇总

Could not find '/usr/sbin/smbd', please install it
$ sudo apt-get install samba


防火墙设置:
检查虚拟机的防火墙设置,确保没有规则阻止 SSH 连接。你可以暂时禁用防火墙来测试连接:
sudo ufw disable
或者,确保 22 端口(或你为 SSH 配置的其他端口)是开放的:
sudo ufw allow 22

查看 sshd 端口:
sudo cat /etc/ssh/sshd_config | grep Port

查看 启动 重启 sshd 的命令

sudo systemctl status sshd
sudo systemctl start sshd
sudo systemctl restart sshd

私用命令备忘:

装机:

sudo ./qemu/build/qemu-system-x86_64 -m 196608M -smp 15 -boot c -cpu host \
-hda  ubuntu-220404-kernel-00.qcow2 \
-net nic -net user,smb=/home/hipper/ex_ubuntu-22.4.4-live-server_qemu/smba_00 \
--enable-kvm  --nographic -append console=ttyS0  \
-cdrom  ubuntu-22.04.4-live-server-amd64.iso  \
-kernel ./ubuntu-220404/iso_ubuntu-22.04.4-live-server-amd64/casper/vmlinuz  \
-initrd  ./ubuntu-220404/iso_ubuntu-22.04.4-live-server-amd64/casper/initrd

开机:

sudo ./qemu/build/qemu-system-x86_64 -m 196608M -smp 12 -boot c -cpu host \
-hda  ubuntu-220404-kernel-00.qcow2 --enable-kvm  --nographic \
-net nic -net user,smb=/home/hipper/ex_ubuntu-22.4.4-live-server_qemu/smba_00,hostfwd=tcp::2222-:22

host 中需要执行的安装:
 

sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients virtinst bridge-utils virt-manager  virt-viewer
sudo apt-get install libpixman-1-dev


虚拟机中需要执行的安装:

sudo apt-get update && \
sudo apt-get install libncurses-dev && \
sudo apt-get install build-essential  && \
sudo apt-get install flex bison && \
sudo apt-get install libssl-dev && \
sudo apt-get install binutils && \
sudo apt-get install libelf-dev && \
sudo apt-get install openssh-server && \
sudo apt-get install vim && \
sudo apt-get install bc && \
sudo apt-get install dwarves && \
sudo apt-get install zstd

sudo apt-get update && \
sudo apt-get install libncurses-dev && \
sudo apt-get install build-essential  && \
sudo apt-get install flex bison && \
sudo apt-get install libssl-dev && \
sudo apt-get install binutils && \
sudo apt-get install libelf-dev && \
sudo apt-get install openssh-server && \
sudo apt-get install vim && \
sudo apt-get install bc && \
sudo apt-get install dwarves && \
sudo apt-get install zstd

bash shell 配色:

vim ~/.bashrc
最后边加入如下内容:

alias ls='ls --color=always'
alias ll='ls -all --color=always'
#alias dir='dir --color=always'
#alias vdir='vdir --color=auto'alias grep='grep --color=always'
alias fgrep='fgrep --color=always'
alias egrep='egrep --color=always'export PS1="\e[0;35m\u\e[0;34m@\e[0;32m\h:\e[0;34m\w\e[0;38m$ "export LS_COLORS="rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:"

相关文章:

  • 打包体积分析和优化
  • JDK动态代理
  • SolidityFoundry 安全审计测试 Delegatecall漏洞2
  • 【Unity服务器01】之【AssetBundle上传加载u3d模型】
  • 前端 三维空间笔记
  • Java中的NIO编程实践精华
  • 程序的“通用性”和“过度设计”困境
  • zookeeper学习、配置文件参数详解
  • SSM旅游系统
  • WDF驱动开发-WDF总线枚举(一)
  • obsidian中用check list 打造待办清单
  • 在阿里云使用Docker部署MySQL服务,并且通过IDEA进行连接
  • 软件介绍—Fluent Reader (RSS阅读器)
  • SparkSQL的分布式执行引擎-Thrift服务:学习总结(第七天)
  • Java学习 - 网络TCP,UDP协议讲解
  • [Vue CLI 3] 配置解析之 css.extract
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • If…else
  • laravel with 查询列表限制条数
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • PHP面试之三:MySQL数据库
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 闭包--闭包之tab栏切换(四)
  • 从0实现一个tiny react(三)生命周期
  • 分享几个不错的工具
  • 讲清楚之javascript作用域
  • 开源地图数据可视化库——mapnik
  • 力扣(LeetCode)56
  • 前端工程化(Gulp、Webpack)-webpack
  • 使用Swoole加速Laravel(正式环境中)
  • 通过几道题目学习二叉搜索树
  • 详解移动APP与web APP的区别
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 异步
  • 原生js练习题---第五课
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • #pragma once与条件编译
  • $(selector).each()和$.each()的区别
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (五)关系数据库标准语言SQL
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)memcache、redis缓存
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .net MySql
  • .Net 代码性能 - (1)
  • .net 提取注释生成API文档 帮助文档