Linux学习

该笔记为学习时的记录,也许会超~级长

一 Linux和Unix关系

image-20230308101043578

二 云服务器安装图形化桌面

基于性能及通用性等因素的考虑,默认不安装图形化桌面组件。若您需要为Linux实例安装图形化界面,可参考本文进行操作。

2.1 操作前准备

请在安装之前,为服务器实例创建快照,做好数据备份,请参见创建一个云盘快照

安装图形化桌面会降低服务器的性能,若安装不当,则会导致操作系统无法正常启动。

2.2 CentOS 7

此处以安装MATE桌面环境为例

依次执行以下命令,安装MATE桌面环境。

yum groups install "X Window System"
yum groups install "MATE Desktop"

安装时间要挺久的,估计是看服务器端的网速

执行以下命令,设置默认使用图形化桌面环境启动实例。

systemctl set-default graphical.target

执行以下命令重启服务器

reboot

三 网络连接的三种模式

桥接模式

虚拟系统可以和外部系统通讯,但是容易造成ip冲突,同一网段只有最多255个地址.

NAT模式

网络地址转换模式,虚拟系统可以和外部通讯,不造成ip冲突

主机模式

独立系统

四 Linux目录结构

4.1 基本介绍

linux的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录”/“,然后在此目录下再创建其他的目录。

树状目录

在Linux世界里,一切皆文件

4.2 具体目录结构

  • /bin [常用] (/usr/bin/usr/local/bin)是Binary的缩写,这个目录存放着最经常使用的命令;

  • /sbin (/usr/sbin/usr/local/sbin)s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。

  • /home [常用]存放普通用户的主目录,在Linux中每个用户都有一个自己的目录,一般该目录名是以用户的账号命名

  • /root [常用]该目录为系统管理员,也称作超级权限者的用户主目录

  • /lib 系统开机所需要最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库

  • /lost+found 这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件

  • /etc [常用]

    所有的系统管理所需要的配置文件和子目录,比如安装mysql数据库 my.conf

  • /usr [常用]

    这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似与windowsT的program files目录

  • /boot [常用]

    存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件

  • /proc [不能动]

    这个目录是一个虚拟的目录,它是系统内存的映射,访问这个目录来获取系统信息

  • /srv service [不能动]

    缩写,该目录存放一些服务启动之后需要提取的数据

  • /sys [不能动]

    这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统sysfs

  • /tmp

    这个目录是用来存放一些临时文件的

  • /dev

    类似于windows的设备管理器,把所有的硬件用文件的形式存储

  • /media [常用] linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下

  • /mnt [常用]系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将外部的存储挂载在/mnt/上然后进入该目录就可以查看里的内容了。 d:/myshare

  • /opt 这是给主机额外安装软件所摆放的目录。如安装ORACLE数据库就可放到该目录下。默认为空

  • /usr/local [常用]

    这是另一个给主机额外安装软件所安装的目录。一般是通过编译源码方式安装的程序

  • /var [常用]

    这个目录中存放着在不断扩充着的东西,习惯将经常被修改的目录放在这个目录下。包括各种日志文件

  • /selinux [security-enhanced linux]

    SELinux是一种安全子系统,它能控制程序只能访问特定文件,有三种工作模式,可以自行设置

五 Linux 系统内置 vi文本编辑器

img

Vim 具有程序编辑的能力,可以看做是Vi的增强版本,可以主动的以字体颜色辨别语法的正确性方便程序设计。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。

5.1 常用三种模式

正常模式

以vim打开一个文档自动进入默认模式,可以进行[上下左右]移动光标,可以[删除字符]或[删除整行],可以使用复制粘贴处理数据。

插入模式

按下i,I,o,O,a,A,r,R等任何字母进入编辑模式,一般来说按i即可。

命令行模式

这个模式中,可以提供相关指令,完成读取、存盘、替换、离开vim、限时行号等动作。

image-20230308170116929

5.2 拷贝和粘贴

正常模式下输入yy复制,输入p粘贴,复制5行:5yy

删除当前行dd,删除当前行向下的5行5dd

撤销u

反撤销ctrl+R

5.3 查找

在文件中查找某个单词:

命令行下/关键字 ,回车查找,输入n就是查找下一个

取消查找

直接输入:nohl取消高亮

忘了怎么取消(偷个懒,真不是记不住单词),直接输入一个查找不存的就行了

设置行号

开启::set nu

关闭:set nonu

定位

gg首行

G最后一行

定位到第十行10 shift g

六 开机、重启

-h->halt:停止

-r->reboot:重启

默认是输入-h

shutdown -h now #立即进行关机
shutdown -h 1 #一分钟后关机
shutdown -r now #现在重启计算机
halt #立即关机
reboot #立即重启
sync #把内存得数据同步到磁盘

七 用户相关

7.1 默认目录

创建新用户

useradd [用户名]

默认用户家目录在**/home**

例:创建用户aaa

useradd -m aaa,

-m:自动建立用户的登录目录[默认]

创建用户且加入已有组

useradd -g [用户组名] [用户名]

例:创建用户user1,指定组g1

useradd -g g1 user1

image-20230311161019587

7.2 自定义目录

创建新用户

useradd -d [指定目录] [用户名],给新创建的用户指定家目录

例:创建用户newus,指定目录/home/newuser

useradd -d /home/newuser newus

image-20230311143453545

创建用户且加入已有用户组

如果创建用户未指定组,那么自己默认一个组

useradd -g [用户组名] -d [指定目录] [用户名]

例:创建user3,指定组g1,指定目录/home/3user

useradd -g g1 -d /home/3user user3

image-20230311161527071

7.3 修改密码

passwd [用户名]

如果未写用户名则修改当前用户的密码

7.4 登录

登录时尽量少用root账号,避免操作失误,系统管理员账号权限太大。

切换用户

普通用户登录后再用su - 用户名命令来切换身份。

权限高切换到权限低的用户不需要密码.

注销用户

快捷键ctrl+d

logout:注销用户[只在运行级别3的情况下有效]

7.5 删除用户

首先切换到root系统管理员

一般情况下建议保留目录

删除用户,但保留家目录

userdel [用户名]

例:删除用户aaa保留家目录

删除了用户aaa,目录还在

image-20230311150714800

删除用户,但不保留家目录

userdel -r [用户名]

例:删除用户newus和家目录

删除了用户newus,包括他的自定义用户名newuser

image-20230311151022299

7.6 查询用户

查询指定用户

id [用户名],或者id [uid]

例:查询id:root

id root

image-20230311154434600

id 1001

image-20230311154907985

查询当前用户

whoami

who am i

image-20230311155041295

image-20230312170533230

7.7 用户组

介绍

类似于角色,系统可以对有共性/权限的多个用户进行统一的管理

新增组

如果创建用户未指定组,那么自己默认一个组

groupadd [组名]

新增用户加入该组

``useradd -g [用户组名] [用户名]`

例:新增user1,加入组g1

useradd -g g1 user1 `

image-20230311161019587

修改用户的组

usermod -g [用户组] [用户名]

例:将user3切换到组g2

首先查看user3所在组:g1

image-20230311164044266

切换组指令:usermod -g g2 user3

查看user3 已切换g2

image-20230311163913271

7.8 用户和组相关文件

/etc/passwd 文件

用户(user)的配置文件,记录用户的各种信息

每行含义:

用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell

image-20230311164528044

/etc/shadow 文件

口令的配置文件

每行的含义:

登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志

/etc/group 文件

组的配置文件,记录Linux包含的组的信息

每行含义:

组名:口令:组织标号:组内用户列表

八 指定运行级别

8.1 运行级别说明

0 : 关机

1 : 单用户[找回丢失密码]

2 : 多用户状态没有网络服务

3 : 多用户状态有网络服务

4 : 系统未使用保留给用户

5 : 图形界面

6: 系统重启

常用运行级别是3和5,也可以指定默认运行级别

8.2 切换运行级别

init [0123456] 应用案例

8.3 默认运行级别

CentOS7后运行级别说明

在centos7以前,/etc/inittab文件中进行了简化

multi-user.target: analogous to runlevel 3 #表示级别3

graphical.target: analogous to runlevel 5 #表示级别5

如下图所示,默认是级别5,图形界面

image-20230312175412595

设置默认运行级别

例:将级别5改为3,多用户状态有网络服务:

systemctl set-default multi-user.target

image-20230312180018505

重启之后服务器界面登录变成命令行

九 帮助指令

man 获得帮助信息

基本语法 : man [命令或配置文件]

功能描述 : 获得帮助信息

案例:man ls

image-20230312182554884

help指令

基本语法 :help

功能描述 : 获得shell内置命令的帮助信息

十 文件目录类指令

pwd指令

语法:pwd

功能描述: 显示当前工作目录的绝对路径

应用实例: 案例:显示当前工作目录的绝对路径

image-20230312191936652

ls指令

语法:ls [选项] [目录或是文件]

常用选项:

  • -a:显示当前目录所有的文件和目录,包括隐藏的
  • -l:以列表的方式显示信息|ls -l可简写成ll

例:ls -la,列表展示,且包括隐藏文件,顺序不影响ls -al也行

image-20230312182744046

ls拓展

ls -l可以简写成ll

ls -lh可以人性化显示单位

image-20230316105756227

cd指令

语法:cd [参数]

功能描述 : 切换到指定目录

cd ~ 或者cd :回到自己的家目录

cd ..:回到当前目录的上一级目录

例:

  • 使用绝对路径切换到root目录

    cd /root

  • 使用相对路径到/root 目录

    一直使用cd ../..往上一级退,直到/root

  • 表示回到当前目录的上一级目录

    cd ..

  • 回到家目录

    cd或者cd ~

image-20230312194234223

mkdir指令

mkdir指令用于创建目录

语法: mkdir [选项] [目录]

常用选项

-p: 创建多级目录

例:

案例1:创建一个目录 /home/dog

mkdir /home/dog

案例2:创建多级目录 /home/animal/tiger

mkdir -p /home/animal/tiger

rmdir指令

rmdir指令删除空目录,如果目录下有内容时无法删除的

**[谨慎]**如果需要删除非空目录,需要使用 rm -rf 要删除的目录.

语法:rmdir [选项] [目录]

例:

1、删除一个目录 /home/dog

rmdir dog

image-20230312223332467

2、删除animal[谨慎]

rm -rf animal/

image-20230312223706840

touch指令

touch指令创建空文件

语法:touch [文件名称]

例:

创建一个空文件 hello.txt

touch hello.txt

image-20230312224039806

cp指令

cp 指令拷贝文件到指定目录

语法:cp [选项] source dest

常用选项

-r:递归复制整个文件夹

例:

1、将home/hello.txt复制到home/cp文件夹下

cp hello.txt /cp

image-20230312224635280

2、将cpp文件夹整个复制到/opt/cp2

cp -r /home/cpp /opt/cp2

复制过来是包括了文件夹

image-20230312230349882

强制不提示覆盖的方法[反斜杠]

\cp -r /home/cpp /opt/cp2

rm指令

说明:rm指令移除文件或目录

强制删除不提示的方法: 带上 -f 参数即可

语法:

rm [选项] [文件/目录] 要删除的文件或目录

常用选项:

-r:递归删除整个文件夹

-f:强制删除不提示

例:

1、删除cpp文件夹以及其下三个文件

rm -rf cpp

2、删除a.txt

rm a.txt

image-20230312233124467

mv指令

mv 移动文件与目录或重命名

语法

mv oldNameFile newNameFile

功能描述:重命名

mv /temp/movefile /targetFolder

功能描述:移动文件

例:

1、将home下的a.txt文件移到/opt

mv a.txt /opt/

2、将a.txt改名为b.txt

mv a.txt b.txt

image-20230313000520840

3、将opt/b.txt移动到/home且重命名为aa.txt

mv opt/b.txt /home/aa.txt

image-20230313005552382

4、移动目录/opt/abc

mv /opt/abc /home/

image-20230313010043188

cat指令

cat 查看文件内容,和vim不同的是cat只能查看文件不可以修改

语法

cat [选项] [要查看的文件]

常用选项

-n:显示行号

例:

查看/etc/profile文件,且显示行号

cat -n /etc/profile

一般带上管道命令|more

cat -n /etc/profile |more

more指令

more指令是一个基于VI编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容。more指令中内置了若干快捷键,详见操作说明

语法

more [要查看的文件]

操作说明:

操作 功能说明
空格键(Space) 下翻一页
回车键(Enter) 下翻一行
q 立刻离开more,不再显示该文件内容
Ctrl+F 向下滚动一屏
Ctrl+B 返回上一屏
= 输出当前行号
:f 输出文件名和当前行号

例:

采用more查看文件/etc/profile

more /etc/profile

less指令

less指令用来分屏查看文件内容,它的功能与more指令类似,但是比more指令更加强大,支持各种显示终端。less指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率。

语法

less [要查看的文件]

操作说明

操作 功能说明
空白键 向下翻一页
[pagedown] 向下翻一页
[pageup] 向上翻一页
/字串 向下搜寻[字串]的功能;n:向下查找;N:向上查找;
?字串 向上搜寻[字串]的功能;n:向上查找;N:向下查找;
q 离开less这个程序;

应用实例

例: 采用less查看一个大文件文件/opt/杂文.txt

less guimi.txt

echo指令

echo输出内容到控制台

语法

echo [选项] [输出内容]

例:

案例1: 使用echo 指令输出环境变量

echo $PATH,echo $HOSTNAME

案例2: 使用echo 指令输出 hello,world!

echo "hello,world!"

echo输入内容到文件

语法

echo [内容] >> [文件]

例:

将内容”..啊啊啊啊..”附加到mydata.txt中| >覆盖 >>附加

echo "...啊啊啊啊.." >> mydata.txt

head指令

head用于显示文件的开头部分内容,默认情况下head指令显示文件的前10行内容

语法:

head [文件] (查看文件头10行内容)

head -n 5 文件 (查看文件头5行内容,5可以是任意行数)

例:

查看/etc/profile前五行代码

head -n 5 /etc/profile

image-20230313020710726

tail指令

tail用于输出文件中尾部的内容,默认情况下tail指令显示文件的前10行内容

语法

1.tail 文件(查看文件尾10行内容)

2.tail -n 5文件(查看文件尾5行内容5可以是任意行数)

3.tail -f 文件(实时追踪该文档的所有更新)

案例1: 查看/etc/profile 最后5行的代码

tail -n 5 /etc/profile

案例2: 实时监控 mydate.txt,看看到文件有变化时,是否看到,实时的追加hello

tail -f mydata.txt

>指令和>>指令

>:输出重定向

>>:追加

语法:

ls -l >文件

功能描述:列表的内容写入文件a.txt中(覆盖写)

ls -al >>文件

功能描述:列表的内容追加到文件aa.txt的末尾

cat 文件1 > 文件2

功能描述:将文件1的内容覆盖到文件2

echo "内容">> 文件

例:

案例1: 将/home目录下的文件列表写入到/home/info.txt中

ls -l /home > /home/info.txt(如果info.txt不存在,则会创建)

案例2: 将当前日历信息追加到/home/mycal文件中

cal >> /home/mycal

image-20230316012045776

ln指令

软链接也称为符号链接,类似于windows里的快捷方式,主要存放了链接其他文件的路径.

当我们使用pwd指令查看目录时,仍然看到的是软链接所在目录

语法:

ln -s [源文件目录] [目标目录]

功能描述:给原文件创建一个软链接

例:

案例1: 在/home 目录下创建一个软连接 myroot,连接到 /root 目录

ln -s /root/ /home/myroot/

image-20230316021745264

案例2: 删除软连接 myroot

rm myroot

history指令

查看已经执行过历史命令,也可以执行历史指令

语法:

history

功能描述: 查看已经执行过历史命令

例:

案例1: 显示所有的历史命令

history

案例2: 显示最近使用过的10个指令

history 10

案例3 : 执行历史编号为5的指令

!5

十一 时间日期类指令

date指令

显示当前日期

语法

date

功能描述:显示当前时间

date +%Y

功能描述:显示当前年份

date +%m

功能描述:显示当前月份

date +%d

功能描述: 显示当前是哪一天

date "+%Y-%m-%d %H:%M:%S”

功能描述:显示年月日时分秒

案例1: 显示当前时间信息

date

image-20230316022853365

案例2: 显示当前时间年月日

date "+%Y.%m.%d"

image-20230316022845184

案例3: 显示当前时间年月日时分秒

date "+%Y-%m-%d %H:%M:%S"

image-20230316022912511

设置日期

语法

date -s 字符串时间

例:

案例1: 设置系统当前时间 ,比如设置成 2021-11-11 11:22:22

date -s "2021-11-11 11:22:22",必须用-连接

image-20230316023409275

还原日期:hwclock -s

cal指令

查看日历指令

语法

cal [选项]

功能描述:不加选项,显示本月日历

例:

案例1:显示当前日历案例

cal

案例2:显示2020年日历

cal 2020

十二 搜索查找类指令

find指令

find指令将从指定目录向下递归地遍历其各个子目录,将满足条件的文件或者目录显示在终端

语法

find [搜索范围] [选项]

选项 功能
-name<查询方式> 按照指定的文件名查找模式查找文件
-user<用户名> 查找属于指定用户名所有文件
-size<文件大小(K,M,G)> 按照指定的文件大小查找文件

例:

案例1: 按文件名 : 根据名称查找/home 目录下的info.txt文件

find /home -name info.txt

案例2 : 按拥有者 : 查找/opt目录下,用户名称为 root的文件

find /opt -user root

案例3 : 查找整个linux系统下大于200M的文件( +n 大于 -n小于 n等于)

find / -size +200M

locate指令

locate指令可以快速定位文件路径。

locate指令利用事先建立的系统中所有文件名称及路径的locate数据库实现快速定位给定的文件。

Locate指令无需遍历整个文件系统,查询速度较快。

为了保证查询结果的准确度,管理员必须定期更新locate时刻

由于locate指令基于数据库进行查询,所以第一次运行前,必须使用updatedb指令创建locate数据库

语法

locate 搜索文件

例:

请使用locate 指令快速定位 mydata.txt 文件所在目录

updatedb

locate mydata.txt

如果删除或者添加了文件记得及时updatedb

which指令

查看某个指令在哪个目录下

语法

which [指令]

例:

查看ls指令在哪个目录

which ls

image-20230316111744483

grep指令和管道符号|

grep过滤查找,管道符,”|”,表示将前一个命令的处理结果输出传递给后面的命令处理

语法

grep [选项] 查找内容 源文件

常用选项

选项 功能
-n 显示匹配行及行号。
-i 忽略字母大小写

例:

请在 /home/info.txt 文件中,查找“hello”所在行,并且显示行号

写法1:cat home/info.txt |grep -n "hello"

写法2: grep -n "hello" home/info.txt

image-20230316115054044

十三 压缩和解压类指令

gzip/gunzip 指令

gzip 用于压缩文件,gunzip 用于解压的

语法

gzip 文件

功能描述:压缩文件,只能将文件压缩为.gz文件

gunzip 文件.gz

功能描述:解压缩文件命令

例:

案例1: gzip压缩,将 /home下的 info.txt文件进行压缩

gzip /home/info.txt

案例2: gunzip压缩,将 /home下的 info.txt.gz 文件进行解压缩

gunzip /home/info.txt

zip/unzip 指令

zip用于压缩文件,unzip用于解压的,这个在项目打包发布中很有用的

语法

zip [选项] XXX.zip [将要压缩的内容]

功能描述:压缩文件和目录的命

unzip[选项] XXX.zip

功能描述:解压缩文件

zip常用选项

-r:递归压缩,即压缩目录

unzip的常用选项

-d <目录>:指定解压后文件的存放目录

案例1: 将 /home下的所有文件,包含文件夹本身进行压缩成 myhome.zip

zip -r myhome.zip /home/

案例2: 将 myhome.zip 解压到 /opt/tmp 目录下

unzip -d /opt/tmp /home/myhome.zip

tar指令

tar指令是打包指令,最后打包后的文件是.tar.gz的文件

语法

tar [选项] xxx.tar.gz 打包的内容

功能描述:打包目录,压缩后的文件格式.tar.gz

打包操作

tar [选项] [源文件或目录]

选项 功能
-c 产生.tar打包文件
-v 显示详细信息
-f 指定压缩后的文件名
-u 在tar包中添加新的文件(无法直接在压缩包中添加文件)

解包操作

tar [选项] [压缩包]

选项 功能
-x 解包操作
-f 解包到指定文件,f后面要紧跟完整的文件名
-C<目录> 指定目录为解包位置
-t 查看包里的文件

压缩和解压

Linux下的压缩需要先将文件打包再进行压缩,而解压缩则是先将压缩文件解压缩成一个包

选项 含义
-z 压缩为”.tar.gz”格式,或对.gz压缩包进行解压缩
-j 压缩为”.tar.bz2”格式,或对.bz2压缩包进行解压缩

例:

案例1: 压缩多个文件,将/home/info.txt 和 /home/mydata.txt 压缩成 pc.tar.gz

tar -zcvf pc.tar.gz /home/info.txt /home/mydata.txt

案例2: 将/home 的文件夹 压缩成 myhome.tar.gz

tar -zcvf myhome.tar.gz /home

案例3: 将 pc.tar.gz 解压到当前目录,切换到 /opt/

tar -zxvf pc.tar.gz

案例4: 将myhome.tar.gz 解压到 /opt/tmp2目录下

tar -zxvf /home/myhome.tar.gz -C /opt/tmp2

十四 组管理和权限管理

在linux中的每个用户必须属于一个组,不能独立于组外。在linux中每个文件有所有者、所在组、其它组的概念

  • 所有者

  • 所在组

  • 其它组

  • 改变用户所在的组

14.1 文件/目录 所有者

一般为文件的创建者,谁创建了该文件,就自然的成为该文件的所有者

查看文件的所有者

指令:ls -ahl = ll -h

a: 所有文件和目录,包括隐藏;

h: 以人类可读方式显示文件大小;

l: 以列表形式显示文件和目录的详细信息;

例:

image-20230317170148892

修改文件所有者

指令:chown [用户名] [文件名]

例:使用root创建一个文件aroot.txt,然后将其所有者修改成user3

chown user3 aroot.txt

image-20230317170532164

14.2 组的创建

如果创建用户未指定组,那么自己默认一个组

groupadd [组名]

例:

创建一个组,monster,

创建一个用户 user4,并放入到 monster组中

groupadd monster

useradd -g monster user4

image-20230319172306697

14.3 文件/目录 所在组

当某个用户创建了一个文件后,这个文件的所在组就是该用户所在的组

查看文件/目录所在组

指令:ls -ahl

例:

使用user4创建文件,看看该文件属于哪个组?

-rw-r–r– 1 user4 monster 0 3月 19 18:03 ok.txt

image-20230319180340606

修改文件所在组

指令:

chgrp [组名] [文件名]

例:

使用root用户创建文件orange.txt,看看当前这个文件属于哪个组,然后将这个文件所在组,修改到fruit组

[root@hecs-66912 ~]# touch orange.txt
[root@hecs-66912 ~]# ll
-rw-r--r-- 1 root root 0 319 23:03 orange.txt
[root@hecs-66912 ~]# groupadd fruit
[root@hecs-66912 ~]# chgrp fruit orange.txt
[root@hecs-66912 ~]# ll
-rw-r--r-- 1 root fruit 0 319 23:03 orange.txt

可以看到组名从root转为fruit

14.4 其他组

除文件的所有者和所在组的用户外,系统的其它用户都是文件的其它组

改变用户所在组

在添加用户时,可以指定将该用户添加到哪个组中,同样的用root的管理权限可以改变某个用户所在的组

指令:

usermod -g [新组名] [用户名]

usermod -d [目录名] [用户名] [改变该用户登陆的初始目录]

**注:**用户需要有进入到新目录的权限

例:

将 user4 这个用户从原来所在组,修改到 g1 组

usermod -g g1 user4

十五 权限的基本介绍

image-20230320005700099

15.1 第一列0-9位说明

  • 第0位确定文件类型(d,-,l,c,b)

    • -文件
    • l链接,相当于windows的快捷方式;
    • d目录,相当于windows的文件夹;
    • c字符设备文件:鼠标,键盘;
    • b块设备,比如硬盘;
  • 第1-3位确定所有者(该文件的所有者)拥有该文件的权限。—User

    • 比如上图user3,该用户对该文件拥有的权限是rwx: 读,写,可被执行
  • 第4-6位确定所属组(同用户组的)拥有该文件的权限,—Group

    • 同样以user3举例,该用户的组权限是---,说明组员对该文件没有rwx权限
  • 第7-9位确定其他用户拥有该文件的权限 —Other

    • ---其他组用户对该文件,没有权限

rwx权限详解

  • rwx作用到文件

​ [r]代表可读(read): 可以读取,查看

​ [w]代表可写(write): 可以修改,但是不代表可以删除该文件,删除一个文件的前提条件是对该文件所在的目录有写权限,才能删除该文件。

​ [x]代表可执行(execute):可以被执行

  • rwx作用到目录

​ [r]代表可读(read): 可以读取,ls查看目录内容

​ [w]代表可写(write): 可以修改,对目录内创建+删除+重命名目录

​ [x]代表可执行(execute):可以进入该目录

15.2 文件及目录权限实际案例

ls -l 中显示的内容如下:

-rwxrw-r-- 1 root root 1213 Feb 2 09:39 abc

  • 第一列10个字符确定不同用户能对文件干什么?

    0:-

    1-3:rwx代表用户root 对于文件abc可读,可修改,可执行

    4-6:rw-代表root组 对于目录abc可读,可修改删除重命名,不可进入目录

    7-9:r--其他用户对该目录只有读取权限

可以用数字表示:r=4,w=2,x=1因此 rwx=4+2+1=7;

  • 第二列的1什么意思?

    如果不是1,则代表子目录数量(包括隐藏文件)

    如果是1,则表示这是个当前目录的文件

  • 第一个root,代表用户

  • 第二个root,代表所在组

  • 1213代表1213字节,占用空间

  • Feb 2 09:39时间日期

  • abc 文件/目录名

15.3 修改权限-chmod

通过chmod指令,可以修改文件或者目录的权限

方式一

字母法:chmod [u/g/o/a] [+/-/=] [rwx] [文件]

例如:chmod u + r(给u增加可读权限)

[u/g/o/a] 含义
u user 表示该文件的所有者
g group 表示与该文件的所有者属于同一组(group)者,即用户组
o other 表示其他以外的人
a all 表示这三者皆是
[+-=] 含义
+ 增加权限
- 撤销权限
= 设定权限

chmod u=rwx,g=rx,o=x [文件/目录名]

chmod o+w [文件/目录名]

chmod a-x [文件/目录名]

例:

给adc文件的所有者读 写 执行的权限,给所在组 读 执行 权限,给其它组 读 执行 权限

chmod u=rwx,g=rx,o=rx adc

给adc文件的所有者除去执行的权限,增加的权限

chmod u-x,g+w adc

给adc文件的所有用户添加读的权限

chmod a+r adc

效果:

-rw-r--r--   1 root  root    0 321 01:46 adc
[root@hecs-66912 home]# chmod u=rwx,g=rx,o=rx adc
[root@hecs-66912 home]# ll -ah
-rwxr-xr-x 1 root root 0 321 01:46 adc
[root@hecs-66912 home]# chmod u-x,g+w adc
[root@hecs-66912 home]# ll -ah
-rw-rwxr-x 1 root root 0 321 01:46 adc
[root@hecs-66912 home]# chmod a+r adc
[root@hecs-66912 home]# ll -ah
-rw-rwxr-x 1 root root 0 321 01:46 adc

方式二

数字法:chmod [rwx] [文件](rwx用数字代替)

例如:chmod 754 文件

r 读取权限,数字代号为 “4”
w 写入权限,数字代号为 “2”
x 执行权限,数字代号为 “1”
- 不具任何权限,数字代号为 “0”

通常我们以 Vim 编辑 Shell 文件批处理文件后,文件权限通常是 rw-rw-r--(644),那么,如果要将该文件变成可执行文件,并且不让其他人修改此文件,则只需将此文件的权限该为 rwxr-xr-x(755)即可。

r=4 w=2 x=1

rwx=4+2+1=7

chmod u=rwx,g=rx,o=x文件目录名

相当于chmod 751文件目录名

例:

将/home/abc.txt 文件的权限修改成rwxr-xr-x,使用给数字的方式实现

-rw-r--r--  1 root  root         0 321 02:21 abc.txt
[root@hecs-66912 home]# chmod 755 abc.txt
-rwxr-xr-x 1 root root 0 321 02:21 abc.txt

15.4 修改文件所有者

chown

chown [newowner] [文件/目录] 改变所有者

chown [newowner:newgroup] [文件/目录]改变所有者和所在组

chown -R [newowner] [文件/目录] 如果是目录则使其下所有子文件或目录递归生效

例:

请将/home/abc.txt 文件的所有者修改成 user4

[root@hecs-66912 home]# chown user4 abc.txt 
[root@hecs-66912 home]# ll
-rwxr-xr-x 1 user4 root 0 321 02:21 abc.txt

请将 /home/kkk 目录下所有的文件和目录的所有者都修改成user4

[root@hecs-66912 kkk]# ll
总用量 0
-rw-r--r-- 1 root root 0 321 02:27 a
-rw-r--r-- 1 root root 0 321 02:27 b
-rw-r--r-- 1 root root 0 321 02:27 c
[root@hecs-66912 kkk]# cd ..
[root@hecs-66912 home]# ll
drwxr-xr-x 2 root root 4096 321 02:27 kkk
[root@hecs-66912 home]# chown -R user4 /home/kkk/
[root@hecs-66912 home]# ll
drwxr-xr-x 2 user4 root 4096 321 02:27 kkk
[root@hecs-66912 home]# cd kkk
[root@hecs-66912 kkk]# ll
总用量 0
-rw-r--r-- 1 user4 root 0 321 02:27 a
-rw-r--r-- 1 user4 root 0 321 02:27 b
-rw-r--r-- 1 user4 root 0 321 02:27 c

15.5 修改文件/目录所在组

chgrp改变所在组

chgrp [newgroup] [文件/目录]

例:

请将 /home/abc .txt 文件的所在组修改成 g2

[root@hecs-66912 home]# ll
-rwxr-xr-x 1 user4 root 0 321 02:21 abc.txt
[root@hecs-66912 home]# chgrp g2 abc.txt
[root@hecs-66912 home]# ll
-rwxr-xr-x 1 user4 g2 0 321 02:21 abc.txt

请将 /home/kkk 目录下所有的文件和目录的所在组都修改成 g1

[root@hecs-66912 home]# chgrp g1 /home/kkk/
[root@hecs-66912 home]# ll
drwxr-xr-x 2 user4 g1 4096 321 02:27 kkk
[root@hecs-66912 home]# cd kkk
[root@hecs-66912 kkk]# ll
总用量 0
-rw-r--r-- 1 user4 root 0 321 02:27 a
-rw-r--r-- 1 user4 root 0 321 02:27 b
-rw-r--r-- 1 user4 root 0 321 02:27 c

目录下文件更改失败了,因为没加-R,

[root@hecs-66912 home]# chgrp -R g1 /home/kkk
[root@hecs-66912 home]# ll
drwxr-xr-x 2 user4 g1 4096 321 02:27 kkk
[root@hecs-66912 home]# cd kkk/
[root@hecs-66912 kkk]# ll
总用量 0
-rw-r--r-- 1 user4 g1 0 321 02:27 a
-rw-r--r-- 1 user4 g1 0 321 02:27 b
-rw-r--r-- 1 user4 g1 0 321 02:27 c

15.6 权限管理应用实例

警察和土匪游戏

警察 土匪
组名 police bandit
姓名 jc1 tf1
姓名 jc2 tf2
  1. 创建组

    [root@hecs-66912 home]# groupadd police
    [root@hecs-66912 home]# groupadd bandit
  2. 创建用户

    [root@hecs-66912 home]# useradd -g police jc1
    [root@hecs-66912 home]# useradd -g police jc2
    [root@hecs-66912 home]# useradd -g bandit tf1
    [root@hecs-66912 home]# useradd -g bandit tf2
  3. jc1创建一个文件,自己可以读写,本组人可以,其它组没任何权限

    切换到jc1,并创建文件

    [root@hecs-66912 ~]# su jc1
    [jc1@hecs-66912 root]$ cd
    [jc1@hecs-66912 ~]$ touch jc1Create
    [jc1@hecs-66912 ~]$ ll
    总用量 0
    -rw-r--r-- 1 jc1 police 0 321 10:54 jc1Create

    设置权限

    [jc1@hecs-66912 ~]$ chmod 640 jc1Create 
    [jc1@hecs-66912 ~]$ ll
    总用量 0
    -rw-r----- 1 jc1 police 0 321 10:54 jc1Create
  4. jc1修改该文件,让其它组人可以,本组人可以读写

    [jc1@hecs-66912 ~]$ chmod 664 jc1Create 
    [jc1@hecs-66912 ~]$ ll
    总用量 0
    -rw-rw-r-- 1 jc1 police 0 321 10:54 jc1Create
  5. tf1投靠 警察,看看是否可以读写

    首先切换到root,修改tf1所在组

    [jc1@hecs-66912 home]$ su root
    密码:
    [root@hecs-66912 home]# usermod -g police tf1
    [root@hecs-66912 home]# ll
    drwx------ 3 tf1 police 4096 321 14:35 tf1

    其次切换到tf1,尝试看是否能读写,

    无权限进入jc1文件夹,切换到jc1或者root修改jc1目录权限

    [tf1@hecs-66912 home]$ su jc1
    密码:
    [jc1@hecs-66912 home]$ ll
    drwx------ 3 jc1 police 4096 321 14:38 jc1
    [jc1@hecs-66912 home]$ chmod g=rwx jc1
    [jc1@hecs-66912 home]$ ll
    drwxrwx--- 3 jc1 police 4096 321 14:38 jc1

    再次切换到tf1进入jc1读写操作

    [jc1@hecs-66912 home]$ su tf1
    密码:
    [tf1@hecs-66912 home]$ cd jc1
    [tf1@hecs-66912 jc1]$ ll
    -rw-rw-r-- 1 jc1 police 0 321 10:54 jc1Create
    [tf1@hecs-66912 jc1]$ cat jc1Create
    haha
    [tf1@hecs-66912 jc1]$ echo "tf1daoci" >> jc1Create
    [tf1@hecs-66912 jc1]$ cat jc1Create
    haha
    tf1daoci

    写入数据成功

  6. tf2是否能读写?

西游四人组

建立两个组( 神仙(sx),妖怪(yg))

[root@hecs-66912 /]#groupadd sx
[root@hecs-66912 /]#groupadd yg

建立四个用户(唐僧,悟空,八戒,沙僧),把悟空,八戒放入妖怪,唐僧 沙僧在神仙

[root@hecs-66912 /]# useradd -g yg wukong
[root@hecs-66912 /]# useradd -g yg bajie
[root@hecs-66912 /]# useradd -g sx shasen
[root@hecs-66912 /]# useradd -g sx tangsen

设置密码passwd [用户]

用悟空建立一个文件(monkey.java 该文件要输出iam monkey)

[root@hecs-66912 /]# su wukong
[wukong@hecs-66912 /]# cd
[wukong@hecs-66912 ~]$ touch monkey.java
[wukong@hecs-66912 ~]$ echo "i am monkey" > monkey.java
[wukong@hecs-66912 ~]$ cat monkey.java
i am monkey

给八戒一个可以r w 该文件的权限

首先切换用户为root,回到home目录,给予同组对wukong文件夹的rwx权限

[root@hecs-66912 home]# chmod g+rwx wukong
[root@hecs-66912 home]# ll
drwxrwx--- 3 wukong yg 4096 321 16:09 wukong

进入wukong文件夹 将wukong.java的rw权限给同组

[root@hecs-66912 wukong]# ll
总用量 4
-rw-r--r-- 1 wukong yg 12 321 16:07 monkey.java
[root@hecs-66912 wukong]# chmod 664 monkey.java
[root@hecs-66912 wukong]# ll
总用量 4
-rw-rw-r-- 1 wukong yg 12 321 16:07 monkey.java

八戒修改monkey.java 加入一句话(i am pig)

[bajie@hecs-66912 home]$ cd wukong/
[bajie@hecs-66912 wukong]$ ll
总用量 4
-rw-rw-r-- 1 wukong yg 12 321 16:07 monkey.java
[bajie@hecs-66912 wukong]$ echo "i am pig" >> monkey.java
[bajie@hecs-66912 wukong]$ cat monkey.java
i am monkey
i am pig

唐僧 沙僧 对该文件没有权限

yes

把 沙僧 放入妖怪组

首先切换回root登陆,其次更改沙僧组

[root@hecs-66912 home]# usermod -g yg  shasen
[root@hecs-66912 home]# ll
drwx------ 3 shasen yg 4096 321 15:40 shasen

让沙僧 修改 该文件 monkey, 加入一句话(“我是沙僧,我是妖怪!”);

[shasen@hecs-66912 wukong]$ echo "i am shasen,i am in yg" >> monkey.java 
[shasen@hecs-66912 wukong]$ cat monkey.java
i am monkey
i am pig
i am shasen,i am in yg

对于目录设置的rwx权限,只针对目录相关操作,比如ls、创建\删除文件、进入目录等操作

十六 crond定时任务调度

crontab 进行 定时任务的设置

概述

任务调度: 是指系统在某个时间执行的特定的命令或程序

任务调度分类 : 1.系统工作 : 有些重要的工作必须周而复始地执行。如病毒扫描等

个别用户工作 : 个别用户可能希望执行某些程序,比如对mysql数据库的备份。

语法:
crontab [选项]

常用选项

-e 编辑crontab定时任务
-l 查询crontab任务
-r 删除当前用户所有的crontab任务

快速入门

设置任务调度文件:/etc/crontab

设置个人任务调度。执行crontab -e命令

接着输入任务到调度文件

如:*/1**** ls - /etc/ > /tmp/to.txt

意思说每小时的每分钟执行ls -l /etc/ > /tmp/to.txt命令

参数细节说明

5个占位符的说明

项目 含义 范围
第一个“*” 一小时当中的第几分钟 0-59
第二个“*” 一天当中的第几小时 0-23
第三个“*” 一个月当中的第几天 1-31
第四个“*” 一年当中的第几月 1-12
第五个“*” 一周当中的星期几 0-7(0和7都代表星期日)

特殊符号说明

特殊符号 含义
* 代表任何时间。比如第一个“*”就代表一小时中每分钟都执行一次的意思
, 代表不连续的时间。比如“0 8,12,16 * * * [命令]”,就代表在每天的8点0分,12点0分,16点0分都执行一次命令
- 代表连续的时间范围。比如“0 5 * * 1-6[命令]”,代表在周一到周六的凌晨5点0分执行命令
*/n 代表每隔多久执行一次。比如“*/10 * * *[命令]”,代表每隔10分钟就执行一遍命令

特定时间执行任务案例

时间 含义
45 22 * * * [命令] 在22点45分执行命令
0 17 * * 1 [命令] 每周一,17点0分执行命令
0 5 1,15 * * [命令] 每月1号和15号凌晨5点0分执行命令
40 4 * * 1-5 [命令] 每周1到周5的凌晨4点40分执行命令
*/10 4 * * * [命令] 每天凌晨4点这一小时内,每隔10分钟执行一次命令
0 0 1,15 * 1 [命令] 每周1,每月的1号和15号的0点0分执行命令;
注意 星期几和几号最好不要同时出现,因为他们定义都是天,很容易让管理员混乱

实例操作

crontab -r:终止任务调度

crontab -l: 列出当前有那些任务调度

service crond restart [重启任务调度]

案例1 : 每隔1分钟,就将当前的日期信息,追加到 /tmp/mydate 文件中
*/1 * * * * date >> /tmp/mtdate
[root@hecs-66912 tmp]# cat mydate
20230322日 星期三 12:53:01 CST
20230322日 星期三 12:54:01 CST
案例2 : 每隔1分钟,将当前日期和日历都追加到 /home/mycal 文件中

使用shell脚本,首先在home创建脚本,并且赋予文件执行权限

[root@hecs-66912 home]# vim my.sh
[root@hecs-66912 home]# chmod u+x my.sh
[root@hecs-66912 home]# ll
-rwxr--r-- 1 root root 39 322 13:04 my.sh

执行一下脚本试试,新增了mycal文件!

[root@hecs-66912 home]# ./my.sh 
[root@hecs-66912 home]# ll
-rw-r--r-- 1 root root 197 322 13:10 mycal
[root@hecs-66912 home]# cat mycal
20230322日 星期三 13:10:17 CST
三月 2023
日 一 二 三 四 五 六
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

接下来实现题目的需求:

*/1 * * * * /home/my.sh
[root@hecs-66912 home]# tail -f mycal
20230322日 星期三 13:16:01 CST
三月 2023
日 一 二 三 四 五 六
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

20230322日 星期三 13:17:01 CST
三月 2023
日 一 二 三 四 五 六
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
案例3: 每天凌晨2:00 将mysql数据库 testdb ,备份到文件中。提示: 指令为mysqldump -u root -p密码 数据库 >> /home/db.bak

简单版,后面会学更详细的

0 2 * * * mysqldump -u root -p[密码] testdb > /home/db.bak

十七 at定时任务

ps -ef检测当前在运行的进程

ps -ef | grep atd检测在运行的atd进程

基本介绍

  • at命令是一次性定时计划任务,at的守护进程atd会以后台模式运行,检查作业队列来运行。
  • 默认情况下,atd守护进程每60秒检查作业队列,有作业时,会检查作业运行时间,如果时间与当前时间匹配,则运行此作业。
  • at命令是一次性定时计划任务,执行完一个任务后不再执行此任务了
  • 在使用at命令的时候,一定要保证atd进程的启动,可以使用相关指令来查看

at命令格式

at [选项] [时间]

Ctrl+D 按两次,结束at命令的输入

at命令选项

选项 含义
-m 当指定的任务被完成后,将给用户发送邮件,即使没有标准输出
-I atq的别名
-d atrm的别名
-v 显示任务将被执行的时间
-c 打印任务的内容到标准输出
-V 显示版本信息
-q<队列> 使用指定的队列
-f<文件> 从指定文件读入任务而不是从标准输入读入
-t<时间参数> 以时间参数的形式提交要运行的任务

at时间的定义

at指定时间的方法:

  1. 接受在当天的hh:mm(小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。 例如 :04:00
  2. 使用midnight (深夜),noon (中午),teatime ( 饮茶时间,一般是下午4点)等比较模糊的词语来指定时间。
  3. 采用12小时计时制,即在时间后面加上AM (上午)或PM(下午)来说明是上午还是下午。 例如:12pm
  4. 指定命令执行的具体日期,指定格式为month day(月日)或mm/dd/yy ( 月/日/年)或dd.mm.yy(日月.年),指定的日期必须跟在指定时间的后面。 例如 : 04:00 2021-03-1
  5. 使用相对计时法。指定格式为: now + count time-units ,now就是当前时间,time-units是时间单位5.这里能够是minutes(分钟)、hours (小时)、days(天)、weeks (星期)。count是时间的数量几天,几小时。例如 : now + 5 minutes
  6. 直接使用today( 今天)、tomorrow( 明天)来指定完成命令的时间。

at定时任务案例

案例1: 2天后的下午5点执行 /bin/ls /home, 按两次ctrl+d退出代码

方便验证,我改成了当天一小时后

[root@hecs-66912 /]# at -m 2pm + 1 hours
at> /bin/ls /home<EOT>
job 1 at Wed Mar 22 15:00:00 2023
[root@hecs-66912 /]#

案例2 : atq命令来查看系统中没有执行的工作任务

[root@hecs-66912 /]# atq
1 Wed Mar 22 15:00:00 2023 a root

案例3: 明天17点钟,输出时间到指定文件内 比如 /root/date100.log

[root@hecs-66912 /]# at 5pm tomorrow
at> date > /root/date100.log<EOT>
job 2 at Thu Mar 23 17:00:00 2023
[root@hecs-66912 /]# atq
2 Thu Mar 23 17:00:00 2023 a root
1 Wed Mar 22 15:00:00 2023 a root

案例4 : 2分钟后,输出时间到指定文件内 比如 /root/date200.log

[root@hecs-66912 ~]# at -m  now + 2 minutes
at> date >> /root/date200.log<EOT>
job 4 at Wed Mar 22 14:20:00 2023
您在 /var/spool/mail/root 中有邮件
[root@hecs-66912 mail]# cd
[root@hecs-66912 ~]# cat date200.log
20230322日 星期三 14:17:26 CST
20230322日 星期三 14:20:00 CST

邮件内容:

From root@hecs-66912.localdomain  Wed Mar 22 14:20:00 2023
Return-Path: <root@hecs-66912.localdomain>
X-Original-To: root
Delivered-To: root@hecs-66912.localdomain
Received: by hecs-66912.localdomain (Postfix, from userid 0)
id 921D8215D9; Wed, 22 Mar 2023 14:20:00 +0800 (CST)
Subject: Output from your job 4
To: root@hecs-66912.localdomain
Message-Id: <20230322062000.921D8215D9@hecs-66912.localdomain>
Date: Wed, 22 Mar 2023 14:20:00 +0800 (CST)
From: root@hecs-66912.localdomain (root)

案例5: 删除已经设置的任务,atrm 编号

[root@hecs-66912 ~]# atq
2 Thu Mar 23 17:00:00 2023 a root
1 Wed Mar 22 15:00:00 2023 a root
[root@hecs-66912 ~]# atrm 2
[root@hecs-66912 ~]# atq
1 Wed Mar 22 15:00:00 2023 a root

十八 linux磁盘分区、挂载

原理介绍

Linux无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构,Linux中每个分区都是用来组成整个文件系统的一部分。

Linux采用了一种叫“载入”的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来这时要载入的一个分区将使它的存储空间在一个目录下获得。

硬盘挂载到文件目录

image-20230327003139384

硬盘说明

  1. Linux硬盘分IDE硬盘和SCSI硬盘,目前基本上是SCSI硬盘

  2. 对于IDE硬盘,驱动器标识符为“hdx~”,

​ “hd”表明分区所在设备的类型,这里是指IDE硬盘了。

​ “x”为盘号(a为基本盘,b为基本从属盘,c为辅助主盘,d为辅助从属盘),

​ “~“代表分区前四个分区用数字1到4表示,它们是主分区或扩展分区,从5开始就是逻辑分区。

​ 例,hda3表示为第一个IDE硬盘上的第三个主分区或扩展分区,hdb2表示为第二个IDE硬盘上的第二个主分区或扩展分区。

  1. 对于SCSI硬盘则标识为“sdx~”,SCSI硬盘是用“sd”来表示分区所在设备的类型的,其余则和IDE硬盘的表示方法一样。

输入指令lsblk可查看磁盘,我使用的华为云服务器,磁盘是vda.

[root@hecs-66912 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 253:0 0 40G 0 disk
└─vda1 253:1 0 40G 0 part /

vdx~和sdx~的差别

对于物理机和虚拟机有各自磁盘的概念,比如物理机上是真实的磁盘信息,什么叫真实?就是没有进行虚拟化的。

虚拟机上也是要虚拟化磁盘的,对于用户来说就像一台物理机一样。但是既然是虚拟机,那么磁盘可能是虚拟化后的,一般会有固定的名字,

比如经过kvm虚拟化技术虚拟出来的磁盘,名称是vda,vdb等,表示虚拟磁盘。但是也有例外的,见过百度云那边经过kvm虚拟化出来的虚拟机,但是分区名称却叫sdb,而sdb一般是物理机上真实的磁盘分区名称。

一般概念上:vda,vdb叫虚拟磁盘,或者直接说磁盘也行,在linux上的设备文件为/dev/vda/dev/vdb。