山中也有千年树,世上难逢百岁人。
导航
- Shell 内置
- 系统命令
- 磁盘/文件系统
- 文件权限/属性
- 文本处理
- 用户/组管理
- 任务管理
- 杂项
- 特殊指令集合
Shell 内置
- history:命令行历史记录。例,
history -c会清空 shell 的历史缓冲区和本次缓冲区,退出 shell 时由于本次缓冲区无数据故不会追加到 .bash_history 文件。【工作方式:打开一个 shell 时,shell 会加载家目录下 .bash_history 目录中的历史记录到 历史缓冲区 供本次使用。而本 shell 中新增的命令会被记录到 本次缓冲区 ,当 shell 关闭时会将 本次缓冲区 的记录 追加 到 .bash_history 供下次使用。】 - alias:用于创建一个别名,unalias 用于移除一个别名。
- type:查询可执行命令属于 Shell 内建命令还是别名命令、外置命令、函数、关键字等。例,
type -a cmd输出该 cmd 相关的所有信息。 - unset:将 shell 环境中已定义的变量或函数进行删除,以阻止后面去调用。脚本编写中的某些特定情况可能会用到。未定义变量而 echo 时其值为空。
- let:将字符串表示的数字表达式进行数学计算。例,
let "a=(1+2)*3/2" "b=(1+4)"将计算结果分别赋值给 a、b。 - expr:同 let 一样都是用于计算表达式的值。但是它支持的功能更多,关系运算、算数运算、字符串匹配、截取、获取长度等相关运算,非 shell 内置命令。例,
expr match abcd 'a\(..\)d'将输出匹配到的值 bc,expr match abcd 'a..d'将输出匹配到字串的总长度 4。匹配不到则返回 0;expr substr abcde 2 3截取字串 bcd;expr length abcd计算字串长度。 - eval:将字符串中的数据当做命令在 bash 中执行。
- exec:用于调用并执行指定的命令。该命令通常用在 shell 脚本程序中,用于将脚本标准 IO 流重定向,即脚本执行日志记录的功能。如果在当前终端中使用命令,则当指定的命令执行完毕后会立即退出终端。【1、当携带指定命令。会将当前 shell 进程替换为指定命令程序,程序结束则该 shell 进程也被终结。2、不携带命令。会重定向当前 shell 的所有标准 IO 流到指定位置。】
- export/declare:可将自定义变量转化为环境变量。
系统命令
- uname:用于查询系统核心的相关信息。
- free:观察内存使用情况。
- vmstat:侦测系统资源变化。
- uptime:用于观察系统的启动时间以及工作负载的情况。
- pv:显示管道数据传输的进度信息,具有进度条、已耗费时间、当前速度等功能。pv 本身具有类似 cat 的功能,但其可以监视与其连接的管道进度,而无需关注 pv 本身是写入方还是接收方均可监视管道。【例,(1)
pv test.txt > test2.txt可查看拷贝文件的进度;(2)tcpdump -i eth -w - | pv >/dev/null查看网卡的网速;(3)pv test.txt | gzip > text.gz查看压缩进度;】 - dmesg:可以查询系统核心产生的日志信息。系统在开机的时候,核心会去侦测系统的硬件,你的某些硬件到底有没有被捉到,那就与这个时候的侦测有关。 但是这些侦测的过程要不是没有显示在屏幕上,就是很飞快的在屏幕上一闪而逝!能不能把核心侦测的讯息捉出来瞧瞧? 可以的,那就使用 dmesg 吧!所有核心侦测的讯息,不管是开机时候还是系统运作过程中,反正只要是核心产生的讯息,都会被记录到内存中的某个保护区段。 dmesg 这个指令就能够将该区段的讯息读出来的!因为讯息实在太多了,所以执行时可以加入这个管线指令
| more来使画面暂停! - journalctl : 查看由 systemd 服务统一管理的所有服务的启动日志,但也会包括开机引导 boot 启动过程日志。【(1)
journalctl默认情况下查看的是历史所有日志,它会将/var/log/journal/*中的所有存储的历史文件全部解析显示;(2)journalctl -xk查看本次开机之后的所有日志,-x 选项表示会对个别日志信息进行解释说明的功能;(3)journalctl --unit = ssh.service查看某服务的日志;(4)journalctl -g ssh根据关键字过滤日志信息;(5)journalctl --disk-usage查看日志文件占用空间;(6)journalctl --flush清除日志文件。】 - locate/updatedb:文件搜索器,比 whereis 搜索的范围广,比 find 搜索的更快速。updatedb 只负责根据配置文件
/etc/updatedb.conf中排除的以外查找路径来更新数据库,而 locate 只负责根据数据库来查询文件。例,(1)locate */filename根据完整的文件名来查找而不是默认的模式匹配;(2)locate -b pattern只查找末尾匹配查询模式的路径;(3)locate -w pattern也是默认的查找模式,匹配即可;(4)locate -r regexpattern正则表达查找 - which/whereis:文件搜索。例,
which -a cmdwhich 根据环境变量 PATH 中的路径去查找对应 cmd 命令的所有所在路径,若无 a 选项则只列出第一个找到的路径;whereis -l列出 whereis 特定的查询路径。 - find :文件多条件查找。格式:
find [path] [expression],其中 expression 是 operators, options, tests, actions: 的组合形式。 例,(1)find . -iname str大小写不敏感查找文件,str 必须是完整文件名;(2)find . -regex str正则查找文件;(3)find . -path str根据路径查找文件,str 可以是是包含/的字串;(4)find . -name str -exec echo {} \;将查找到的文件用 echo 处理,使用 exec 选项时需特别注意匹配到的尽量不要是目录,务必配合-type 进行过滤筛选,否则影响可能会较大;(5)find -newer str -or -name *test*查找的文件只要符合 -newer 或 -name 的条件便都符合,不加 -or 的默认情况下是 -and;(6)find -type f -name str要求符合条件的目标必须是文件类型而不包含目录或其它链接文件;(*)find . -empty -executable -nouser -nogroup -readable -prem xxx -newer xxx -uid xxx -size xxx -depth xxx查找空、可执行、无所属用户及组、可读、权限 xxx、比 xxx 更新、uid 是 xxx、大小是 xxx、遍历目录深度 xxx 的文件。 - wall/mail:Linux 下的通信指令。
- 文件与进程:fuser(file user)根据文件查看文件正在被哪个进程所使用;lsof(list of process)列出进程正在占用的文件列表;pidof(pid of process)列出进程的 pid 号。【例,
lsof -p 123查看进程 pid 是 123 所打开的文件;】 - pwdx:查看进程启动时的工作目录。【例,
pwdx 123查看 pid 为 123 的进程的工作目录;】 - mkfifo:创建一个有名字的管道。该管道可以使不同 bash 之间的进程进行数据流的传递,而默认的 | 管道只能够在单个 bash 内不同进程之间进行数据流的传递。有名字的管道更像是一个特殊的文本文件,它也可以更改所有者以及权限。
- diff :参考文件 对比文件/patch 可以对文本或目录下的文本进行不同之处的比对,以及根据比对生成的 patch 文件,使用 patch 命令进行新文档的打补丁处理。(该命令似乎只能针对存在的文本文件进行对比分析,而对于那些不存在的文本文件/存在的二进制文件,它们并不能够很好的工作。)
- logger:可以将我们定义的日志信息传给 journald 服务,让其记录之后 rsyslog 又会从 journal 中取得该记录并分类。(logger 与 journal 之间的传输是通过 unix socket /dev/log 来实现。)
- 随机数生成:
$RANDOM生成随机 数字 、openssl rand -base64 num(要输出的随机字节数)生成随机 字节。 - script/scriptreplay:记录及重新播放终端会话的所有操作。但不是再次重新执行一遍命令,相当于命令行录屏。例,
script -t 2 > timingfile typescript将开始录制操作当 exit 退出录制时将产生时间文件 timingfile 和命令记录文件 typescript;scriptreplay -t timingfile -s typescript将开始播放录制内容。这两条命令中所涉及的时间文件很命令记录文件缺一不可,帮助文档未说明以为只需时间文件即可。 - xargs:过滤器,相当于让不支持管道符的命令再次可以使用管道符功能。xargs 将整个流的所有字符都看做一个较长的字符串(包括换行符也被看做一个字符,因此不同的-n -d 格式所展现出来的效果会显得难以理解。),然后根据它的分割字符将对应的分割段按照一次需要输出的数量(几段字符当作一段传输)传送给命令(xargs 默认的分隔符是空格,换行符也被当作一个空格)。例,
cat rename.txt | xargs -n2 mv根据命名文件批量重命名指定文件。 - date:显示时间。例,
date '+%B %d'显示月份和日期。 - env:显示当前环境变量以及为启动程序提供一个自定义环境变量的干净环境。【例,
env -i a = 10 bash将启动一个新的 bash 环境,该环境中没有多余的环境变量,只有几个必需的和自定义的变量。】
磁盘/文件系统
- df/du:磁盘文件系统容量查看、磁盘文件使用情况查看。例,(1)
df -h查看当前系统中存在的文件系统,不仅包含了分区文件系统还有其它一些非分区文件系统;(2)du -sh --max-depth num查看当前文件夹总大小;(3)du -ch */*.txt将当前目录中的目录中的所有.txt 的大小列出并将列出大小的总和进行 count 统计。【注:df 查看的统计容量通常比 du 统计的容量大,这是因为 df 基于磁盘包含了格式化所占用的容量,而 du 基于文件只统计文件大小的和。】 - tree:以树的格式列出目录及子目录中的内容。
- lsblk/blkid:查看磁盘这类的块设备。
- xfs_info/dumpe2fs:xfs 及 ext 系列文件系统信息查看。【注:ext 格式化时会将整个分区全部格式完成,而 xfs 则是先格式一部分不够使用了再继续格式化一部分。故使用 ext 格式化分区时速度较慢,xfs 格式速度则较快且 xfs 的 inode 容量较大得以支持更大的单文件容量。】
- partprobe:更新 Linux 核心的分区表信息。
- gdisk/fdisk/parted:GPT 磁盘分区工具、MBR 磁盘分区工具及都两者都支持的分区工具。
- mkfs:分区文件系统格式化。
- mount/umount:临时挂载/卸载文件系统,若要开机即挂载则需要编辑
/etc/fstab文件,挂载信息被记录于/etc/mtab及/proc/mounts。例,(1)mount -o remount, rw path以读写方式重新挂载目录;(2)mount -o loop path挂载光盘镜像文件; - mkswap/swapon/swapoff:内存置换空间初始化及使用。例,(1)
mkswap device/file path将分区或大容量文件初始化为 swap 格式;(2)swapon device/file启用这个内存置换空间。 - dd:自由操作字节流的输入输出,可拷贝文件及转换内容。例,(1)
dd if=test1 of=test2 conv=ucase从 test1 文件克隆到 test2,期间将 test1 中的小写字符转换为大写字符并写入 test2;(2)dd if=/dev/zero of=test2 conv=ucase bs=100 count=100创建一个 10000 字节的文件;【注:关于 bs 和 ibs 的区别。bs 限定了同一时间读写的最大量,而 ibs 只限定了同一时间读的最大量;这些参数的设定通常是为了测试磁盘读写速度或压力测试。】
文件权限/属性
- stat:查看文件的状态及其在文件系统中的信息,最方便之处在于快速的显示出文件的访问时间、修改时间、状态时间信息。不需要通过
ls -l --time=atime test; ls -l --time=ctime test; ls -l test的方式去查看文件的时间信息。 - touch:修改文件的 mtime、atime 时间戳属性【ctime 时间戳由系统修改并非 touch,虽然三者时间戳看起来区别不大。通过 stat 可详细查看】。例,(1)
touch -d "2 days ago" file更改文件的 mtime、atime 时间为 2 天后;(2)touch -a -t 202001220101 file更改文件的 atime 时间为指定时间。【注:mtime:modification time 内容修改、ctime:status time 权限及属性修改、atime:access time 内容读取】 - umask:文件预设权限。例,
umask 003拿掉 other 的 rw 权限,此时新建的文件为 664 目录为 774。【注:这主要取决于系统新建文件(不包含目录)默认是把 x 权限拿掉的,文件 x 权限只能根据需求手动增加。】 - chattr/lsattr:文件隐藏属性更改及查看。例,(1)
chattr +i file文件不可被更改及删除,即便 root 用户;(2)chattr +a file文件只能被追加。【注:该隐藏属性在 ext 系列文件系统中被完美支持,xfs 不完全支持】 - 特殊权限 SUID、SGID、SBIT:例,(1)SUID 针对文件,使 other 用户在执行程序期间拥有文件所有者的权限;(2)SGID 针对文件,使 other 用户在执行程序期间拥有文件所属组的权限;SGID 针对目录,使进入此目录下的 other 用户在新建文件时文件的所属群组为该目录群组;(3)SBIT 针对目录,使 other 用户在该目录下建立的文件只能被自己和 root 删除,即便 other 拥有对该目录 w 的权限。【注:这些权限会占用 x 位,而且要使三者发挥对应的功能,文件也必须拥有 a+x 权限才行。如果没有 x 权限但又特殊权限,此时会出现大写的权限字符】
- setfacl/getfacl:权限细部规划。例,
setfacl -m u:test1:rw -m u:test2:rwx file设置所属人为 root 的文件 file 让用户 test12 分别拥有不同的权限。【注:传统的权限只有 3 种身份 owner、group、other 无法针对单一用户或群组来设定特定的权限需求,而 ACL 可以支持单文件针对不同的用户实现不同的权限。】
文本处理
- tail/head:打印文本最后的部分。例,(1)
tail -n num file查看文件最后 num 行内容;(2)tail -f file动态监视文件追加的内容。 - cat/tac:连接文件并输出。例,
cat -E -T file显示文件尾部的$符号和 TAB 符号,-b 为非空的行添加行号,-n 为所有行添加行号。 - split:文件大小切割。
- tr:对从标准输入流中读取到的文本字符进行转换并从标准输出流输出。其中选项 c/d/s/t 分别对字集 1 进行补集/删除/挤压/截断的操作。例,
tr [:lower:] [:upper:] < test.txt。 - col:对从标准输入流中读取到的文本字符进行转换并从标准输出流输出。例,(1)
cat test.txt | col -x将 tab 替换为对应的空格;(2)cat test.txt | col -h输出 TAB 替换原来的多空格。 - wc:进行文本文件的字节、字数、行数的统计。
- join:将 2 个具有相同域的纪录给挑选出来,再将这些纪录所有的域放到一行。 join 在对两个文件进行连接时,两个文件必须都是按照连接域排好序的,按其他域排序是无效的。例,
join test1 test2。 - paste:直接将 2 个文件的内容并排粘贴在一起,而不如 join 那样进行分析,或将多行内容用一行去输出。例,
paste test1 test2;echo "123\n456" | paste -sd "," - sort:对文本文件的行进行排序。例,
sort -r -t : k1 test根据: 对文件进行分域,并按照文件的第一个域进行逆序排序;sort -h test以人类可读的方式进行排序。 - uniq:文本行去重统计。
- cut:文本列切割。
- watch:定时执行命令,实时监测命令输出内容的变化情况。例,
watch -d -n 3 ls每 3s 执行一次 ls,实时高亮显示当前目录中的变化情况。 - rename:支持批量更改文件后缀名。
rename .txt .log *.txt - od:用八进制(亦支持十、十六进制)去显示文件的内容,类似于十六进制查看器 WinHex。例,
od -A n -t x1 -w1 test.txt用十六进制的格式转换,每行输出一个字节,地址基数不显示(-A n)的方式查看 test.txt 文件。若要模拟 WinHex 的输出方式,则用od -A x -t x1 -w16 test.txt。
用户/组管理
- useradd/userdel/usermod/passwd:用户管理。
- groupadd/groupdel/groupmod/gpasswd:组管理。gpasswd 可以给组添加成员并指定组管理员;
- newgrp:在当前 shell 切换用户的有效组。【有效组切换之后新建文件时,文件的所属组就变成了有效组。重启该 shell 之后有效群组失效(因为有效组切换是新建立一个 shell 环境并给予该环境新的组权限)需重新设定,若要使更改的有效组永久生效,需通过 usermod 更改该用户的初始组。】
- id/chsh/groups/groupmems:查询用户相关信息、更改用户 shell、查询用户加入的组、查询组成员。例,
groupmems -g test -l列出组成员。 - w/who/last/lastlog:w 查看哪些用户已登录且正在做什么;who 查看哪些用户已登录;last 查看最近登录系统的登录记录(通常是很多的 root 登录记录);lastlog 查看所有用户最近一次登录的时间(展示所有用户)。
sudo -u user cmd:使用指定用户去执行命令,使进程的所有者为指定用户,进程权限为指定用户权限。- whoami:查询当前 shell 的用户是谁。
任务管理
- jobs/fg/bg:后台任务管理。例,(1)jobs 查看后台任务状态及对应任务的 job_num;(2)
fg job_num将后台运行任务切换至前台;(3)bg job_num让后台停止的任务继续在后台运行;(4)CTR+Z 将前台正在运行任务隐藏至后台并停止运行;(5)CMD & 让任务在后台运行。 - kill:杀掉进程或后台 jobs。例,(1)
kill -9 %jobs_num根据 jobs 号杀掉进程;(2)kill -9 pid根据 pid 杀掉进程。 - nohub:让程序以 忽略挂起 信号的方式运行,被运行程序将输出信息追加到 nohub.out 文件中而不会显示到终端。例,
nohub cmd [cmd-arg] [&]。 - ps、top 均为进程观察指令,pstree 可以很方便的查找进程之间的联系。管理进程时可以使用 kill(以 PID/jobs 号识别进程)以及 killall(以进程的 CMD 名称来识别进程)来对进程发送 signall 信号。【例:(1)
pstree -ps pid可清晰查看指定进程的整个继承关系;(2)ps -eo pid,lstart,etime,cmd | grep 1234查询 pid 为 1234 的进程的启动时间和运行时长等信息;】 - top:进程动态查看,支持交互与不交互模式,其功能更类似于 windows 下的任务管理器。例:(1)
top -b以非交互模式运行,此时的输出默认仍是以 3 秒刷新一次;(2)top -u str输出指定进程所属人相关的所有进程;(3)top -p num输出指定 id 的进程,不断动态刷新;【注:top 交互模式视图下的常用命令:h 帮助菜单;f 管理输出进程字段;z/b/x/y 颜色/加粗/运行行/排序列 之间的切换,这些命令相互配合显示会更直观;L 关键字查找;k 终止指定进程;1 显示 cpu 内核数量;d 设置刷新间隔时长;W 将以上执行的命令设置保存,下次使用 top 关于颜色、刷新间隔时间、显示列这些依旧生效。】 - at/batch/atq/atrm:执行一次排程。例,(1)
at time指定时间执行任务;(2)batch当系统负载小于 0.8 时运行;(3)atq查看任务列表;(4)atrm num删除指定任务;(5)at -c num列出该项任务的实际指令内容。【注:at 任务执行完成之后的输出结果会通过 mail 邮件发送。】 - crontab:循环执行排程。例,(1)
crontab -e -u test编辑指定用户的 crontab;crontab -l列出任务内容;(2)crontab -r移除所有任务内容;【注:通过-e 编辑的用户排程对应于/var/spool/cron/user,系统相关排程直接编辑/etc/crontab 或/etc/cron.d/*。】 - anacron:检查停机期间未能如期运行的排程并执行。例,(1)
anacron -s依据时间记录文件开始检查有没有未如期运行的排程;(2)anacron -f不检查时间记录文件立即执行其监督范围中的所有排程。【注:anacron 是一个程序而非一个服务,其由 crontab 排程循环执行,每次执行将对停机期间未如期运行的排程进行检查,检查完毕若正常则进行停止。/etc/anacron 配置文件包含 anacron 应该监督排程文件范围】
杂项
- update-alternatives:用于处理 Linux 系统中软件版本的切换,使其多版本共存。使用上也是基于 link 软链接进行,但是功能比 ln 强大。例,
update-alternatives --install /usr/bin/java java /usr/bin/java1、update-alternatives --install /usr/bin/java java /usr/bin/java2将给 /usr/bin/java 指定了 2 个待选版本。 - lspci:查看系统已加载的硬件设备类型及型号等信息。(通过
cat /proc/cpuinfo也可查看 CPU 类型及内核处理器数量)
特殊指令集合
1、rpm 用法
rpm -ivh --replacefile/--replacepkgs *.rpm似乎并不能够覆盖安装包,因为原来的更改的配置文件依旧未变。(可通过将原配置文件重命名,然后再进行覆盖安装即可。)- 查询包依赖:
rpm -qpR pkg.rpm,直接列出。 - 查询依赖包:
rpm -e --test pkg.rpm或rpm -q --whatrequires pkg,测试删除,如果有依赖关系会阻止删除。 - 根据已知文件查询所属包名称:
rpm -q --whatprovides /filepath/ - 列出安装包时所释出的所有文件:
rpm -ql pkg - 安装到指定位置:
rpm -ivh --prefix = <dir> - 将已安装程序的旧位置移动新位置:
rpm -ivh --relocate = <old> = <new>
2、yum 用法
yum --downloadonly --downloaddir . install pkgname,下载需要安装的包及依赖的 rpm 文件到指定目录,但不安装;yumdownload pkgname仅下载需要安装的包到当前目录,但不下载依赖包。yum updateinfo更新仓库列表名单yum whatprovides */libphp*.so在线查询哪些安装包带有 libphp 模块(与rpm -q --whatprovides的查询方式一样,区别只在于离线与否)yum groupinstall 'Group Tool'批量安装工具组中的所有包。
3、dpkg 用法
dpkg-query -L pkg列出 已安装 包所包含的所有文件dpkg-deb -c pkg列出 未安装 包所包含的所有文件dpkg-query -s pkg报告 已安装 包依赖及详细描述dpkg-deb -I pkg报告 未安装 包依赖及详细描述dpkg-query -S file根据指定文件的路径来查询该文件所属的安装包dpkg -l列出所有已安装包的版本信息及平台dpkg-reconfigure pkg重新配置软件包第一次安装之后的配置参数。例,dpkg-reconfigure tzdata重新更改时区。
4、apt-get/apt 用法
apt update更新仓库列表名单以及可以进行升级的包信息。apt upgrade根据列表名单中可以升级的包信息对相应的包进行安装/升级操作。【apt-get install --only-upgrade cmd-name只升级指定的软件】apt full-upgrade根据列表名单中可以升级的包信息对相应的包进行卸载/安装/升级操作。apt list --installed列出已安装的软件包。apt search在列表名单中的描述信息搜索包关键字。apt-get remove删除 B 的同时,将删除 A(很好理解,A 依赖于 B,B 被删了,A 也就无法正常运行了)。apt-get remove C将删除 C, 同时提示你用 apt-get autoremove 去清除 B, D apt-get autoremove C 将删除 B, C, D aptitude remove C 将删除 B, C, D。【该操作较危险,不清楚完整的依赖关系最好别试】apt-get purge的行为卸载并清除软件包的配置(即/etc/..),很容易理解,但不会删除家目录下的配置文件【注:remove 不删除配置文件、purge 删除 etc 下的配置、autoremove 删除软件包相关的各种依赖软件】。apt-cache search php- | less在 apt 缓存中搜索 php 模块相关的包。apt-cache show php-gd查询包的详细信息apt-file list pkg列出包所包含的文件- 补充:apt 在搜索 mysql-server 时,结果中会存在 2 个主要相关包 mysql-server、mysql-server-8.0,实际上两者都属于同一个包,只不过 mysql-server 包总是指向当前系统中最新的 mysql-server*版本,此处即是 mysql-server-8.0。
5、SELinux 相关的查询及管理命令:
- getenforce 获取当前模式。setenforce 设置模式。sestatus 获取当前政策及模式。
- getsebool 获取政策下的规则。setsebool 设置政策下的规则。
- seinfo 查询规则内的信息,规则限制了什么东西。sesearch 查询规则内信息。
- chcon 修改文件的 content 的属性。restorecon 根据 SELinux 预设的值对文件进行 content 属性的修改。
- semanage 就是用来查询/增加/修改/删除预设的 SELinux type 。(restorecon 可以【恢复】原本的 SELinux type 那是因为有个地方专门在纪录每个文件/目录的 SELinux 默认类型。)
6、Qemu 用法
qemu-img.exe create -f qcow2 .\kylin-v4-arm64.qcow2 50G在 当前目录下创建 50G 的硬盘镜像(qcow2 格式的磁盘镜像支持动态分配磁盘空间以及快照功能、raw 格式的磁盘镜像则是创建即占用指定空间大小。)qemu-img create -f qcow2 /root/test/diff.img -b /root/test/base.img创建 差异盘镜像 文件,差异盘 diff.img 被使用之后,读取的已有内容都来自 base.img,而进行的改动都写入了 diff.img 而不影响 base.img 的内容。当然也可以通过qemu-img commit diff.img将差异盘 diff.img 中的改动的内容写入基础盘 base.img 中。qemu-img.exe resize .\kylin-v4-arm64.qcow2 +1G扩展 已创建的磁盘镜像。(注意:磁盘镜像被扩展之后,系统中的分区表还是扩展之前的数据,此时需要通过 parted 或 gparted 进行 GPT 分区表修复之后才能对新增的磁盘空间进行分配。)qemu-img snapshot -c/a/l snap1 test.qcow2创建/使用/列出 虚拟机快照。这些命令需在虚拟机关机的状态下使用,否则会损坏磁盘镜像。(这种快照管理方式很像 VMware 这些虚拟机的快照管理方式)tapctl.exe create --name tap0创建 tap 网络。- --以下例子是基于 aarch64 处理器架构的虚拟机--
qemu-system-aarch64.exe -m 2048 -M virt -cpu cortex-a53 -smp 4, cores = 4, threads = 1, sockets = 1 -bios D:\qemu\QEMU_EFI.fd -device VGA -device nec-usb-xhci -device usb-mouse -device usb-kbd .\kylin-v4-arm64.qcow2启动一个图形界面虚拟机的 必备要素:内存、cpu 型号及构造、机器类型(-M 和 cpu 型号相关联)、BIOS 固件(efi 固件并非支持所有类型的 iso 操作系统)、VGA 显示器、鼠标、键盘。(此处假设 qcow2 磁盘已完成系统安装初始化)qemu-system-aarch64.exe 必备要素之外 -hd [abcd] .\test.img -cdrom D:\qemu\kylin\Kylin-4.0.2-server-sp4-20070420.J1-arm64.iso 0 -boot d .\kylin-v4-arm64.qcow2初次对一个磁盘镜像进行初始化系统安装时,需添加一个光盘 iso 镜像,使其开机从光盘启动。(参数-boot d ,告知虚拟机启动时从光盘处加载系统,这个参数在 windows 下似乎并不生效,从磁盘镜像启动还是通过进入 BIOS 选择进行的;参数-hd [abcd] 将会添加几个 额外的磁盘设备 hd [abcd],磁盘文件在命令行中的先后顺序将决定它的 hdx 中/dev/hdabc 的先后顺序;)qemu-system-aarch64.exe 必备要素之外 -net nic, model = virtio -net tap, ifname = tap0 .\kylin-v4-arm64.qcow2若要与外界主机 网络连接,则需模拟一个指定的 virtio 网络卡设备,并将其与外部 tap 网络进行连接。(网络卡设备的选择需要慎重,因为操作系统可能没有对应的网卡驱动。)在不建立 tap 网络连接的默认情况下,虚拟机终端的 ip 在 10.0.2.0/24 这个网段之内,此时虚拟机可以通过 10.0.2.2 这个 ip 对宿主机上开放的服务进行连接访问。(这种特殊行为属于内置端口映射)qemu-system-aarch64.exe 必备要素之外 **-monitor stdio -snapshot** .\kylin-v4-arm64.qcow2启用只读虚拟机的 监视器及快照模式,在这个模式下可以对启动的虚拟机进行快照管理,不过这些创建的快照在虚拟机重启之后就会丢失,只有在控制台通过 commit 才能将这些快照写入到磁盘镜像中(savevm 创建快照、loadvm 应用快照、delvm 删除快照、info snapshots 列出创建的快照)。监视器的控制台有 3 种方式进行访问:stdio 启动虚拟机的命令行处即是控制台(启动处访问)、unix socket(本地访问)、telnet(远程访问)、tcp(远程访问)。qemu-system-x86_64.exe -M pc -machine pc-i440fx-4.0 -machine accel = hax -m 2048 -smp 4, cores = 4, threads = 1, sockets = 1 -device VGA -device nec-usb-xhci -device usb-mouse -device usb-kbd -cdrom E:\CentOS-7-x86_64-DVD-2009.iso -boot d通过安装 加速器 haxm 使得模拟 x86 处理器的虚拟机时速度得到显著提升,该加速器仅对 x86 和 x86_64 虚拟机有加速效果。qemu-system-aarch64.exe 必备要素之外 -vnc : 0 [, password = on -monitor stdio]创建一个可以设置密码的 VNC 服务,通过在监视器控制台中执行 change vnc password 以设置密码。默认则是无密码的 VNC 服务器。(只有虚拟机添加了-device VGA 设备之后,才可以开启 vnc 服务,否则无 VGA 设备则无法重定向视屏流。)