Bullet Journal Personal Finance Dashboard (BJ-PFD) 继续阅读
分类目录归档:技术
Mac 下解决 zsh: no matches found: postcss@^7
mac开发引入 tailwindcss 库时遇到如下错误:
zsh: no matches found: postcss@^7
可以这样解决:
# 官网给出的命令如下
npm install -D tailwindcss@npm:@tailwindcss/postcss7-compat postcss@\^7 autoprefixer@\^9
# mac的zsh中需要这样,因为错误的 ^ 解析
npm install -D tailwindcss@npm:@tailwindcss/postcss7-compat postcss@^7 autoprefixer@^9
参考文献
解决OpenVPN证书过期问题
使用 Synology 提供的 VPN Server 一阵子,突然用不了了,大意是说 SSL 证书过期了,但是不知道如何解决,网络搜索也没有结果,试过了重置套件,无法解决。
最后查阅文档发现,VPN Server 是依赖了群晖设置中的证书。

随便选择一个进入设置,发现 VPN server 就是配置了过期的证书。

解决方法很简单,选择一个没过期的证书即可,保存后 VPN Server 会自动重启,之后重新导出配置文件,重连即可。
virt-manager 启动提示 virt qemu-sock no such file or directory
检查后应该是 virtqemud 服务没起来导致的,编译安装默认生成的服务路径在 /usr/local/* 下,而我们指定了安装在默认位置 /usr ,参考 systemd 无法启动的解决方法即可解决该问题。
首先看一下 /usr/sbin/virtqemud 这个文件是存在的,下面继续操作,首先使能该服务。
$ systemctl enable virtqemud
Created symlink from /etc/systemd/system/multi-user.target.wants/virtqemud.service to /usr/local/lib/systemd/system/virtqemud.service.
Created symlink from /etc/systemd/system/sockets.target.wants/virtqemud.socket to /usr/local/lib/systemd/system/virtqemud.socket.
Created symlink from /etc/systemd/system/sockets.target.wants/virtqemud-ro.socket to /usr/local/lib/systemd/system/virtqemud-ro.socket.
Created symlink from /etc/systemd/system/sockets.target.wants/virtqemud-admin.socket to /usr/local/lib/systemd
创建了改服务的软连接,宣告自启,此时服务配置有问题,直接修改该软连接指定的文件
vim /usr/local/lib/systemd/system/virtqemud.service
# 类比 libvirtd 的修改这两行,指定正确服务位置
[Service]
...
EnvironmentFile=-/etc/sysconfig/virtqemud
ExecStart=/usr/sbin/virtqemud $VIRTQEMUD_ARGS
之后重新加载服务,再启动
systemctl daemon-reload
systemctl reload virtqemud
systemctl start virtqemud
不出意外的话就能启动了,若有问题请留言。
Centos7.6 下编译安装 Libvirt 7.5
libvirt 是目前使用最为广泛的对KVM虚拟机进行管理的工具和 API 。 Libvirtd 是一个 daemon 进程,可以被本地的 virsh 调用,也可以被远程的 virsh 调用, Libvirtd 调用 qemu-kvm 操作虚拟机。下面介绍 Centos7.6 下编译安装 Libvirt 7.5 的方法。
环境准备
yum install -y meson
yum install -y gcc
yum install qemu-kvm
编译步骤-7.5
首先下载源码文件:
# Compiling a release tarball
wget https://libvirt.org/sources/libvirt-7.5.0.tar.xz
tar -xvf libvirt-7.5.0.tar.xz
cd libvirt-7.5.0
编译前可以查看一下当前系统下 virsh 的安装位置
[root@compute-01 stl]# find / -name "virsh"
/usr/bin/virsh
可以看到是安装在 .usr/bin 这个 PATH 路径下,因此在编译安装时,可使用如下命令指定安装位置(默认安装在 /usr/local/bin 目录下):
$ meson build --prefix=/usr
$ ninja -C build
$ sudo ninja -C build install
下面是官网给出的几种安装模式,包括直接使用 release 包安装,安装到您的个人目录下,或是根据系统自动安装到相应位置,可以按需选择。
# Compiling a release tarball
$ xz -dc libvirt-x.x.x.tar.xz | tar xvf -
$ cd libvirt-x.x.x
$ meson build
$ meson build [possible options]
$ ninja -C build
$ sudo ninja -C build install
# build & install libvirt to your home directory
$ meson build --prefix=$HOME/usr
$ ninja -C build
$ sudo ninja -C build install
# To produce a build that is compatible with normal OS vendor prefixes, use
$ meson build -Dsystem=true
$ ninja -C build
编译步骤-6.0
这里给出简单的 6.0 版本编译方法。
wget https://libvirt.org/sources/libvirt-6.0.0.tar.xz
tar -xvf
cd libvirt-6.0.0
mkdir build
cd build
../autogen.sh --system
$ make
$ sudo make install
疑难解决
- ERROR: Program ‘rpcgen portable-rpcgen’ not found
wget https://github.com/thkukuk/rpcsvc-proto/releases/download/v1.4.2/rpcsvc-proto-1.4.2.tar.xz
./configure --sysconfdir=/etc &&
make
make install
- Program ‘rst2html5 rst2html5.py rst2html5-3′ not found
$ yum install python -y
$ pip install rst2html5
- Dependency “glib-2.0” not found, tried pkgconfig and cmake
yum install glib2-devel
- Dependency “gnutls” not found, tried pkgconfig and cmake
yum install gnutls-devel
- Dependency “libxml-2.0” not found, tried pkgconfig and cmake
yum install libxml2-devel -y
- 致命错误:rpc/rpc.h:没有那个文件或目录
yum -y install libtirpc-devel
# 修改生成的编译配置文件
find / -name "rpc.h"
vim meson.build
# 在 headers 增加 rpc 头文件绝对路径
headers = [
...
'/usr/include/tirpc/rpc/rpc.h',
]
parser error : Double hyphen within comment: <!-- This file is auto-generated from keymaps.csv
解决方法:找到报错的 *.html.in 文件报错行出,将报错的 -- 改为 - 即可。
- 编译后没有 vir-install 命令
yum install virt-install
- systemd 无法启动
libvirtd.service 存在于 /usr/lib/systemd/system/ 文件夹下,而在 /etc/systemd/system/ 文件夹下有该文件的软连接,表明这是自动启动的。
尝试启动该服务时会报错,因为其中指定环境变量有问题,其中的大部分内容不需要改动,就是下面的文件的路径需要改,因为手动编译安装的libvirt安装路径在 /usr/local/sbin/libvirtd 或是 /usr/sbin/libvirtd ,修改以下两处:
[Service]
...
EnvironmentFile=/etc/sysconfig/libvirtd
ExecStart=/usr/sbin/libvirtd $LIBVIRTD_ARGS
...
需根据您系统中实际位置查找到对应位置,如果按照本文建议流程则路径同上,否则需自行查找,之后再次尝试启动即可,有可能需要重新加载一下服务。
systemctl daemon-reload
systemctl reload libvirtd
systemctl start libvirtd
即可启动成功,若不成功请留言。
- virt-manager 启动提示
virt qemu-sock no such file or directory
检查后应该是 virtqemud 服务没起来导致的,编译安装默认生成的服务路径在 /usr/local/* 下,而我们指定了安装在默认位置 /usr ,参考 systemd 无法启动的解决方法即可解决该问题。
首先看一下 /usr/sbin/virtqemud 这个文件是存在的,下面继续操作,首先使能该服务。
$ systemctl enable virtqemud
Created symlink from /etc/systemd/system/multi-user.target.wants/virtqemud.service to /usr/local/lib/systemd/system/virtqemud.service.
Created symlink from /etc/systemd/system/sockets.target.wants/virtqemud.socket to /usr/local/lib/systemd/system/virtqemud.socket.
Created symlink from /etc/systemd/system/sockets.target.wants/virtqemud-ro.socket to /usr/local/lib/systemd/system/virtqemud-ro.socket.
Created symlink from /etc/systemd/system/sockets.target.wants/virtqemud-admin.socket to /usr/local/lib/systemd
创建了改服务的软连接,宣告自启,此时服务配置有问题,直接修改该软连接指定的文件
vim /usr/local/lib/systemd/system/virtqemud.service
# 类比 libvirtd 的修改这两行,指定正确服务位置
[Service]
...
EnvironmentFile=-/etc/sysconfig/virtqemud
ExecStart=/usr/sbin/virtqemud $VIRTQEMUD_ARGS
之后重新加载服务,再启动
systemctl daemon-reload
systemctl reload virtqemud
systemctl start virtqemud
不出意外的话就能启动了,若有问题请留言。
参考文献
- libvirt Installation
- 使用 meson 编译代码
- Program rpcgen portable-rpcgen found: NO
- app-emulation/libvirt
- rpcsvc-proto-1.4.2
- data/meson.build:78:0: ERROR: Native dependency ‘glib-2.0’ not found
yum list- Libvirt 4.10.0编译安装
- Linux下编译安装qemu和libvirt【转】
- configure编译时提示:configure: error: you must configure in a separate build directory
- # 编译 qemu,libvirt, qemu rpm 包和 libvirt rpm 包
- meson+ninja build系统,使用meson & ninja 编译C工程
- 手动编译安装Libvirt之后利用systemctl管理libvirtd服务
- 17.3 systemctl 针对 service 类型的配置文件
- Systemd 入门教程:实战篇
C实现不用临时变量交换两个数的值(一行代码)
最近看到一个问题感觉很有意思:
“如何在不申请临时变量的情况下交换两个数的值?”
思考许久没有思路,查阅一番发现方法不少,在这里介绍四种方法:
方法一
void swap(int *p, int *q)
{
*a = *a ^ *b;
*b = *b ^ *a;
*a = *a ^ *b;
}
提示:异或运算符
^也称XOR运算符,它的规则是若参加运算的两个二进位同号,则结果为(假);异号为1(真)。即0 ^ 0 = 0,0 ^ 1 = 1,1 ^ 0 = 1,1 ^ 1 = 0。
计算实例:
a = 3 -> 0000 0011
b = 4 -> 0000 0100
step1:
a = a ^ b
-> 0000 0011
^ 0000 0100
= 0000 0111 -> 7
step2:
b = b ^ a
-> 0000 0100
^ 0000 0111
= 0000 0011 -> 3
step3:
a = a ^ b
-> 0000 0111
^ 0000 0011
= 0000 0100 -> 4
方法二
void swap(int *p, int *q)
{
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
方法三
void swap(int *p, int *q)
{
*a = *a + *b - (*b = *a);
}
C/C++中 (A = B) 返回得到是赋值号(=)的左面的值
计算实例:
a = 3;
b = 4;
a = 3 + 4 - (b = 3)
= 3 + 4 - 3
= 4;
-> a = 4;
-> b = 3;
方法四
void swap(int *p, int *q)
{
*a ^= *b ^= *a ^= *b;
}
计算实例:
a = 3;
b = 4;
a = 3 ^ 4 = 7;
b = 4 ^ 7 = 3;
a = 7 ^ 3 = 4;
-> a = 4;
-> b = 3;
参考文献
Linux 下 Shell 命令寻址顺序
起源
当出现 PATH 下有一个与系统命令重名的命令时,先执行哪一个呢?当 PATH 下有多个重名命令,会执行哪一个呢?这就涉及到 SHELL 执行命令的寻找顺序。
默认顺序
shel在执行命令时,并不是直接就在PATH路径中查找,而是按照固定的位置依次寻找命令。
搜索顺序如下,
1、别名,使用 alias 创建的命令。
2、关键字,如if,for。
3、函数
4、内置命令,如cd,pwd等
5、外部命令,在PATH路径中寻找
指定位置
如果我想执行的是我自己的程序cd呢?或者跳过1,2,3直接执行内置命令呢?那么这时候就用到command和builtin这两个命令了。
command,执行PATH下的命令。builtin,执行内置命令。
PATH中的查找顺序
linux执行命令时在 PATH 中的查找顺序是从前往后查找的。
如 /dir1 和 /dir2 目录下有同一个文件 test ,执行 export PATH=/dir1:/dir2:$PATH 之后,由于 dir1 在 dir2 前面,所以执行 test 时会执行 dir1 中的 test
所以一个比较好的习惯是,导出 PATH 时将新增的路径放在前面如:
export PATH=/xxx:$PATH
参考文献
Linux虚拟化入门(五)KVM 管理命令指南
qemu-img是QEMU的磁盘管理工具
格式: qemu-img command [command options]
command:
check 对磁盘镜像文件进行一致性检查,查找镜像文件中的错误
create 创建一个可以指定格式、大小、名称的镜像文件
convert 镜像文件格式转换
info 展示镜像文件的信息
virshkvm虚拟机管理工具
[root@node1 ~]# virsh help
command:
Domain Management (help keyword 'domain'):
attach-device 从一个XML文件附加装置
attach-disk 附加磁盘设备
attach-interface 获得网络界面
autostart 自动开始一个域
blkdeviotune 设定或者查询块设备 I/O 调节参数。
blkiotune 获取或者数值 blkio 参数
blockcommit 启动块提交操作。
blockcopy 启动块复制操作。
blockjob 管理活跃块操作
blockpull 使用其后端映像填充磁盘。
blockresize 创新定义域块设备大小
change-media 更改 CD 介质或者软盘驱动器
console 连接到客户会话
cpu-stats 显示域 cpu 统计数据
create 从一个 XML 文件创建一个域
define 从一个 XML 文件定义(但不开始)一个域
desc 显示或者设定域描述或者标题
destroy 销毁(停止)域
detach-device 从一个 XML 文件分离设备
detach-device-alias detach device from an alias
detach-disk 分离磁盘设备
detach-interface 分离网络界面
domdisplay 域显示连接 URI
domfsfreeze Freeze domain's mounted filesystems.
domfsthaw Thaw domain's mounted filesystems.
domfsinfo Get information of domain's mounted filesystems.
domfstrim 在域挂载的文件系统中调用 fstrim。
domhostname 输出域主机名
domid 把一个域名或 UUID 转换为域 id
domif-setlink 设定虚拟接口的链接状态
domiftune 获取/设定虚拟接口参数
domjobabort 忽略活跃域任务
domjobinfo 域任务信息
domname 将域 id 或 UUID 转换为域名
domrename rename a domain
dompmsuspend 使用电源管理功能挂起域
dompmwakeup 从 pmsuspended 状态唤醒域
domuuid 把一个域名或 id 转换为域 UUID
domxml-from-native 将原始配置转换为域 XML
domxml-to-native 将域 XML 转换为原始配置
dump 把一个域的内核 dump 到一个文件中以方便分析
dumpxml XML 中的域信息
edit 编辑某个域的 XML 配置
event Domain Events
inject-nmi 在虚拟机中输入 NMI
iothreadinfo view domain IOThreads
iothreadpin control domain IOThread affinity
iothreadadd add an IOThread to the guest domain
iothreaddel delete an IOThread from the guest domain
send-key 向虚拟机发送序列号
send-process-signal 向进程发送信号
lxc-enter-namespace LXC 虚拟机进入名称空间
managedsave 管理域状态的保存
managedsave-remove 删除域的管理保存
managedsave-edit edit XML for a domain's managed save state file
managedsave-dumpxml Domain information of managed save state file in XML
managedsave-define redefine the XML for a domain's managed save state file
memtune 获取或者数值内存参数
perf Get or set perf event
metadata show or set domain's custom XML metadata
migrate 将域迁移到另一个主机中
migrate-setmaxdowntime 设定最大可耐受故障时间
migrate-getmaxdowntime get maximum tolerable downtime
migrate-compcache 获取/设定压缩缓存大小
migrate-setspeed 设定迁移带宽的最大值
migrate-getspeed 获取最长迁移带宽
migrate-postcopy Switch running migration from pre-copy to post-copy
numatune 获取或者数值 numa 参数
qemu-attach QEMU 附加
qemu-monitor-command QEMU 监控程序命令
qemu-monitor-event QEMU Monitor Events
qemu-agent-command QEMU 虚拟机代理命令
reboot 重新启动一个域
reset 重新设定域
restore 从一个存在一个文件中的状态恢复一个域
resume 重新恢复一个域
save 把一个域的状态保存到一个文件
save-image-define 为域的保存状态文件重新定义 XML
save-image-dumpxml 在 XML 中保存状态域信息
save-image-edit 为域保存状态文件编辑 XML
schedinfo 显示/设置日程安排变量
screenshot 提取当前域控制台快照并保存到文件中
set-lifecycle-action change lifecycle actions
set-user-password set the user password inside the domain
setmaxmem 改变最大内存限制值
setmem 改变内存的分配
setvcpus 改变虚拟 CPU 的号
shutdown 关闭一个域
start 开始一个(以前定义的)非活跃的域
suspend 挂起一个域
ttyconsole tty 控制台
undefine 取消定义一个域
update-device 从 XML 文件中关系设备
vcpucount 域 vcpu 计数
vcpuinfo 详细的域 vcpu 信息
vcpupin 控制或者查询域 vcpu 亲和性
emulatorpin 控制火车查询域模拟器亲和性
vncdisplay vnc 显示
guestvcpus query or modify state of vcpu in the guest (via agent)
setvcpu attach/detach vcpu or groups of threads
domblkthreshold set the threshold for block-threshold event for a given block device or it's backing chain element
Domain Monitoring (help keyword 'monitor'):
domblkerror 在块设备中显示错误
domblkinfo 域块设备大小信息
domblklist 列出所有域块
domblkstat 获得域设备块状态
domcontrol 域控制接口状态
domif-getlink 获取虚拟接口链接状态
domifaddr Get network interfaces' addresses for a running domain
domiflist 列出所有域虚拟接口
domifstat 获得域网络接口状态
dominfo 域信息
dommemstat 获取域的内存统计
domstate 域状态
domstats get statistics about one or multiple domains
domtime domain time
list 列出域
Host and Hypervisor (help keyword 'host'):
allocpages Manipulate pages pool size
capabilities 性能
cpu-baseline 计算基线 CPU
cpu-compare 使用 XML 文件中描述的 CPU 与主机 CPU 进行对比
cpu-models CPU models
domcapabilities domain capabilities
freecell NUMA可用内存
freepages NUMA free pages
hostname 打印管理程序主机名
hypervisor-cpu-baseline compute baseline CPU usable by a specific hypervisor
hypervisor-cpu-compare compare a CPU with the CPU created by a hypervisor on the host
maxvcpus 连接 vcpu 最大值
node-memory-tune 获取或者设定节点内存参数
nodecpumap 节点 cpu 映射
nodecpustats 输出节点的 cpu 状统计数据。
nodeinfo 节点信息
nodememstats 输出节点的内存状统计数据。
nodesuspend 在给定时间段挂起主机节点
sysinfo 输出 hypervisor sysinfo
uri 打印管理程序典型的URI
version 显示版本
Interface (help keyword 'interface'):
iface-begin 生成当前接口设置快照,可在今后用于提交 (iface-commit) 或者恢复 (iface-rollback)
iface-bridge 生成桥接设备并为其附加一个现有网络设备
iface-commit 提交 iface-begin 后的更改并释放恢复点
iface-define define an inactive persistent physical host interface or modify an existing persistent one from an XML file
iface-destroy 删除物理主机接口(启用它请执行 "if-down")
iface-dumpxml XML 中的接口信息
iface-edit 为物理主机界面编辑 XML 配置
iface-list 物理主机接口列表
iface-mac 将接口名称转换为接口 MAC 地址
iface-name 将接口 MAC 地址转换为接口名称
iface-rollback 恢复到之前保存的使用 iface-begin 生成的更改
iface-start 启动物理主机接口(启用它请执行 "if-up")
iface-unbridge 分离其辅助设备后取消定义桥接设备
iface-undefine 取消定义物理主机接口(从配置中删除)
Network Filter (help keyword 'filter'):
nwfilter-define 使用 XML 文件定义或者更新网络过滤器
nwfilter-dumpxml XML 中的网络过滤器信息
nwfilter-edit 为网络过滤器编辑 XML 配置
nwfilter-list 列出网络过滤器
nwfilter-undefine 取消定义网络过滤器
nwfilter-binding-create create a network filter binding from an XML file
nwfilter-binding-delete delete a network filter binding
nwfilter-binding-dumpxml XML 中的网络过滤器信息
nwfilter-binding-list list network filter bindings
Networking (help keyword 'network'):
net-autostart 自动开始网络
net-create 从一个 XML 文件创建一个网络
net-define define an inactive persistent virtual network or modify an existing persistent one from an XML file
net-destroy 销毁(停止)网络
net-dhcp-leases print lease info for a given network
net-dumpxml XML 中的网络信息
net-edit 为网络编辑 XML 配置
net-event Network Events
net-info 网络信息
net-list 列出网络
net-name 把一个网络UUID 转换为网络名
net-start 开始一个(以前定义的)不活跃的网络
net-undefine undefine a persistent network
net-update 更新现有网络配置的部分
net-uuid 把一个网络名转换为网络UUID
Node Device (help keyword 'nodedev'):
nodedev-create 根据节点中的 XML 文件定义生成设备
nodedev-destroy 销毁(停止)节点中的设备
nodedev-detach 将节点设备与其设备驱动程序分离
nodedev-dumpxml XML 中的节点设备详情
nodedev-list 这台主机中中的枚举设备
nodedev-reattach 重新将节点设备附加到他的设备驱动程序中
nodedev-reset 重置节点设备
nodedev-event Node Device Events
Secret (help keyword 'secret'):
secret-define 定义或者修改 XML 中的 secret
secret-dumpxml XML 中的 secret 属性
secret-event Secret Events
secret-get-value secret 值输出
secret-list 列出 secret
secret-set-value 设定 secret 值
secret-undefine 取消定义 secret
Snapshot (help keyword 'snapshot'):
snapshot-create 使用 XML 生成快照
snapshot-create-as 使用一组参数生成快照
snapshot-current 获取或者设定当前快照
snapshot-delete 删除域快照
snapshot-dumpxml 为域快照转储 XML
snapshot-edit 编辑快照 XML
snapshot-info 快照信息
snapshot-list 为域列出快照
snapshot-parent 获取快照的上级快照名称
snapshot-revert 将域转换为快照
Storage Pool (help keyword 'pool'):
find-storage-pool-sources-as 找到潜在存储池源
find-storage-pool-sources 发现潜在存储池源
pool-autostart 自动启动某个池
pool-build 建立池
pool-create-as 从一组变量中创建一个池
pool-create 从一个 XML 文件中创建一个池
pool-define-as 在一组变量中定义池
pool-define define an inactive persistent storage pool or modify an existing persistent one from an XML file
pool-delete 删除池
pool-destroy 销毁(删除)池
pool-dumpxml XML 中的池信息
pool-edit 为存储池编辑 XML 配置
pool-info 存储池信息
pool-list 列出池
pool-name 将池 UUID 转换为池名称
pool-refresh 刷新池
pool-start 启动一个(以前定义的)非活跃的池
pool-undefine 取消定义一个不活跃的池
pool-uuid 把一个池名称转换为池 UUID
pool-event Storage Pool Events
Storage Volume (help keyword 'volume'):
vol-clone 克隆卷。
vol-create-as 从一组变量中创建卷
vol-create 从一个 XML 文件创建一个卷
vol-create-from 生成卷,使用另一个卷作为输入。
vol-delete 删除卷
vol-download 将卷内容下载到文件中
vol-dumpxml XML 中的卷信息
vol-info 存储卷信息
vol-key 为给定密钥或者路径返回卷密钥
vol-list 列出卷
vol-name 为给定密钥或者路径返回卷名
vol-path 为给定密钥或者路径返回卷路径
vol-pool 为给定密钥或者路径返回存储池
vol-resize 创新定义卷大小
vol-upload 将文件内容上传到卷中
vol-wipe 擦除卷
Virsh itself (help keyword 'virsh'):
cd 更改当前目录
echo echo 参数
exit 退出这个非交互式终端
help 打印帮助
pwd 输出当前目录
quit 退出这个非交互式终端
connect 连接(重新连接)到 hypervisor
参考文献
Linux虚拟化入门(四)KVM 创建一个 Centos 实例
前提条件
- 完整 KVM 环境
- Centos 镜像
步骤
- 第一步、创建磁盘
qemu-img create -f qcow2 centos_kvm1.qcow2 16G
- 第二步、安装虚拟机
virt-install \
--virt-type=kvm \
--name=centos-kvm \
--hvm \
--vcpus=1 \
--memory=1024 \
--cdrom=/srv/kvm/CentOS-7-x86_64-Minimal-1810.iso \
--disk path=/srv/kvm/centos_kvm1.qcow2,size=16,format=qcow2 \
--graphics vnc,password=kvm,listen=::,port=5911 \
--network bridge=virbr0 \
--autostart \
--force
安装成功后使用任意一个可以访问KVM宿主机的带有桌面的设备上的 VNC viewer 进入 YourIp:5911 输入密码 kvm 就可以进入虚拟机,然后继续安装了。
- 第三步、基础操作
virsh list --all # 查看所有运行和没有运行的虚拟机
virsh list # 查看在运行的虚拟机
virsh dumpxml vm-name # 查看kvm虚拟机配置文件
virsh start vm-name # 启动kvm虚拟机
virsh shutdown vm-name # 正常关机
virsh destroy vm-name # 非正常关机,强制关闭虚拟机(相当于物理机直接拔掉电源)
virsh undefine vm-name # 删除vm的配置文件
virsh define file-name.xml # 根据配置文件定义虚拟机
virsh suspend vm-name # 挂起,终止
virsh resumed vm-name # 恢复被挂起的虚拟机
virsh autostart vm-name # 开机自启动vm
virsh console <虚拟机名称> # 连接虚拟机
install 常用参数说明展开目录
–name指定虚拟机名称
–memory分配内存大小。
–vcpus分配CPU核心数,最大与实体机CPU核心数相同
–disk指定虚拟机镜像,size指定分配大小单位为G。
–network网络类型,此处用的是默认,一般用的应该是bridge桥接。
–accelerate加速
–cdrom指定安装镜像iso
–vnc启用VNC远程管理,一般安装系统都要启用。
–vncport指定VNC监控端口,默认端口为5900,端口不能重复。
–vnclisten指定VNC绑定IP,默认绑定127.0.0.1,这里改为0.0.0.0。
–os-type=linux,windows
–os-variant=rhel6
--name 指定虚拟机名称
--ram 虚拟机内存大小,以 MB 为单位
--vcpus 分配CPU核心数,最大与实体机CPU核心数相同
–-vnc 启用VNC远程管理,一般安装系统都要启用。
–-vncport 指定VNC监控端口,默认端口为5900,端口不能重复。
–-vnclisten 指定VNC绑定IP,默认绑定127.0.0.1,这里改为0.0.0.0。
--network 虚拟机网络配置
# 其中子选项,bridge=br0 指定桥接网卡的名称。
–os-type=linux,windows
–os-variant=rhel7.2
--disk 指定虚拟机的磁盘存储位置
# size,初始磁盘大小,以 GB 为单位。
--location 指定安装介质路径,如光盘镜像的文件路径。
--graphics 图形化显示配置
# 全新安装虚拟机过程中可能会有很多交互操作,比如设置语言,初始化 root 密码等等。
# graphics 选项的作用就是配置图形化的交互方式,可以使用 vnc(一种远程桌面软件)进行链接。
# 我们这列使用命令行的方式安装,所以这里要设置为 none,但要通过 --extra-args 选项指定终端信息,
# 这样才能将安装过程中的交互信息输出到当前控制台。
--extra-args 根据不同的安装方式设置不同的额外选项
参考文献
Linux虚拟化入门(三)Fedora 安装 KVM 管理环境
部署步骤
- 第一步、检查环境要求
使用如下命令检查您的 CPU 是否支持虚拟化:
$ egrep '^flags.*(vmx|svm)' /proc/cpuinfo
如果没有任何输出,则说明您的系统不支持相关扩展功能。您仍然可以使用 QEMU/KVM ,但是虚拟将只能使用软件虚拟化(想当慢)。
- 第二步、安装虚拟化软件包
当安装 Fedora 时,可以通过勾选安装基本组中的虚拟化组以安装虚拟化软件包。
在已经完成 Fedora 安装的系统中, QEMU、KVM和其他一些虚拟化工具的安装可以通过运行如下命令安装虚拟化组:
su -c "yum install @virtualization"
该命令将安装 qemu-kvm、 python-virtinst、 qemu、 virt-manager、 virt-viewer 以及所有需要的依赖软件包。
su -c "systemctl start libvirtd"
确认所有 kvm 内核模块已正常加载:
$ lsmod | grep kvm
kvm_amd 55563 0
kvm 419458 1 kvm_amd
如果该命令没有列出 kvm_intel 或 kvm_amd, 则说明 KVM 没有正常配置。参看 确保系统正常使用 KVM 以获得解决问题的建议。
- 第三步、使用虚拟机
您可以使用命令行工具 virsh 管理虚拟机。 你可以在命令行下使用 virsh 工具管理guest 。 virsh 工具是基于 libvirt 管理 API 实现的:
virsh有一套稳定的命令,其语法与虚拟化平台无关。virsh可以作为仅有只读权限的工具使用(如:列出所有主机及其统计信息)。virsh可以管理 Xen,Qemu/KVM,esx 及其他一些类具有相同贵发后端下的主机。
一个有效地址可以使用 “-c” 参数传递给 virsh 来连接到远程 libvirtd 实例。详情请参看 http://libvirt.org/uri.html
如下命令启动虚拟机:
su -c "virsh create <name of virtual machine>"
要列出当前运行的虚拟机,执行:
su -c "virsh list"
列出所有虚拟机(不管是否运行):
su -c "virsh list --all"
正常关闭 guest :
su -c "virsh shutdown <virtual machine (name | id | uuid)>"
强制关闭 guest :
su -c "virsh destroy <virtual machine (name | id | uuid)>"
保存虚拟机快照到文件:
su -c "virsh save <virtual machine (name | id | uuid)> <filename>"
从快照恢复虚拟机:
su -c "virsh restore
<filename>"
导出虚拟机配置文件:
su -c "virsh dumpxml <virtual machine (name | id | uuid)"
列出全部 virsh 可用命令:
su -c "virsh help"
也可以查看手册: man 1 virsh