Linux状态查询指令
Linux系统中的“root用户”概念是指一个具备所有权限的超级管理员,sudo命令的作用就是赋予一般的用户(比如本机的hrz)超级管理员的权限,使用场景就是诸如系统更新、(要求权限的)文件下载等。在sudo命令中使用的密码一般是“ 用户自己的密码 ”,而切换root用户的密码是装载系统之初设置的那个密码。
#切入到root用户,这里的密码是装机时设置的密码,跟sudo密码应该是不同的
su#从root用户切换回原来的用户环境,user是自己的用户名(hrz)
su user
KVM虚拟机
KVM 是基于虚拟化的X86硬件的开源Linux原生的全虚拟化方案(要求cpu支持Intel-VT-x或AMD-V),KVM内嵌于内核模块中,模拟处理器和内存以支持虚拟机运行,虚拟机被实现为常规的Linux进程,由标准Linux调度程序进行调度;虚拟机的每个虚拟CPU被实现为一个常规的Linux进程,这使得KMV能够使用Linux内核的已有功能。
KVM本身不执行任何模拟,需要客户空间程序(虚拟机)通过/dev/kvm (此虚拟设备需要开起硬件辅助虚拟化才能看到)接口设置一个客户机虚拟服务器的地址空间,并且由Qemu模拟/O (ioctl) 进行调度资源和维护管理。
Redhat官网描述:
Using KVM, one can run multiple virtual machines running unmodified Linux or Windows images. Each virtual machine has private virtualized hardware: a network card, disk, graphics adapter, etc.
参考文章如下:
「在 Ubuntu 18.04 LTS 上使用 KVM 配置无头虚拟化服务器 - 知乎」、
「Ubuntu22.04 用 KVM 安装 Arch Linux 实操-CSDN博客」、
「KVM详解,太详细太深入了_sunr_的博客-CSDN博客」
第一步需要检查本机系统是否支持硬件虚拟化,使用egrep(extended regular expression)命令在文件内查找指定的字符串,其他的用法还包括查看文件等:
egrep -c '(vmx|svm)' /proc/cpuinfo
本机返回的是16而不是0,说明可以进行虚拟化,接下来需要安装 KVM 并在 Linux 中配置虚拟化环境所需要的其它包,但是出现了下图中的问题,询问了chatGPT老师后得知问题核心在于最新的发行版中 libvirt-bin 被 libvirt-daemon-system 取代,所以调整一下安装的包即可。
命令修改如下:
sudo apt-get install qemu-kvm libvirt-daemon-system virtinst bridge-utils cpu-checker
还可以尝试先装载一个虚机上Arch Linux系统,但发现仍旧绕不开qemu和kvm:
sudo apt install qemu qemu-utils qemu-kvm libvirt-daemon-system virt-manager
不论是上述的哪个命令,都会返回之前就经常会出现的报错“ E: Sub-process /usr/bin/dpkg returned an error code (1) ”,没办法,只能从头开始整理跟dpkg相关的修复了,依此执行下列语句后再键入前述命令就不会再发生报错。
参考文章:「dpkg: 处理软件包 xxx (--configure)时出错」
#备份 $ sudo mv /var/lib/dpkg/info /var/lib/dpkg/info.bk #新建 $ sudo mkdir /var/lib/dpkg/info #更新 $ sudo apt-get update $ sudo apt-get -f install #替换 $ sudo mv /var/lib/dpkg/info/* /var/lib/dpkg/info.bk #把更新的文件替换到备份文件夹,并执行删除 $ sudo rm -rf /var/lib/dpkg/info #把自己新建的info文件夹删掉,并进行还原 $ sudo mv /var/lib/dpkg/info.bk /var/lib/dpkg/info
KVM 安装完成后,启动 libvertd 服务(如果它没有启动的话)并检查是否有运行的虚机:
#启动libvirtd服务
$ sudo systemctl enable libvirtd
$ sudo systemctl start libvirtd
#检查是否有虚机
$ sudo virsh list --all
然后是下载将要在虚机上安装的操作系统,本次尝试使用arch-linux系统,所以需要提前下载好官方发布的可用镜像,又因为ISO 镜像的默认路径是 /var/lib/libvirt/boot/,所以
得将下载的镜像文件移动到路径“ admin:///var/lib/libvirt/boot/ ”中,在操作中可能遭遇权限不足的问题,因此使用 sudo mv 命令:
#移动下载好的系统镜像文件
$ sudo mv home/hrz/下载/archlinux-2023.05.03-x86_64.iso /var/lib/libvirt/boot/#参考装机方案一
$ qemu-img create -f qcow2 archlinux.qcow2 2G
$ sudo virt-install --name archlinux \
--os-variant=archlinux \
--memory 2048 --vcpus 2 \
--disk path=./archlinux.qcow2 \
--cdrom=/var/lib/libvirt/boot/archlinux-2023.05.03-x86_64.iso \
--boot loader=/usr/share/qemu/OVMF.fd \
--virt-type kvm \
--network network=network,bridge=virbr1#参考装机方案二
sudo virt-install --name Ubuntu-16.04 \
--ram=512 --vcpus=1 \
--cpu host \
--hvm \
--disk path=/var/lib/libvirt/images/ubuntu-16.04-vm1,size=8 \
--cdrom /var/lib/libvirt/boot/ubuntu-16.04-server-amd64.iso \
--graphics vnc
针对方案一安装arch-linux时遭遇如下的问题:
所以还需要补充一堆安装依赖,参考文章「ImportError: cannot import name ‘_gi‘... Ubuntu」:
#参考相关文章
apt install python-dev
apt install python3-dev
apt install python3.8-dev sudo apt-get install libgirepository1.0-dev
sudo apt-get install python-cairo
sudo apt-get install libcairo2#参考chatGPT老师的答案
sudo apt-get install python3-dev libcairo2-devpython3 -m pip install -U pycairo'''注意!使用的软链接名称可能会影响到具体的终端指令效果!'''
#sudo python3.8 -m pip install --ignore-installed PyGObject
##报错 sudo: python3.8:找不到命令
#sudo python3 -m pip install --ignore-installed PyGObject
##报错 × pip subprocess to install build dependencies did not run successfully.
sudo python -m pip install --ignore-installed PyGObject
##Successfully installed PyGObject-3.44.1 pycairo-1.23.0
(然后眉头一皱,发现事情没有这么简单)
随着对报错理解的加深,开始逐步意识到Ubuntu的很多操作跟python的默认使用版本息息相关,这里面就涉及了大量软链接的知识(没什么办法,开始硬肝),首先根据别人遇到的问题和返回报错的信息去定位报错的关键“ _gi ”模块。
这里需要细心一点,因为安装的python太多,所以得注意跟报错最相关的所调用的python具体是哪个路径中的版本,这里就发现_gi并没有一个实体的“ .py ”文件,所以估计问题的核心就是画红圈儿的这个编译文件。
基于前面的观察,得识别自动模式的python版本是否同“_gi.cython-310-x86_64-li...”匹配,因此需要使用如下的命令手动换档,如果模式切换的权限不足就加一个“ sudo ”,最后成功解决 virt-install 调用的报错问题。
#查看自动模式的python版本命令
$ update-alternatives --config python3
随后还遇到了创建的qcow文件名不匹配,创建的虚拟机磁盘镜像分配的内存太离谱(40G)等问题,但相对来说还是比较友好的,另外最后一句指令“ --network network=network,bridge=virbr1 ”涉及的网卡问题比较复杂,先不处理,只使用该指令以前的内容即可,具体配置为“ 分配2G内存,两个CPU核 ”,运行相应指令就可以成功跳出图形界面了。
令人无语的是。。。好不容易出来了一个图形界面,手贱关掉以后就再也打不开了,之后只能通过以下几个命令认识到虚拟机还存在(如果报错“ error: failed to get domain xxx ”那多半是权限问题,加一个sudo就能解决)。
参考文章:「KVM--virsh虚拟机的日常操作」。
#查看所有有实体的虚机状态
$ sudo virsh list --all
#启动虚机,start后可以接id,也可以接虚机名
$ sudo virsh start archlinux
#关闭虚机
sudo virsh shutdown archlinux
#强制关机
sudo virsh destroy archlinux
(删掉重装,岂不美哉?)
#关掉虚机窗口以后,重新开启虚机窗口图的指令
##另外关掉窗口不代表虚机关闭,需要在终端使用virsh suspend/shutdown指令才能真正暂停/关闭虚机
virt-viewer --connect qemu:///system --wait archlinux
这个学期就这么迎来了尾声,现在ms.X就坐在我的正对面,现在我的主要职业方向变成了大宗,现在我仍然没有暑期实习(毕竟参加项目了),现在对自研平台开发的兴趣被云计算平台的开发分去了大半,生活是实打实的“ random walk ”,不过感觉还行。