linux随笔
1.系统信息
-
查看linux内核信息
uname -a cat /proc/version
-
查看cpu信息
cat /proc/cpuinfo
-
查看内存信息
cat /proc/meminfo
-
查看模块信息
cat /proc/moduels
-
查看支持的文件类型
cat /proc/filesystems
-
查看内核参数
sysctl -a
2.网络
-
存放端口的文件
cat /etc/services
-
显示所有网络接口的详细信息
ip addr show
-
显示指定网络接口的详细信息
ip addr show eth0
-
启用或禁用指定的网络接口
ifup eth0 ifdown eth0
-
为指定的网络接口添加 IP 地址
ip address add 192.168.2.3/24 dev eth0
-
从指定的网络接口删除 IP 地址
ip address del 192.168.2.3/24 dev eth0
-
显示路由信息
ip route show
-
添加路由
ip route add 192.168.2.0/24 via 10.0.0.1 dev eth0
-
删除路由
ip route del 192.168.2.0/24
-
添加DNS
echo "nameserver 114.114.114.114" >/etc/resolv.conf
-
修改网卡名
-
vim编辑/etc/sysconfig/network-scripts/ifcfg-<old_name>
DEVICE=new_name
-
重命名网卡文件
mv /etc/sysconfig/network-scripts/ifcfg-<old_name> /etc/sysconfig/network-scripts/ifcfg-<new_name>
-
vim编辑/etc/default/grub
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"
-
更新grub配置
grub2-mkconfig -o /boot/grub2/grub.cfg
-
重启网卡
systemctl restart network
-
3.TCP/UDP
-
显示连接,端口信息
netstat -ntlup
ss -ntlp
-
查看端口占用
netstat -tuln
ss -tuln
lsof -i :[port]
-
参数说明
`-t 显示tcp连接` `-u 显示udp连接` `-l 仅显示监听端口` `-n 一数字形式显示端口`
-
查看网络流量
netstat -i || iftop -i eth0 || nload -m || tcpdump -i <interface> -n || iftop -i <interface>
-
tcpdump使用
tcpdump [参数] [网卡]
-
指定要监听的网络接口
tcpdump -i eth0
-
指定捕获的数据包数量
tcpdump -i eth0 -c 10
-
将捕获的数据包写入文件中。
tcpdump -i eth0 -c 20 -w file.pcap
-
从文件中读取数据包进行分析
tcpdump -r file.pcap
-
其他参数说明
`-n:禁用地址解析。` `-nn:禁用地址和端口的解析。` `-e:显示以太网头部信息。 `-v:显示详细的输出信息。 `-X:以十六进制和ASCII码显示数据包内容。` `-q:以更简洁的方式显示输出。` `port <port>:捕获指定端口的数据包。` `host <host>:捕获指定主机的数据包。` `src <ip>:捕获指定源IP地址的数据包。` `dst <ip>:捕获指定目标IP地址的数据包。` `tcp:只捕获TCP协议的数据包。` `udp:只捕获UDP协议的数据包。`
4.备份,计划任务
-
计划任务
* * * * * command
-
参数说明
`第一个星号表示分钟,范围是0-59,*表示每分钟。` `第二个星号表示小时,范围是0-23,*表示每小时。` `第三个星号表示天,范围是1-31,*表示每天。` `第四个星号表示月,范围是1-12,*表示每月。` `第五个星号表示星期,范围0-6,其中0表示星期日,*表示一周中每一天`
-
在每个星期天的2:30 执行任务
30 2 * * 0 command
-
mysqldump备份
mysqldump -u <用户名> -p<密码> <数据库名称> > /path/to/backup.sql
-
不暴露密码形式备份
-
编辑my.cnf文件
[mysqldump] user=<用户名> password=<密码>
-
备份
mysqldump --defaults-extra-file=/path/to/mysql.cnf <数据库名称> >/path/to/backup.sql
-
-
xtrabackup 备份
-
参数说明
`--backup:执行备份操作。` `--prepare:执行备份文件的准备操作,将备份文件准备为可用于恢复的状态。` `--restore:执行恢复操作,用于将备份文件还原到数据库。` `--target-dir=<路径>:指定存储备份文件的目录路径。` `--user=<用户名>:指定连接数据库时使用的用户名。` `--password=<密码>:指定连接数据库时使用的密码。` `--datadir=<路径>:指定数据库的数据目录路径。` `--compress:启用备份数据的压缩。` `--compress-threads=<线程数>:指定用于压缩的线程数。` `--compress-chunk-size=<大小>:指定压缩块的大小。` `--parallel=<线程数>:指定备份和恢复操作并行执行的线程数。` `--incremental:执行增量备份。` `--incremental-basedir=<路径>:指定增量备份基于的全备份路径。` `--incremental-dir=<路径>:指定增量备份的存储目录路径。` `--no-lock:在备份和恢复操作时不使用锁定表的方式。` `--tables=<表名>:备份指定的表。` `--databases=<数据库名>:备份指定的数据库。` `--exclude=<表名或数据库名>:在备份过程中排除指定的表或数据库`
-
mysql全量备份
xtrabackup --backup --user=<用户名> --password=<密码> \ --target-dir=/path/to/backup
-
mysql增量备份(确保已经进行了全量备份)
xtrabackup --backup --user=<用户名> --password=<密码> \ --target-dir=/path/to/incremental_backup --incremental-basedir=/path/to/full_backup
-
mysql压缩备份
xtrabackup --backup --user=<用户名> --password=<密码> \ --target-dir=/path/to/backup --compress
-
mysql指定库备份
xtrabackup --backup --user=<用户名> --password=<密码> \ --databases=<数据库名> --target-dir=/path/to/backup
-
mysql 指定主机,数据目录备份
xtrabackup --host 192.168.12.12 --port 3306 \ --backup --user=root --password='123456' \ --target-dir=/tmp/backup --datadir=/root/mysql/data
-
隐藏密码形式备份
-
准备 backup.cnf文件
[xtrabackup] backup user=root password=password
-
执行命令
xtrabackup --defaults-file=backup.cnf \ --databases "database_name1,database_name2" --backup-dir=/path/to/backup
-
-
mysql备份恢复(xtrabackup)
-
准备恢复配置文件
xtrabackup --prepare --target-dir=/path/to/backup
-
关闭mysql服务
docker stop mysql
-
恢复
xtrabackup --copy-back --target-dir=/path/to/backup --datadir=<指定恢复数据目录>
-
设置文件权限(非docker安装)
# 根据您的MySQL数据目录路径进行调整 chown -R mysql:mysql /var/lib/mysql
-
启动mysql服务
docker restart mysql
-
-
vmwre(ubuntu)和主机互动
sudo apt-get autoremove open-vm-tools //卸载已有的工具 sudo apt-get install open-vm-tools //安装工具open-vm-tools sudo apt-get install open-vm-tools-desktop //安装open-vm-tools-desktop
5.shell
-
sed使用
-
参数说明
`-n:取消默认输出,只打印被修改过的文本。不显示输入行。` `-e:后跟要执行的命令,并允许同时指定多个命令。` `-f:指定要从文件中读取的命令。可以在文件中包含一个或多个命令。` `-i:直接在原始文件中进行编辑,而不是将结果输出到标准输出。` `-r:启用扩展正则表达式。` `-s:安静模式,处理多个文件时遇到错误时不显示错误信息。` `1,3d:删除指定行范围内的行。` `/pattern/:使用模式匹配来选择行。` `s/pattern/replacement/:将匹配到的模式替换为指定的字符串。` `p:打印当前处理的行。` `a\text:在当前行后追加指定的文本。` `i\text:在当前行前插入指定的文本。` `c\text:用指定的文本替换当前行。` `& 已匹配字符串标记。`
-
在包含特定内容所在行的后面添加一行
sed '/pattern/ a\ <str>' file.txt -i
-
在包含特定内容所在行的前面添加一行
sed '/pattern/ i\ <str>' file.txt -i
-
将包含特定内容所在行替换
sed '/pattern/ c\ <str>' file.txt -i
-
将hello替换为HELLO
sed 's/hello/HELLO/' file.txt
-
打印特定行
sed 'np' file.txt
-
打印包含hello的行
sed -n '/hello/p' file.txt
-
删除包含hello的行
sed '/hello/d' file.txt
-
删除1-3行
sed '1,3d' file.txt
-
匹配至少出现2次d的行并删除
sed -r '/d{2,}/d' file.txt
-
匹配str于str之间的行
# file.txt [redis] 192.168.2.3 192.168.2.4 192.168.2.5 [docker] 192.168.2.6 192.168.2.7 192.168.2.8 [mysql] 192.168.2.9 192.168.2.10 192.168.2.11 [nginx] 192.168.2.12 192.168.2.13 192.168.2.14 [all:vars] ansible_user=root ansible_ssh_password=123456 # 匹配[redis]于[docker]之间的内容 sed -n '/^\[redis\]/,/^\[docker\]/p' file.txt | egrep -v "^\[.*\]$" # 输出 192.168.2.3 192.168.2.4 192.168.2.5
-
将匹配的内容用双引号包裹
sed 's/.*/"&"/' file.txt
-
获取脚本自身的PID
#!/bin/bash pid=$$ echo "脚本的进程ID是: $pid"
-
sed高级
-
参数说明
`w: 表示把行写入一个文件。` `x: 表示互换模板块中的文本和缓冲区中的文本。` `y: 表示把一个字符翻译为另外的字符(但是不用于正则表达式)。` `\1: 子串匹配标记。` `D 删除模板块的开端至\n即第一行。` `h 拷贝模板块的内容到内存中的缓冲区。` `H 追加模板块的内容到内存中的缓冲区。` `g 获得内存缓冲区的内容,并替代当前模板块中的文本。` `G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。` `n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。` `N 追加下一个输入行到模板块后面即"1\n2"形式。` `p 打印模板块的行。` `P(大写)打印模板块的开端至\n即第一行。` `b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。` `r file 从file中读行。`
-
打印奇数行
# 先执行命令p打印第1行,接着执行n跳过第2行,接着打印第3行,执行到行尾 sed '{p;n}' file.txt
-
打印偶数行
# 先执行命令n跳过第1行,接着执行n打印第2行,接着跳过第3行,执行到行尾 sed '{n;p}' file.txt
-
删除奇数行
# 先删除第1行,执行n跳到删除后的第2行,即源文本的第3行,执行到结尾 sed '{1d; n; d}' file.txt
-
删除偶数行
sed '{n; d}' file.txt
-
为每一行后面添加空行
sed '{G}' file.txt
-
为每一行后面添加空行并删除最后一行空行
sed '{G}' file1.txt | sed '$d'
-
交换行内容
# 所有行都进行交换 sed 'N;s/\(.*\)\n\(.*\)/\2\n\1/' file.txt # 交换匹配行(要加.*) sed 'N;s/\(test.*\)\n\(check.*\)/\2\n\1/' file3.txt
-
将匹配到的内容添加到行尾
sed -e '/test/h' -e '$G' file
-
sed流程控制
# 跳过包含Line 3所在行并将其他行Line替换成Word sed '/Line 3/ b; s/Line/Word/' file4.txt
-
awk高级
-
文本
cp /etc/passwd ./passwd.txt # cat passwd.txt root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin news:x:9:9:news:/var/spool/news:/usr/sbin/nologin uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin proxy:x:13:13:proxy:/bin:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin backup:x:34:34:backup:/var/backups:/usr/sbin/nologin list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin _apt:x:100:65534::/nonexistent:/usr/sbin/nologin systemd-network:x:101:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin systemd-resolve:x:102:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin messagebus:x:103:104::/nonexistent:/usr/sbin/nologin systemd-timesync:x:104:105:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin pollinate:x:105:1::/var/cache/pollinate:/bin/false sshd:x:106:65534::/run/sshd:/usr/sbin/nologin syslog:x:107:113::/home/syslog:/usr/sbin/nologin uuidd:x:108:114::/run/uuidd:/usr/sbin/nologin tcpdump:x:109:115::/nonexistent:/usr/sbin/nologin tss:x:110:116:TPM software stack,,,:/var/lib/tpm:/bin/false landscape:x:111:117::/var/lib/landscape:/usr/sbin/nologin fwupd-refresh:x:112:118:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologin usbmux:x:113:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin user:x:1000:1000:root:/home/user:/bin/bash lxd:x:999:100::/var/snap/lxd/common/lxd:/bin/false bind:x:114:119::/var/cache/bind:/usr/sbin/nologin
-
Awk基本语法结构
awk 'BEGIN { initialization } pattern { action } END { finalization }' file.txt
-
BEGIN 块
(可选):在处理输入之前执行一次的初始化操作,例如设置变量的初始值。 -
pattern
:模式,用于匹配输入中的特定行。 -
action
:动作,在匹配的行上执行的操作。 -
END块
(可选):在处理输入完毕后执行一次的收尾操作,例如输出最终结果。 -
模式和动作的使用
-
模式:用于匹配特定的行或条件,可以使用正则表达式、关系表达式等。
-
动作:在匹配行上执行的操作,可以是打印、赋值、计算等。
# 示例:打印包含"pattern"的行 awk '/pattern/ { print }' passwd.txt
-
打印行号及行内容
awk '{print NR,$0}' passwd.txt
-
打印以root开头的行
awk -F: '/^root/{print}' passwd.txt
-
打印以bash结尾的行
awk -F: '/bash$/{print}' passwd.txt
-
打印第3列值<500的行
awk -F: '$3<500{print}' passwd.txt
-
打印第3列值>500&&<1000的行
awk -F: '$3>500&&$3<1000{print}' passwd.txt
-
打印偶数行并显示行数
awk 'NR%2==0{print NR,$0}' passwd.txt
-
打印奇数行并显示行数
awk 'NR%2!=0{print NR,$0}' passwd.txt
-
统计行数
awk 'BEGIN{x=0} {x++} END {print x}' passwd.txt
- 内置变量
NR
:当前行的行号。NF
:当前行的字段数。$0
:当前行的内容。$1
、$2
、$3
等:当前行的第一个、第二个、第三个字段等。
- 内置函数
-
length(str)
:返回字符串的长度。awk 'BEGIN { str = "Hello, World!"; len = length(str); print len }' # 输出: 13
-
substr(str, start, length)
:返回字符串的子串。awk 'BEGIN { str = "Hello, World!"; sub = substr(str, 1, 5); print sub }' # 输出: Hello
-
index(str, substr)
:返回子串在字符串中的位置。awk 'BEGIN { str = "Hello, World!"; pos = index(str, "World"); print pos }' # 输出: 8
-
split(str, array, sep)
:将字符串拆分为数组元素。awk 'BEGIN { str = "apple,banana,orange"; split(str, fruits, ","); print fruits[2] }' # 输出: banana
-
toupper(str)
:将字符串转换为大写。awk 'BEGIN { str = "Hello, World!"; upper = toupper(str); print upper }' # 输出: HELLO, WORLD!
-
tolower(str)
:将字符串转换为小写。awk 'BEGIN { str = "Hello, World!"; lower = tolower(str); print lower }' # 输出: hello, world!
-
int(x)
:返回不大于x的最大整数。awk 'BEGIN { x = 4.7; result = int(x); print result }' # 输出: 4
-
说明
!a[$0]++ 的含义是: 判断行的值是否已经存在于数组a中,如果不存在,则将该字段添加到数组中,并将其值加1 a[$0]++的含义是: 将第行的值作为数组a的键,然后将该键对应的值加1
-
去除重复行
# 以第7列为基准去除重复行 awk -F: '!a[$7]++{print $7}' passwd.txt # 输出 /bin/bash /usr/sbin/nologin /bin/sync /bin/false
-
统计重复行次数
# 统计文件中不同单词的出现次数 awk -F: '{!count[$7]++} END {for(i in count) print i, count[i]}' passwd.txt 或者 awk -F: '{ count[$7]++ } END { for (i in count) print i, count[i] }' passwd.txt # 输出 /bin/sync 1 /bin/bash 2 /bin/false 3 /usr/sbin/nologin 29
-
条件语句和循环结构:Awk支持if-else语句和for循环,可实现更复杂的逻辑操作。
# 计算文件中大于平均值的数的个数 awk '{ sum += $1;v[$1]++} END { avg = sum / NR; for(i in v) if(i>avg) count++; print count,sum,avg }' numbers.txt
-
使用函数:除了内置函数,Awk还可以定义自定义函数,以便重复使用特定的操作。
-
将字符串反转并返回
function reverse_str(str) { result = "" for (i = length(str); i > 0; i--) result = result substr(str, i, 1) return result } # 逐行处理 { reversed = reverse_str($0) print reversed } # 执行 awk -f reverse_str.awk passwd.txt
-
字符串拆分为数组元素
function split_str(str,array,sep) { return split(str,array,sep) } # 逐行处理 { split_str($0,array,":") print array[2] } # 执行 awk -f split_str.awk passwd.txt
-
awk格式化输出printf
%s: 字符占位符 %d: 数字占位符 %.2f: 小数占位符 %-s : 左对齐 %+s : 右对齐
-
案例
awk 'BEGIN{FS=":"}{printf "%s\n",$1}' passwd awk 'BEGIN{FS=":"}{printf "%20s" "%20s\n",$1,$7}' passwd awk 'BEGIN{FS=":"}{printf "%-20s" "%-20s\n",$1,$7}' passwd awk 'BEGIN{FS=":"}{printf "%d\n",$3}' passwd
-
求平均数案例
##文本 cat student.txt Allen 90 80 77 85 Joe 88 76 89 92 Rose 76 98 99 100 Jack 89 70 95 80 awk '{total=$2+$3+$4+$5;Avg=total/4}{printf "%-10s%-8d%-8d%-8d%-8d%-0.2f\n",$1,$2,$3,$4,$5,Avg}' student.txt awk 'BEGIN{printf "%-10s%-8s%-8s%-8s%-8s%-8s\n","Name","Math","English","Chinese","Physical","Avg"}{total=$2+$3+$4+$5;Avg=total/4}{printf "%-10s%-8d%-8d%-8d%-8d%-0.2f\n",$1,$2,$3,$4,$5,Avg}' student.txt
awk条件语句
- 打印passwd文件第3列大于50小于100的值
awk 'BEGIN{FS=":"}{if($3>50 && $3<100) print $0}' /etc/passwd
- awk文件形式
# script.awk BEGIN{ FS=":" } { if($3<50) { printf "%-28s%-25s%-5d\n","小于50的uid",$1,$3 } else if($3>50 && $3<100) { printf "%-25s%-25s%-5d\n","大于50且小于100的uid",$1,$3 } else { printf "%-28s%-25s%-5d\n","大于100的uid",$1,$3 } }
- 引用 script.awk
awk -f script.awk /etc/passwd
awk循环语句
-
while 循环
# cat while.awk BEGIN{ while(i<=100) { sum+=i i++ } print sum }
-
do while 循环
# 语法 do { 动作 }while(条件表达式) # do_while.awk BEGIN{ do { sum+=i i++ }while(i<=100) print sum }
-
for 循环
# 语法 for(i=0;i<=100;i++) { 动作 } # for.awk BEGIN{ for(i=0;i<=100;i++) { sum+=i } print sum }
-
awk案例
需求:给表格添加表头,并新增Avg列,打印平均成绩>85的列,求出满足条件的成绩和
cat> student.txt<<EOF Allen 90 80 77 85 Joe 88 76 89 92 Rose 76 98 99 100 Jack 89 70 95 80 EOF
BEGIN{ printf "%-10s%-10s%-10s%-10s%-10s%-10s\n","Name","Math","English","Chinese","Physical","Avg" } { total=$2+$3+$4+$5 Avg=total/4 if(Avg>85) { printf "%-10s%-10d%-10d%-10d%-10d%-0.2f\n",$1,$2,$3,$4,$5,Avg # 每遍历一行保留一个值 score_math+=$2 score_english+=$3 score_chinese+=$4 score_physical+=$5 } } END{ printf "%-10s%-10d%-10d%-10d%-10d\n","",score_math,score_english,score_chinese,score_physical } # 输出 Name Math English Chinese Physical Avg Joe 88 76 89 92 86.25 Rose 76 98 99 100 93.25 164 174 188 192
字符串函数
-
内置
length(str): 计算长度 index(str1,str2): 返回在str1中查询到的str2的位置 tolower(str): 小写转换 toupper(str): 大写转换 split(str,arr,fs): 分隔字符串,并保存到数组中 match(str,RE): 返回正则表达式匹配到的子串的位置 substr(str,m,n): 截取子串,从m个字符开始,截取n位。n若不指定,则默 sub(RE,RepStr,str): 替换查找到的第一个子串 gsub(RERepStr,str): 替换查找到的所有子串
-
以:为分隔符,返回/etc/passwd中每行中每个字段的长度
# simple_1.twk BEGIN{ FS=":" } { i=1 while(i<=NF) { if(i==NF) printf "%d",length($i) else printf "%d:",length($i) i++ } print "" }
-
搜索字符串"I have a dream"中出现"ea"字符串的位置
awk 'BEGIN{str="I have a dream";location=index(str,"ea");print location}'
-
将字符串"Hadoop is a bigdata Framawork"全部转换为小写
awk 'BEGIN{str="Hadoop is a bigdata Framawork";low_str=tolower(str);print low_str}'
-
将字符串"Hadoop is a bigdata Framawork"全部转换为大写
awk 'BEGIN{str="Hadoop is a bigdata Framawork";up_str=toupper(str);print up_str}'
-
将字符串"Hadoop Kafka Spark Storm HDFS YARN Zokeeper",按照空格为分隔符,分隔每部分保存到数组中
awk 'BEGIN{str="Hadoop Kafka Spark Storm HDFS YARN Zokeeper";split(str,arr," ");for(a in arr) print arr[a]}'
-
搜索字符串"Tranction 2345 Start:Select*from master"第一个数字出现的位置
awk 'BEGIN{str="Tranction 2345 Start:Select*from master";location=match(str,/[0-9]/);print location}'
-
截取字符串"transaction start"的子串,截取条件从第4个字符开始,截取5位
awk 'BEGIN{str="transaction start";print substr(str,4,5)}'
-
替换字符串"Tranction 243 Start,EventID:9002"中第一个匹配到的数字串为$符号
awk 'BEGIN{str="Tranction 243 Start,EventID:9002";sub(/[0-9]+/,"$",str);print str}'
-
替字符串"Tranction 243 Start,EventID:9002"中所有匹配到的数字串为$符号
awk 'BEGIN{str="Tranction 243 Start,EventID:9002";gsub(/[0-9]+/,"$",str);print str}'
6. 故障处理
poweroff 关机慢问题
Error: dracut Warning: Cannot umount /oldroot
# 解决方法
Solutions: dracut -f
crictl 使用报错
报错:
ERRO[0000] validate service connection: validate CRI v1 runtime API for endpoint "unix:///var/run/dockershim.sock": rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing: dial unix /var/run/dockershim.sock: connect: no such file or directory"
解决:
cat >> /etc/crictl.yaml<<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
systemctl restart containerd
ubuntu安装kvm
- 检测是否支持安装
# 大于0表示支持
egrep -c '(vmx|svm)' /proc/cpuinfo
- 安装
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager
- 加载
sudo modprobe kvm
- 将当前用户加入(不使用sudo即可管理虚拟机)
sudo usermod -aG libvirt $(whoami)
- 启动
sudo systemctl enable libvirtd.service --now
- 验证
kvm-ok
安装uefi模式虚拟机
- 创建磁盘
qemu-img create -f qcow2 /data/kvm/kvm01.qcow2 15G
- 安装支持uefi的模块
sudo apt -y install ovmf
- 安装
virt-install --name=kvm01 --os-type=linux --os-variant=rhel7.0 --vcpu=2 --ram=3072 --disk path=/data/kvm/kvm01.qcow2 --graphics spice --cdrom=/home/user/CentOS-7-9.iso --network network=default --boot uefi
- 配置开启console连接(centos)
# 在要连接的虚拟机上配置
grubby --update-kernel=ALL --args="console=ttyS0"
克隆虚拟机
#!/bin/bash
kvm_xml_dir=/home/user/kvm
kvm_old_disk=`virsh dumpxml ${1} |grep "<source file"|awk -F"'" '{print $2}'`
kvm_disk_dir=`dirname ${kvm_old_disk}`
# 复制磁盘
cp -p ${kvm_old_disk} ${kvm_disk_dir}/${2}.qcow2
# 通过已存在的虚拟机生成新的虚拟机配置文件
virsh dumpxml ${1} >${kvm_xml_dir}/${2}.xml
# 更改虚拟机配置
sed -i '/<uuid>/d' ${kvm_xml_dir}/${2}.xml
sed -i '/<mac address/d' ${kvm_xml_dir}/${2}.xml
sed -ri "s#(<name>)(.*)(</name>)#\1${2}\3#g" ${kvm_xml_dir}/${2}.xml
sed -ri "s#(<source file=')(.*)('/>)#\1${kvm_disk_dir}/${2}.qcow2\3#g" ${kvm_xml_dir}/${2}.xml
# 定义虚拟机
virsh define ${kvm_xml_dir}/${2}.xml
# 开启虚拟机
virsh start ${2}