Linux
本文最后更新于308 天前,其中的信息可能已经过时,如有错误请发送邮件到3063503032@qq.com

linux基础命令

  • cat:打开文件内容
  • cat-A:显示全部字符
  • cat-n:对文本内容进行编号
  • cat /proc/cpuinfo:查看cpu信息
  • cal:查看日历
  • cd:返回家目录
  • cd.:当前目录
  • cd..:上一级目录
  • cd-:返回上一次所在目录
  • cd~:返回家目录
  • date:查看时间
  • date-s:修改时间
  • echo:输出
  • echo -n:输出完成后不自动换行
  • echo $LANG:查看当前系统语言
    • export LANG=”zh -CN.UTF-8″#切换中文
  • export:修改变量
  • ip a:查看网卡配置信息
  • ls:查看目录下的文件
  • ls-a:查看所有文件,包括隐藏文件
  • ls-d:查看目录文件
  • ls-h:以人类可读的方式显示,就是加个单位
  • ls-l:显示文件信息
  • ls-r:逆序排序,以文件名为排序规则
  • ls-t:以时间顺序排序,最新的在前面
  • ls-R:若目录下有文件,则以下之文件亦皆依序列出
  • mkdir:创建目录
  • man手册

显示在线帮助手册页man 需要帮助的命令或者文件

快捷键

按键用途
空格键向下翻一页
PaGe down向下翻一页
PaGe up向上翻一页
home直接前往首页
end直接前往尾页
/从上至下搜索某个关键词,如“/linux”
?从下至上搜索某个关键词,如“?linux”
n定位到下一个搜索到的关键词
N定位到上一个搜索到的关键词
q退出帮助文档

手册的结构

结构名称代表意义
NAME命令的名称
SYNOPSIS参数的大致使用方法
DESCRIPTION介绍说明
EXAMPLES演示(附带简单说明)
OVERVIEW概述
DEFAULTS默认的功能
OPTIONS具体的可用选项(带介绍)
ENVIRONMENT环境变量
FILES用到的文件
SEE ALSO相关的资料
HISTORY维护历史与联系方式

安装中文man手册

中文man手册翻译的并不完整,但是也可以安装作为一个参考,下面是安装命令,目前可能不能理解是什么意思,后续学习之后就可以看懂命令的含义了。

yum -y install man-pages-zh-CN.noarch
echo “alias cman=’man -M /usr/share/man/zh_CN'” >> .bashrc
source .bashrc

实例

  • 查看echo的man手册

[root@localhost ~]# man echo
ECHO(1)                             General Commands Manual                             ECHO(1)

NAME(名称)
      echo – 显示一行文本

SYNOPSIS(总览)
      echo[OPTION]… [STRING]…

DESCRIPTION(描述)
      允许在标准输出上显示STRING(s).

      -n 不输出行尾的换行符.

      -e 允许对下面列出的加反斜线转义的字符进行解释.

      -E 禁止对在STRINGs中的那些序列进行解释.

  • history:历史命令,可以查看所有敲过的命令
  • histroy-a:立刻将命令追加到.bash_history文件中
  • histroy_d:删除指定的历史命令
  • histroy_c:清空历史命令
  • help:只能查询shell内置命令。例:help cd
  • –help:只能查询linux外部命令。例:ls –help
  • man手册两种形式的命令都包含
  • 可用type查询命令的形式
  • !加字符串加数字、^R执行历史指令
  • passwd  用户名:修改用户密码
  • pwd:查看当前所在目录
  • poweroff:关机
  • stat:查看文件的详细信息
  • whoami:当前系统登录的用户
  • useradd 用户:添加用户
  • touch:创建文件
  • reboot:重启机器
  • yum install -y 包名:安装软件包
  • nmtui:编辑网络

快捷键

  • ^c:打断前台运行的程序
  • ^d:退出,等价于exit
  • ^l:清屏
  • ^a:光标移动到最前端
  • ^e:光标移动到最后端
  • ^z:退出当前进程,把当前进程放进后台并暂停
  • fg:命令重新启动前台被终止的任务,或把后台的工作恢复到前台进行
  • bg:把中断的任务放在后台进行

命令语法

命令+参数+文件或路径

参数:1.短参数:一个减号就是短参数,短参数可以合并写

2.长参数:两个减号就是长参数,一般不可以合并写

tab 一次可以补全命令,tab两次可以查看所有可用命令(前提是安装了bash-complation)

命令别名

alias:查看当前系统已拥有的命令别名

alias c=cd

unalias:取消命令别名

unalias c

\ 命令:不按照别名来执行命令

linux的层次化目录结构

bin:普通用户使用的命令,从red hat7开始被淘汰,软链接到了/user/bin

sbin:管理员使用的命令,从red hat7开始被淘汰,软链接到了/user/bin

dev:设备文件

root:超级管理员的家目录

proc:内核相关信息

usr:系统文件

boot:系统启动相关

etc:各软件的配置文件目录

tmp:临时目录

var:经常改动的文件

media:媒体设备

mnt:挂载目录

文件管理

增删复移

创建文件

                touch:当文件不存在时会创建文件,当文件存在时会更新文件创建的时间,不会覆盖文件内容

                mkdir:创建目录

                            -p:递归创建

                            -v:展示创建的详细过程

复制文件

                  cp:复制文件

                  cp-r:递归复制

                  cp-f:强制拷贝

                  cp-v:显示复制过程

移动文件:

mv:类似剪切的功能

删除文件或目录(删除目录要加-r参数):rm:

                        -r:递归删除

                        -f:强制删除

删除目录:    rmdir:目录下如果有文件会删除失败,需要先删除文件

                         -p:递归删除,要列出所有要删除的目录

                         -v:展示删除过程

查看文件

cat:打开文件内容,一次性全部加载,当文件非常大时会大致占用大量系统io,有可能会造成io阻塞

tac:倒过来打开文件内容,一次性全部加载

more:一页一页的查看文档内容,回车换行,空格换页,q退出,b往回看

less:一页一页的查看文档内容,回车换行,空格换页,q退出,b往回看

head:从文件开头开始查看,默认一次性查看十行内容,head-5即为看五行

         -n<行数>:查看指定行数

tail:从文件末尾开始查看,默认一次性查看十行内容,

        -n<行数>:查看指定行数

        -f:实时追踪文件

tailf:等价于tail-f,实时监测文件末尾内容

grep:针对文件内容进行过滤

grep ‘^root’:查找以root开头的文件

grep ‘root$’:查找以root结尾的文件

grep ‘.bash’:查找以.bash

grep -v:反向选择

文件时间

atime:文件最近访问的时间(access)

mtime:文件内容最近被修改的时间(modify)

ctime:文件状态最近被修改的时间(change)

less和more的区别

在Linux中,lessmore命令都用于分页查看文本文件,但它们之间存在一些区别:

上下方向键控制显示。less允许用户使用上下方向键浏览文件内容,类似于翻书;more则只能向前翻页,不能向后翻页。 加载文件。less在查看文件内容时,不会一次性加载整个文件,只有在用户请求查看特定行时才会加载这些行,因此加载速度通常比more快;more则会加载整个文件到内存中,然后分页显示。 书签和搜索。less支持使用行号或百分比作为书签,便于导航;还支持正向和反向搜索功能,允许用户快速定位到特定的文本;more不支持搜索功能,但可以通过/?符号进行正向和反向搜索。 编辑功能。less允许用户在查看文件内容时进行编辑,可以使用v键调用外部编辑器;more不支持对文件内容的编辑。 退出后显示。less退出后不会在终端中留下刚刚显示的内容;more退出后会在终端中留下显示的内容。 综上所述,less在加载速度、浏览和编辑文件内容方面优于more,而more在基本分页显示和简单导航方面更为实用。用户可以根据自己的需求选择合适的命令。

文件类型

-:普通文件

d:目录文件

p:管道文件

l:链接文件

s:socket套接字文件

b块(block)设备文件(块设备)存储设备硬盘,U盘 /dev/sda,/dev/sda1

c字符设备文件(字符设备)打印机,终端 /dev/tty1,/dev/zero

ll:查看文件类型(file,stat也可以查看)

查找文件

which

:只能查找环境变量里的文件(which指令会在环境变量 $PATH 设置的目录里查找符合条件的文件)

补充知识:环境变量

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。

简单的理解就是告诉操作系统在程序运行的时候,有一些默认的设置是什么。

比如上面我们修改了LANG变量,就是一个环境变量,会影响到显示的语言是中文还是英文。

比如在讲解pwd命令的时候,我们修改了$PWD变量,就影响了当前所处的文件夹。

在我们使用shell命令行输入命令的时候,其实每个命令都是有一个可执行文件去完成我们下达的任务,这个可执行文件在操作系统中是分布在不同的文件夹中的,我们总不能每次执行的时候都要告诉操作系统这个文件在哪里,那么就算是查看一个文件,我们都需要输入如下的命令:[root@localhost ~]# /usr/bin/ls -lh
# 在Linux中,ls的可执行程序在/usr/bin目录下

这样就太麻烦了,所以就指定了一个环境变量$PATH,这个变量中有很多的目录地址,当我们执行命令的时候,操作系统就会到这些目录中查找,是否存在你所输入的命令。如果有那么就会去执行。[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

如果你想让自己安装的某个软件可以在操作系统的任意位置直接输入文件名执行,那么你也可以把自定义的目录加入到这个$PATH

实例

  • 查看ls命令的可执行文件在什么目录

[root@localhost ~]# which ls
alias ls=’ls –color=auto’
  /usr/bin/ls
# which会先告诉你ls其实是一个别名
# 然后显示出来ls所在的具体位置

小知识:我们在执行ls的时候,其实执行的是ls --color=auto这条命令,在显示文件的时候使用不同的颜色表示不同的文件类型,如果我们想执行ls本体,而不想执行别名,我们可以输入\ls就可以了,这样就不会有不同的颜色表示文件类型了。

  • 查看poweroff在什么目录

[root@localhost ~]# which poweroff
/usr/sbin/poweroff

locate

要进行安装yum install -y mlocate

locate:定位

:用于查找文件,但是不是实时更新

  • 手动更新,输入 updatedb 默认情况下
  • updatedb 会每天自动执行一次
  • 配置文件在/etc/updatedb.conf

选项

  • -c:只输出找到的数量
  • -n:至多显示 n个输出
  • -i:忽略大小写
  • -r:使用基本正则表达式
  • –regex:使用扩展正则表达式
  • -d DBPATH:使用 DBPATH 指定的数据库,而不是默认数据库 /var/lib/mlocate/mlocate.db

find

查找条件:

  • 文件名:find 指定路径 -name ”文件名称“

                  :find 指定路径 -i name”文件名称“(忽略大小写)

                  :find 指定路径 -name ”_文件名称“(忘记了具体名称时可用 _替代)

  • 文件大小:find 指定路径 -size+(-)( ) 文件大小
  • 查找的目录深度:find 指定路径 -maxdepth 数字
  • 按照时间 :find 指定路径-amctime +(-)( ) 天数
  • 按照文件类型:find 指定路径-type 文件类型
  • 按照文件属主,属组:find 指定路径 -user 主名 -group 组名
  • :find 指定路径 -nouser 主名 -nogroup 组名
  • 按照文件权限: find 指定路径 -perm 644(r=4,w=2,x=1)
    • 参数
    • find -perm 644:精准匹配权限为644的文件
    • find -perm -644:匹配权限至少为644的文件
    • find -perm +644(centos7为-perm /644):匹配所属主或组或其他人的权限任意满足一个的文件
  • 按照正则表达式:find /etc -regex ‘. _ ifcfg-ens[0-9] [0-9] ( ._ 任意多个字符 ,[0-9] 任意一个数字)
  • 条件组合:
    • -a:多个条件and并列
    • -o:多个条件or并列
    • -not:条件取反find

处理动作:以参数形式加在末尾

  • ‐print:每个查找结果后加换行符,为默认效果
  • ‐ls:类型于对查找到的文件执行 ls ‐l 命令
  • ‐delete:删除查找到的文件
  • ‐fls /path/to/somefile:查找到的所有文件的长格式信息保存至指定文件中
  • ‐ok 命令{} \ ; :对查找到的每个文件执行由COMMAND指定的命令,需要确认
  • ‐exec 命令 {} \; :对查找到的每个文件执行由COMMAND指定的命令,不需要确认
  • {}:用于查找到的文件名称自身

vim的使用

vim配置永久生效方法:配置文件:~/.vimrc

                    /ect/vimrc

  • 在家目录添加一个.vimrc的文件,在里面添加自己的配置
  • 在/etc/vimrc文件末尾添加配置

光标跳转:kjhl,w,e,b,gg,G,^,$,0

文本编辑:r,x,d,y,p,u

行末模式:q,w,wq,w!,q!,r,x(相当于wq),X(加密文件),ZZ

自定义设置:set nu,set nonu, set ts=4(将tab设置为四个空格),set ai,set noai

复制删除

yy  复制

nyy  从当前行开始复制n行

p  粘贴到下一行

P  粘贴到上一行

D  当前光标删除到行尾

dd  剪切当前行

.    删除下一行

ndd  从当前行开始向后删除n行

dnG  删除第n行到当前行的数据

x  向后删除一个字符

nx  向后删除n个字符

X  向前删除一个字符

搜索

n  查找下一个

N  查找上一个

:/内容  从光标位置向下搜索

:?内容 从光标位置向上搜索

取消高亮::noh

替换

g为全局替换,当同一行有多个目标时加g会全部进行替换

:n1,n2s/原内容/修改内容/g:从n1行到n2行进行替换

:n1,n2s/原内容/修改内容/gc:用户需确认是否替换

:1,$s/原内容/修改内容/g或%s/原内容/修改内容/g:从第一行到最后一行进行替换

撤销

u  撤销

U  撤销当前行所有操作。

ctrl-r  重做

:e!   回复至文档原始状态

块操作

v  选中光标经过的字符

V  选中光标经过的行

ctrl-v  选中矩阵

y  复制被选中的数据

d  删除被选中的数据

多文件编辑

vim file1 file2  同时编辑file1 file2

:files  列出vim当前打开的文件列表

:n  编辑下一个文件

:N  编辑上一个文件

:sp file2(:split) 分屏显示file2

vim -o file1 file2 垂直显示

vim -O file1 file2 水平显示

ctrl-w,j  向上切换窗口

ctrl-w,k  向下切换窗口

其他操作

set nu  设置行号

set nonu  取消行号

:r filename  将文件内容插入到光标位置下一行

:!command  暂时离开vi ,执行command

:r!command 将命令输入插入光标当前位置

插入

s  删除一个字符在当前位置编辑

i  在光标前插入

I  在行首插入

a  在光标后插入

A  在行末插入

o  在下一行插入

O  在上一行插入

r  输入替换光标位置字符

R  进入输入替换模式

~  大小写转换

保存

:w  保存

:w!  强制保存

:w filename  另存为

n1 n2 w filename  将第n1行,n2行另存为filename

退出

:q!  强制不保存退出

:wq!  强制保存退出

😡  保存并退出

ZZ 若文档未改动,则直接离开,若改动,则保存后离开

光标移动

h  左

j  上

k  下

l  右

$  行尾

0  行首

G  文档结尾

gg  文档第一行

w  按单词后移

b   按单词前移

(   按句子前移

)   按句子后移

{   按段落前移

}   按段落后移

nG   光标到文档第n行

n  光标下移n行

n  光标后移n字符

n<左右方向键>  光标左右移动

pageup  向上翻页

ctrl-b  向上翻页

pagedown  向下翻页

ctrl-f  向下翻页

移动光标的用法

删除,剪切,复制,粘贴

编辑模式

保存,退出离开的指令

vim环境变量

重定向

输出重定向

用户和用户组管理

id:查看用户id以及该用户的所属组id

uid的约定:

  • 0:超级管理员:拥有该操作系统的所有权利
  • 1~999:系统用户
  • 1000+:普通用户

查看文件拥有者:

ps aux:查看运行进程的用户

相关文件

  • passwd文件:用于保存用户信息

格式为:用户名:密码:uid:gid:描述:家目录:登陆后执行的命令

/bin/bash命令为开启shell

  • shadow文件:用于存储用户密码和此密码的有效期

格式为:用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前 的警告天数:密码过期后的宽限时间:账号失效时间:保留字段

  • group文件:用于存储用户和组的关系

格式为:组名:密码:组标识号:组内用户列表

用户组管理

添加用户组:groupadd

参数:

-r:创建系统工作组

-g:指定gid

修改用户组:groupmod

参数:

-g:修改gid

-n:修改组名

-o:允许使用重复的gid

例:groupmod -n 修改名 原名

groupmod -g gid 组名

删除用户组:groupdel

注:若该群组中仍包括某 些用户,则必须先删除这些用户后,方能删除群组

查看用户组:cat /etc/group

用户组成员管理:gpasswd

gpasswd 是 Linux 下工作组文件 /etc/group 和 /etc/gshadow 管理工具,用于将一个用户添加到组或 者从组中删除

参数:

-a:添加用户到组(先填用户名,再填组名)

-d:从组删除用户

-A:指定管理员

-M:指定组成员和-A的用途差不多

-R:限制用户登入组,只有组中的成员才可以用newgrp加入该组

用户管理

groups:可查看当前用户所属组

添加用户:useradd

参数:

-c:对用户进行注释

-d:指定用户家目录,如果目录不存在,可同时使用-m创建目录

-m:创建用户家目录,为默认选项

-g:指定用户的所属组,默认会创建一个和用户名相同组名的组

-G:指定用户所属的附加组

-s:指定用户的登录shell

-u:指定用户的uid

-r: 指定系统用户

修改用户:usermod

参数

-c:修改注释

-a:追加,默认的修改是覆盖,与-G一起使用,可添加附加组

-d:修改用户登录时的目录

-e:修改账号的有效期限

-f:修改在密码过期后多少天关闭该账号

-g:修改用户所属组,强制使用-g修改的组为新主组

-G:修改所属的附加组

-l<帐号名称>:修改用户帐号名称

-L:锁定用户密码,使密码无效

-s:修改用户登入后所使用的shell

-u:修改uid

-U:解除密码锁定

例如:usermod 用户名 -a -G 所添加附加组名

usermod -s shell命令 用户

删除用户:userdel

参数:-r:删除用户账号的相关文件

  • passwd文件中的shell

/bin/bash:这个是Linux的命令行工具,我们正常登陆之后默认就是进入命令行

/sbin/nologin:如果写成nologin,那么用户将无法登录,有些用户是作为进程权限管理而存在 的,不需要登录。如果提供登录的功能反而不安全,所以写成nologin

用户密码管理

passwd 用户名:用于修改用户密码,不加用户名即为给自己改密码

-k:保持身份验证令牌不过期

-d:删除已命名帐号的密码(仅限root用户)

-l:锁定指名帐户的密码(仅限 root 用户)

-u:解锁指名账户的密码(仅限 root 用户)

-x:密码的最长有效时限(只有根用户才能进行此操作)

-n:密码的最短有效时限(只有根用户才能进行此操作)

-w:在密码过期前多少天开始提醒用户(只有根用户才能进行此操作)

-i:当密码过期后经过多少天该帐号会被禁用(只有根用户才能进行此操作)

-S:报告已命名帐号的密码状态(只有根用户才能进行此操作)

–stdin:从标准输入读取令牌(只有根用户才能进行此操作)

login.defs文件:创建新用户时的限制文件

/etc/login.defs 文件是用来创建用户时进行一定的限制,但是优先级低于 /etc/passwd 和 /etc/shadow ,如果有冲突的地方,系统会以 /etc/passwd 和 /etc/shadow 为准[root@localhost ~]# egrep -v ‘^[ ]*$|^#’ /etc/login.defs
MAIL_DIR /var/spool/mail # 系统消息(邮件)文件夹
PASS_MAX_DAYS 99999 # 密码有效最大天数
PASS_MIN_DAYS 0 # 密码有效最小天数
PASS_MIN_LEN 5 # 密码长度
PASS_WARN_AGE 7 # 密码失效警告倒计时
UID_MIN 1000 # 用户UID最小1000
UID_MAX 60000 # 用户UID最大60000
SYS_UID_MIN 201 # 系统用户UID最小201
SYS_UID_MAX 999 # 系统用户UID最大999
GID_MIN 1000 # 用户组GID最小1000
GID_MAX 60000 # 用户组GID最大60000
SYS_GID_MIN 201
SYS_GID_MAX 999
CREATE_HOME yes # 创建家目录
UMASK 077 # 创建文件/目录的权限掩码
USERGROUPS_ENAB yes # 创建用户时同时生成组是 如果此处是no 创建的用户 会是gid=100(users)groups=100(users)
ENCRYPT_METHOD SHA512 # 加密 方法 sha 512 这个方法生成的密码在/etc/shadow里面的第二列会以$6$开头

chage:用于更改用户密码的过期信息

参数:

-d:每次登陆都要更改密码

-E 过期日期:将帐户过期时间设为“过期日期”

-I INACITVE:过期 INACTIVE 天数后,设定密码为失效状态

-l:显示帐户年龄信息

-m 最小天数:将两次改变密码之间相距的最小天数设为“最小天数”

-M 最大天数:将两次改变密码之间相距的最大天数设为“最大天数”

-W 警告天数:将过期警告天数设为“警告天数”

当你新建用户的时候,用户的home目录下会有一些默认的隐藏文件,这些隐藏文件是在创建 用户的时候从 /etc/skel/ 中复制过去的。

skel目录

:/etc/skel目录是用来存放新用户配置文件的目录,当我们添加新用户时,这个目录下的所有文件会自动被复制到新添加的用户家目录下,默认情况下,/etc/skel 目录下的所有文件都是隐藏文件(以.点开头的文件);通过修改、添加、删除/etc/skel目录下的文件,我们可以为新创建的用户提供统一、标准的、初始化用户环境。

例如:

我们统一给新添加的用户家目录下发一份使用通知文件。

我们先在/etc/skel/目录下创建好通知文件,然后再添加新用户,最后查看新用户家目录下查看是否有通知文件。

当切到普通用户下出现以下问题:多半是环境变量出问题了,可以从root用户/etc/skel目录下把.bash*文件拷贝到普通用户家目录下即可。

当然我们也可以配置环境变量例如:

PS1='[\u@\h \w \t]$’

可以通过修改/etc/default/useradd来控制新用户的配置信息

sudoers

用户可用sudo命令提取权限

格式为:sudo 提权用户名 提权操作

/etc/sudoers文件:当用户执行sudo时,系统会主动寻找 /etc/sudoers 文件,判断该用户是否有执行sudo的权限

通过useradd添加的用户,并不具备sudo权限。在ubuntu/centos等系统下, 需要将用户加入admin组或 者wheel组或者sudo组,可使用usermod -a -G 将用户追加到admin,wheel,sudo组从而使他们拥有提权权限

配置文件

sudo的权限控制可以在 /etc/sudoers 文件中查看到。一般来说,通过cat /etc/sudoers指令来查看该 文件, 会看到如下几行代码。

对/etc/sudoers文件进行编辑的代码公式可以概括为

授权用户/组 (字段1)主机(字段2)=[(切换到哪些用户或组)](字段3) [是否需要输入密码验证] (字段4)命令1,命令2,…(字段5)

编辑配置文件

visudo:修改配置文件,如果出错会有提示

文件权限管理

Linux 系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。

为了保护系统的安全性,Linux 系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。

在 Linux 中我们通常使用以下两个命令来修改文件或目录的所属用户与权限:

  • chown (change ownerp) : 修改所属用户与组。
  • chmod (change mode) : 修改用户的权限。

在 Linux 中我们可以使用 ll 或者 ls –l 命令来显示一个文件的属性以及文件所属的用户和组

每个文件的属性由左边第一部分的 10 个字符来确定(如下图)。

从左至右用 0-9 这些数字来表示。

  • 第 0 位确定文件类型,第 1-3 位确定属主(该文件的所有者)拥有该文件的权限。
  • 第4-6位确定属组(所有者的同组用户)拥有该文件的权限,第7-9位确定其他用户拥有该文件的权限。
  • 其中,第 1、4、7 位表示读权限,如果用r字符表示,则有读权限,如果用-字符表示,则没有读权限;
  • 第 2、5、8 位表示写权限,如果用w字符表示,则有写权限,如果用-字符表示没有写权限;第 3、6、9 位表示可执行权限,如果用x字符表示,则有执行权限,如果用-字符表示,则没有执行权限。

chown:修改文件目录的属主属组

格式 :chown  属主.属组 文件名

参数:

-R:递归修改,处理指定目录和其子目录下的所有文件

-v:显示修改过程

chomd:修改文件目录权限

参数:

-f:强制修改,不显示错误讯息

-v:显示修改过程

-R:递归修改chmod a+w
chmod g+w
chmod u+w
chmod o+w
chmod a=rw
chmod a-w# 权限 rwx 二进制
7 读 + 写 + 执行 rwx 111
6 读 + 写 rw- 110
5 读 + 执行 r-x 101
4 只读 r– 100
3 写 + 执行 -wx 011
2 只写 -w- 010
1 只执行 –x 001
0 无 — 000
[root@localhost ~]# ll
总用量 8
-rwxr-xr-x. 1 root root 12 9月 8 2023 1.jobs
-rw-r–r–. 1 root root 0 9月 8 2023 1.txt
-rw——-. 1 root root 1241 8月 21 2023 anaconda-ks.cfg
[root@localhost ~]#
[root@localhost ~]# chmod 777 1.txt
[root@localhost ~]# ll
总用量 8
-rwxr-xr-x. 1 root root 12 9月 8 2023 1.jobs
-rwxrwxrwx. 1 root root 0 9月 8 2023 1.txt
-rw——-. 1 root root 1241 8月 21 2023 anaconda-ks.cfg

注:普通用户如果想使用touch之类的命令,不仅对touch命令要有权限,对当前的目录也要有可执行权限

文件访问控制列表

文件访问控制列表(ACL)提供了一种更细粒度的权限控制,允许管理员在文件和目录级别上指定不同用户和组的权限。使用ACL可以解决标准Unix权限模型所无法涵盖的某些复杂场景,例如需要为多个用户或组设置特定的权限,以及需要对已存在的权限进行微调或限制访问。

ACL的使用可以更加灵活地管理文件和目录的权限,允许管理员为特定用户或组分配读、写、执行等具体权限,而不受传统Unix权限模型中“所有者/所属组/其他人”三种身份的限制。这种更加灵活的权限控制有助于满足企业环境中复杂的安全需求,同时也更好地保护敏感数据不被未经授权的用户访问。

总的来说,ACL提供了更多精细化的权限设置,使得管理员能够更好地控制文件和目录的访问,从而增强系统的安全性和灵活性。

getfacl

查看文件访问控制列表的详细内容

参数:

-a:仅显示文件访问控制列表

-d:仅显示默认的访问控制列表

-c:不显示注释表头

-e:显示所有的有效权限

-E:显示无效权限

-R:递归显示子目录

-t:使用制表符分隔的输出格式

实例

  • 查看acl权限列表

[root@localhost ~]# getfacl anaconda-ks.cfg
# file: anaconda-ks.cfg
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

  • 查看acl权限列表,不显示注释表头

[root@localhost ~]# getfacl -c anaconda-ks.cfg
user::rwx
group::r-x
other::r-x

setfacl

设置文件访问控制列表setfacl [-bkndRLP] { -m|-M|-x|-X … } file …

参数:

-m:更改文件facl权限

M:从文件读取访问控制列表条目更改

-x:根据文件中访问控制列表移除条目

-X:从文件读取访问控制列表条目并删除

-b:删除所有扩展访问控制列表条目

-k:移除默认访问控制列表

-d:应用到默认访问控制列表的操作

-R:递归操作子目录

例如:setfacl -m u:user1:rx /workdir/

注:在u前面加上一个d,就可以设置默认facl权限

实例

  • 给指定用户添加acl权限
  • 首先用户user1是没有/workdir的权限的

[root@localhost ~]# groupadd worker
[root@localhost ~]# mkdir /workdir
[root@localhost ~]# chown root:worker /workdir
[root@localhost ~]# chmod 770 /workdir # 不允许其他用户对目录的权限
[root@localhost ~]# ll -d /workdir/
drwxrwx—. 2 root worker 6 4月 14 09:14 /workdir/
[root@localhost ~]# su – user1
[user1@localhost ~]$ cd /workdir/
-bash: cd: /workdir/: 权限不够

  • 单独给予user1的可读和可进入权限

[root@localhost ~]# setfacl -m u:user1:rx /workdir/
[root@localhost ~]# getfacl -c /workdir
user::rwx
user:user1:r-x # 成功添加user1对workdir的权限
group::rwx
mask::rwx
other::—
[root@localhost ~]# su – user1
[user1@localhost ~]$ cd /workdir/
[user1@localhost workdir]$ ll -d
drwxrwx—+ 2 root worker 6 4月 14 09:14 . # 权限位后面多了一个”+”,表示存在ACL权限
[user1@localhost workdir]$ touch file
touch: 无法创建”file”: 权限不够

  • 移除user1的访问控制列表权限

[root@localhost ~]# setfacl -x u:user1 /workdir/
[root@localhost ~]# getfacl -c /workdir/
user::rwx
group::rwx
mask::rwx
other::—

  • 创建worker2组,然后给这个组访问acl的权限,将user1加入worker2组验证是否成功

[root@localhost ~]# groupadd worker2
[root@localhost ~]# setfacl -m g:worker2:rwx /workdir
[root@localhost ~]# usermod -aG worker2 user1
[root@localhost ~]# su – user1
[user1@localhost ~]$ cd /workdir/
[user1@localhost workdir]$ touch file

  • 对workdir设置的acl权限并不会被之后在workdir下创建的子文件和子目录继承,可以设置默认ACL权限,来让目录下面的新建文件和文件夹都继承父目录的权限

#设置权限
[root@localhost ~]# setfacl -m user1:rx /workdir
[root@localhost ~]# getfacl -c /workdir/
getfacl: Removing leading ‘/’ from absolute path names
user::rwx
user:user1:r-x
group::rwx
mask::rwx
other::—
现在外面的目录是有user1的权限的
但是新建一个文件
[root@localhost ~]# touch /workdir/123
[root@localhost ~]# getfacl -c /workdir/123
getfacl -c /workdir/123
getfacl: Removing leading ‘/’ from absolute path names
user::rw-
group::r–
other::r–
不会继承父级目录的权限
#清楚权限
[root@localhost ~]# setfacl -b /workdir
# 在前面加上一个d,就可以设置默认facl权限
[root@localhost ~]# setfacl -m d:u:user1:rx /workdir
[root@localhost ~]# getfacl -c /workdir
user::rwx
group::rwx
other::—
default:user::rwx # 前面多出来了default
default:user:user1:r-x
default:group::rwx
default:mask::rwx
default:other::—
[root@localhost ~]# touch /workdir/newfile
[root@localhost ~]# getfacl -c /workdir/newfile
user::rw-
user:user1:r-x #effective:r– # 新建的文件会自动继承
group::rwx #effective:rw-
mask::rw-
other::—
#这里继承的都没有x是因为被mask给限制了

mask有效权限

mask 权限,指的是用户或群组能拥有的最大 ACL 权限,也就是说,给用户或群组设定的 ACL 权限不能 超过 mask 规定的权限范围,超出部分做无效处理。

在u前面加上一个m,就可以设置mask权限

例如:setfacl -m d:u:user1:rx /workdir[root@localhost ~]# setfacl -m m::rwx /workdir/newfile
[root@localhost ~]# getfacl -c /workdir/newfile
user::rw-
user:user1:r-x
group::rwx
mask::rwx
other::—

特殊权限

suid

只能运行在文件上,开放文件所有者权限给其他用户,如果给一个非二进制文件文件附加 suid 权限,则会显示大 写S,属于无效

普通用户能够执行passwd命令修改自己的密码,修改密码其实就是修改/etc/shadow这个文件,查看/etc/passwd这个文件的权限,发现除了root其他人没有写权限,但是普通用户能够成功执行passwd,其原因就在于passwd这个命令的权限是rwsrw----,其中s的作用就是让执行命令的人具有和该命令拥有者相同的权限。[root@localhost ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 6月 10 2014 /usr/bin/passwd

  • 切换成普通用户输入修改密码命令

[root@localhost ~]# su – user1
[user1@localhost ~]$ passwd
更改用户 user1 的密码 。
为 user1 更改 STRESS 密码。
(当前)UNIX 密码:

  • 保持这个会话别端口,新建一个ssh会话,查看系统进程,可以看到当前是调用root用户执行的passwd命令

[root@localhost ~]# ps -aux |grep passwd
root 7521 0.0 0.1 170760 2052 pts/0 S+ 10:24 0:00 passwd

  • 如果想自己添加suid权限,可以输入下面两个命令

chmod u+s file
chmod 4765 file#suid4,sgid2,sticky1

sgid

可以运用于文件和目录,

运用在文件的含义是开放文件所属组的权限给其他用户,即当用户 执行该执行文件时,会拥有该执行文件所属组用户的权限

运用在目录上的含义是,在该目录下所有用户创建的文件或者目录的所属组都和其一样,即如 果 /home/user1 目录具有 sgid 权限,且所属组是 user1 ,则任何用户在 /home/user1 下创建的子目 录或者文件的所属组都是 user1

如果一个文件或目录具有sgid权限,那他的所属组最后一位权限为s

  • 设置sgid,让用户在workdir下创建的文件都属于worker组

[root@localhost /]# chmod g+s /workdir/
[root@localhost /]# cd /workdir/
[root@localhost workdir]# touch file
[root@localhost workdir]# ls -l
总用量 0
-rw-rw—-+ 1 root worker 0 4月 14 11:05 file
这里用户是root创建的,但是组是worker

sticky

sticky 权限只能运用于目录上,含义是该目录下所有的文件和子目录只能由所属者删除,即使其的权限 是777或者其他。一个公共目录,每个人都可以创建文件,删除自己的文件,但不能删除别人的文件

chattr文件属性

chattr可用于修改文件或目录属性

a:让文件或目录只能追加内容

b:不更新文件或目录的最后存取时间

c:将文件或目录压缩后存放

d:将文件或目录排除在倾倒操作之外

i:不得任意修改该文件或者目录

s:保密性删除文件或目录

S:即时更新文件或目录

u:预防意外删除

lsattr:查看文件或目录的chattr属性

参数:-R:递归处理,将指定目录下的所有文件及子目录一并处理

-v <版本编号>:设置文件或目录版本

-V:显示指令执行过程

+<属性>:开启文件或目录的该项属性

-<属性>:关闭文件或目录的该项属性

= <属性>:指定文件或目录的该项属性

umask

umask表示要减掉得到权限

用umask命令直接查看当前用户的umask

umask-S可直接查看权限

文件:666-umask

目录:777-umask

  • 查看当前用户的umask权限

[root@localhost ~]# umask
0022
默认文件权限是666-umask 目录是777-umask
在linux中可能出于安全考虑,默认新建文件都为666权限,没有执行权限

  • 查看最终有的权限

[root@localhost ~]# umask -S
u=rwx,g=rx,o=rx

  • 修改umask的数值(临时)

[root@localhost ~]# umask 0000
[root@localhost ~]# mkdir dir
[root@localhost ~]# ll
总用量 4
drwxrwxrwx. 2 root root 6 4月 14 11:25 dir
-rw-rw-rw-. 1 root root 0 4月 14 11:25 file

  • 修改umask的数值(永久)

[root@localhost ~]# vim /etc/profile
————–
59 if [ $UID -gt 199 ] && [ “`/usr/bin/id -gn`” = “`/usr/bin/id -un`” ]; then
60 umask 002
61 else
62 umask 022
63 fi
—————
[root@localhost ~]# source /etc/profile # 立即在当前shell中生效

  • 通过umask决定新建用户HOME目录的权限

[root@localhost ~]# vim /etc/login.defs
—————–
61 # The permission mask is initialized to this value. If not specified,
62 # the permission mask will be initialized to 022.
63 UMASK 077
——————

进程

父进程复制自己的地址空间(fork)创建一个新的(子)进程结构。每个新进程分配一个唯一的进程ID(PID), 满足跟踪安全性之需。PID和父进程ID(PPID)是子进程环境的元素,任何进程都可以创建子进程,所有进 程都是第一个系统进程的后代

systemd

管理进程的东西

centos7上所有的进程都是systemd的后代,systemd的功能繁多,不仅用来管理服务,还可以管理挂载 点,定义定时任务等。这些工作都是由编辑相应的配置单元文件完成的

systemdunit类型:

unit文件保存位置

管理系统服务

启动服务:systemctl start 进程

停止服务:systemctl stop 进程

重启服务(没启动的服务也会启动):systemctl restart 进程

启用开机自启服务:systemctl enable进程

停用自启服务:systemctl disable 进程

检查服务状态查看服务是否自启:

systemctl status name.service

一个服务设置为开机启动使用会将 /usr/lib/systemd/system/name.service 软链接 到 /etc/systemd/system/ ,但是 enable 命令不会重写已经存在的链接,所以当我们修改了服务文件 就需要重新加载

top

实时显示进程的状态

load average: 0.00, 0.01, 0.02三个数字分别表示一分钟,五分钟,十五分钟的cpu负载,几个核,最大值就为几

如果CPU有两个核,则在top命令中,load average达到2.00就表示系统已经过载。 这是因为load average指的是系统的平均负载,而在一个双核系统中,满负载时的load average值应该是与核心数相等

退出top:q,ctrlc

参数:

-d: 改变显示的更新速度

-c: 切换命令显示模式

-S: 累积模式,会将己完成或消失的子行程 ( dead child process ) 的 CPU time 累积起来

-s: 安全模式,将 交互式指令取消, 避免潜在的危机

-i: 不显示任何闲置 (idle) 或无用 (zombie) 的行程

-n: 更新的次数,完成后将会退出 top

-b: 显示模式,搭配 “n” 参数一起使用,可以用来将 top 的结果输出到文件内(可以将top下的内容重定向到文件里)

交互模式的快捷键:

快捷键功能
空格立即刷新
P根据CPU使用多少排序
T根据时间、累计排序
q退出top命令
m切换显示内存信息
t切换显示进程和CPU状态信息
c切换显示命令名称和完整命令行
M根据内存的大小排序
W将当前设置写入 ~/.toprc 文件中,这是top配置文件推荐方法
N以PID的大小排序
z彩色

kill

删除执行中的程序或工作

编号信号名作用
1SIGHUP重新加载配置
2SIGINT键盘中断^C
3SIGQUIT键盘退出
9SIGKILL强制终止
15SIGTERM终止(正常结束),缺省信号,优雅的结束
18SIGCONT继续
19SIGSTOP停止
20SIGTSTP暂停^Z
  • 杀死所有的ping命令,在linux命令中,使用反引号`包含的命令会优先执行,并将执行的结果作为参数提供给命令。

[root@localhost ~]# kill `pgrep ping`

  • 强制杀死进程

[root@localhost ~]# kill -KILL 123456
[root@localhost ~]# kill -9 123456

  • 重新加载配置

[root@localhost ~]# kill -HUP pid
[root@localhost ~]# kill -1 pid

pkill

pkill 用于杀死一个进程,与 kill 不同的是它会杀死指定名字的所有进程,类似于 killall 命令

参数:

-u:指定用户名

-t:指定终端(w可查看终端编号)

  • 结束所有的sshd进程

[root@localhost ~]# pkill sshd

  • 结束用户user1的所有进程

[root@localhost ~]# pkill -u user1

  • 终止pts/2上所有进程

[root@localhost ~]# pkill -t pts/2

  • 终止pts/2上所有进程,并结束pts/2

[root@localhost ~]# pkill -9 -t pts/2

ps

显示当前进程的状态

a :显示终端上的所有进程,包括其他用户地进程

-A:列出所有的进程

-e:列出所有的进程

f:显示进程的层级关系

‐H:以进程层级格式显示进程相关信息

-w:显示加宽可以显示较多的信息

-u:显示较详细的信息

-x:显示其他使用者进程

ps aux:显示系统目前的所有进程

名称所对应的东西

列名说明
USER进程拥有者
PID进程ID
%CPU占用的 CPU 使用率
%MEM占用的内存使用率
VSZ占用的虚拟内存大小
RSS占用的常驻内存大小
TTY执行的终端编号,直接w命令可以看到
STAT该进程的状态*
START进程开始时间
TIMECPU使用时间
COMMAND所执行的命令

*STAT表示的进程状态有如下几种:

  • D: 无法中断的休眠状态 ,将一直等待事件的发生或等待某种系统资源
  • R: 正在执行中
  • S: 可中断状态
  • T: 暂停执行
  • Z: 不存在但暂时无法消除,也叫僵尸进程
    • 每个进程在运行结束后都会处于僵死状态,等待父进程调用进而释放系统资源,处于该状态的进程已经运行结束,但是它的父进程还没有释放其系统资源
  • W: 没有足够的内存可分配
  • <: 高优先序的进程
  • N: 低优先序的进程
  • +:前台进程
  • l:多线程进程
  • s:主进程(先导进程),有子进程的进程

实例

  • 按照CPU使用率排序查看所有进程

[root@localhost ~]# ps aux –sort %cpu # 递增
[root@localhost ~]# ps aux –sort -%cpu # 递减

  • 按照实际内存使用排序查看所有进程

[root@localhost ~]# ps aux –sort rss # 递增
[root@localhost ~]# ps aux –sort -rss # 递减

  • 按照父子进程显示ssh服务的层级关系

[root@localhost ~]# ps auxf|grep sshd
root 6814 0.0 0.2 112756 4320 ? Ss 09:06 0:00 /usr/sbin/sshd -D
root 7097 0.0 0.2 158760 5576 ? Ss 09:06 0:00 \_ sshd: root@pts/0
root 7337 0.1 0.2 158760 5588 ? Ss 10:21 0:00 \_ sshd: root@pts/1
root 7364 0.0 0.0 112724 988 pts/1 S+ 10:24 0:00 \_ grep –color=auto sshd

  • 自定义显示格式

[root@localhost ~]# ps -axo user,pid,ppid,%mem,%cpu,command –sort -%cpu

  • 查看指定进程的PID,多种查看的方式

[root@localhost ~]# cat /run/sshd.pid
[root@localhost ~]# ps aux |grep sshd
[root@localhost ~]# pgrep -l sshd
[root@localhost ~]# pidof sshd

  • 查看进程树

[root@localhost ~]# yum install -y psmisc
[root@localhost ~]# pstree
[root@localhost ~]# pstree –help
[root@localhost ~]# pstree -p

nice

nice命令用来修改程序的优先级别,如果未指定程序,则会显示目前程序的优先级别,默认的nice值为 0,范围为 -20(最高优先级别)到 19(最低优先级别)。

nice数字越小,表示程序会越优先被处理,在系统运行缓慢的时候,nice值越小的进程会有越高的优先处理级别。nice [选项] [参数]…

Linux进程调度及多任务

每个CPU(或CPU核心)在一个时间点上只能处理一个进程,通过时间片技术,Linux实际能够运行的进程(和线程数)可以超出实际可用的CPU及核心数量。Linux内核进程调度程序将多个进程在CPU核心上快速切换,从而给用户多个进程在同时运行的假象。

通过调整程序在计算机中的优先级别,可以让程序在时间片中占有更长的时间,从而获得更快的处理速度

选项

  • -n :设置nice值
实例
  • 将ping 的优先级设置为 1 并执行

[root@localhost ~]# nice -n 1 ping www.baidu.com

  • 将 ping 的优先级加 10 并执行,默认是设置为10

[root@localhost ~]# nice ping www.baidu.com

[root@localhost ~]# ps axo pid,command,nice –sort=nice
[root@localhost ~]# ps axo pid,command,nice,cls –sort=nice
PID COMMAND NI CLS
5 [kworker/0:0H] -20 TS
10 [lru-add-drain] -20 TS
14 [netns] -20 TS
16 [writeback] -20 TS
17 [kintegrityd] -20 TS
18 [bioset] -20 TS
19 [bioset] -20 TS
20 [bioset] -20 TS
21 [kblockd] -20 TS
22 [md] -20 TS
23 [edac-poller] -20 TS
24 [watchdogd] -20 TS
33 [crypto] -20 TS
41 [kthrotld] -20 TS
43 [kmpath_rdacd] -20 TS
44 [kaluad] -20 TS
45 [kpsmoused] -20 TS
47 [ipv6_addrconf] -20 TS
60 [deferwq] -20 TS

  • 更改现有的进程的nice级别
    • 使用top更改,r调整进程的优先级(Nice Level) (-20高)—0—(19低)
    [root@localhost ~]# top -p `pgrep ping`
    然后输入r,输入进程id,在输入修改的nice值
    • 使用shell更改nice

[root@localhost ~]# sleep 7000 &
[2] 8141
[root@localhost ~]# renice -20 8141
8141 (进程 ID) 旧优先级为 0,新优先级为 -20

PRI

在top命令中可以看到有PR这个数值,PR 和 nice 值,都会影响进程执行的优先级。PR 由 OS 内核动态调整,用户不能调整(PR 值越低,进程执行的优先级越高)。

nice值用户可以自己调整,在用户调整了nice值后系统会通过如下公式来调整新的PR值,从而确定这个进程在系统中的优先级PR(新) = PR(旧) + nice

PR值是OS动态调整的,但是PR的最终值还是需要由OS分析决定的

jobs

查看当前终端的后台任务

foreground:前台进程是在终端中运行的命令,该终端为进程的控制终端,前台进程接受键盘产生的 输入和信号,并允许从终端读取或写入到终端 background:后台进程没有控制终端,它不需要终端的交互

把任务放入后台:

  • 在命令后面加入 空格 & 。使用这种方法放入后台的命令,在后台处于执行状态
  • 命令执行过裎中按 Ctrl+Z 快捷键,命令在后台处于暂停状

放入后台后,可用jobs查看后台任务

“+”号代表最近一个放入后台的工作,也是工作恢复时默认恢复的工作

“-“号代表倒数第二个放入后台的工作

fg:把任务恢复到前台进行

bg:把任务恢复到后台进行

nohup

虽然可以将程序放在后台运行,但是一旦关闭远程连接那么程序就会中断,如果我们想要将程序一直保持在后台运行,那么我们可以有如下三个选择

  • 把需要在后台执行的命令加入 /etc/rc.local 文件,让系统在启动时执行这个后台程序。这种方 法的问题是,服务器是不能随便重启的,如果有临时后台任务,就不能执行了
  • 使用系统定时任务,让系统在指定的时间执行某个后台命令。这样放入后台的命令与终端无关,是 不依赖登录终端的
  • 使用 nohup 命令

格式:nohup 命令 &(这里的‘&’表示此命令会在终端后台工作;反之,如果没有‘&’,则表示此命令会在终端前台工作。)

储存管理

分区表

为了让系统能够识别和管理物理设备上的不同分区,需要在物理设备前加上一些数据用于记录分区的情况,这些数据就是分区表数据,目前分区表有两种主流的格式:

https://www.bilibili.com/video/BV1kx411Q7Gw?spm_id_from=333.337.search-card.all.click&vd_source=97ecdabf45c3fec6c7c1a4f442d60e0b

  • MBR
    • 管理的硬盘大小不能超过2T
    • 有主分区和扩展分区两种,不管是哪种分区,总数不能超过4个分区
    • 扩展分区内部可以逻辑上划分多个区域,但是在分区表中都算在一个分区内
    • 如果作为系统盘,必须要设置一个激活分区,用于存放系统的引导文件
    • 四个主分区,一个主分区被用作扩展分区,一个扩展分区可以有无数个逻辑分区

MBR:Master Boot Record,主分区引导记录。最早在1983年在IBM PC DOS 2.0中提出。前面说过,每个扇区/区块都被分配了一个逻辑块地址,即LBA,而引导扇区则是每个分区的第一扇区,而主引导扇区则是整个硬盘的第一扇区(主分区的第一个扇区)。MBR就保存在主引导扇区中。另外,这个扇区里还包含了硬盘分区表DPT(Disk Partition Table),和结束标志字(Magic number)。扇区总计512字节,MBR占446字节(0000H – 01BDH),DPT占据64个字节(01BEH – 01FDH),最后的magic number占2字节(01FEH – 01FFH)。

  • GPT
    • 管理硬盘大小不能超过18EB,目前人类还没制造出单块这么大的硬盘
    • 理论上支持无限分区,在win10系统上,最多可以分128个分区
    • 如果作为系统盘,必须要创建一个EFI分区,用于存放系统的引导文件

GPT是一个实体硬盘的分区表的结构布局的标准。它是可扩展固件接口(UEFI)标准(被Intel用于替代个人计算机的BIOS)的一部分,被用于替代BIOS系统中的一32bits来存储逻辑块地址和大小信息的主开机纪录(MBR)分区表。对于那些扇区为512字节的磁盘,MBR分区表不支持容量大于2.2TB(2.2×1012字节)[1]的分区,然而,一些硬盘制造商(诸如希捷和西部数据)注意到这个局限性,并且将他们的容量较大的磁盘升级到4KB的扇区,这意味着MBR的有效容量上限提升到16 TiB。这个看似“正确的”解决方案,在临时地降低人们对改进磁盘分配表的需求的同时,也给市场带来关于在有较大的块(block)的设备上从BIOS启动时,如何最佳的划分磁盘分区的困惑。GPT分配64bits给逻辑块地址,因而使得最大分区大小在264-1个扇区成为可能。对于每个扇区大小为512字节的磁盘,那意味着可以有9.4ZB(9.4×1021字节)或8 ZiB个512字节(9,444,732,965,739,290,426,880字节或18,446,744,073,709,551,615(264-1)个扇区×512(29)字节每扇区)。

相较于MBR,GPT具有以下优点:

(1)得益于LBA提升至64位,以及分区表中每项128位设定,GPT可管理的空间近乎无限大,假设一个扇区大小仍为512字节,可表示扇区数为,算下来,可管理的硬盘容量=18EB(1EB=1024PB=1,048,576TB),2T在它面前完全不在话下。按目前的硬盘技术来看,确实近乎无限,不过,以后的事谁知道呢。

(2)分区数量几乎没有限制,由于可在表头中设置分区数量的大小,如果愿意,设置个分区也可以(有人愿意管理这么多分区吗),不过,目前windows仅支持最大128个分区。

(3)自带保险,由于在磁盘的首尾部分各带一个GPT表头,任何一个受到破坏后都可以通过另一份恢复,极大地提高了磁盘的抗性(两个一起坏的请出门买彩票)。

(4)循环冗余检验值针对关键数据结构而计算,提高了数据崩溃的检测几率。

(5)尽管目前分区类型不超过百数(十数也没有吧。),GPT仍提供了16字节的GUID来标识分区类型,使其更不容易产生冲突。

(6)每个分区都可以拥有一个特别的名字,最长72字节,足够写一首七律了。满足你的各种奇葩起名需求。

完美支持UEFI,毕竟它就是UEFI规范的衍生品。在将来全行业UEFI的情境下,GPT必将更快淘汰MBR。

硬盘磁盘管理

使用新磁盘全过程

准备好一块新磁盘插到服务器上

lsblk查看到新的块设备

1.分区fdsik gdisk parted

2.对于分好区进行文件系统格式化mkfs.ext4 分区设备名

3.挂载mount /dev/sdb1 /data1

查看当前系统的磁盘
df-h|

分区管理

lsblk:查看当前块设备信息

fdisk 管理MBR分区 gdisk 管理GPT分区 parted 高级分区操作

先创建分区,再挂载刚创建的分区,即可使用[root@localhost ~]# fdisk /dev/sdb
操作完成添加完分区就可以通过lsblk查看到自己新建的分区了
但是分区完成后还要进行格式化操作
[root@localhost ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Apr 12 04:20:38 2019
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk’
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=ff13d896-a59e-430d-8d14-3997d19f5de9 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
/dev/sdb1 /data1 ext4 defaults 0 0
/dev/sdb2 /data2 ext4 defaults 0 0

  • 重新设置内存中的内核分区表版本,修改分区后可以敲一下,让内核重新识别一下

partprobe

parted 命令

  • parted的操作都是实时生效的,小心使用
  • 格式:

parted [选项]… [设备 [命令 [参数]…]…]

  • 操作命令:

cp [FROM-DEVICE] FROM-MINOR TO-MINOR #将文件系统复制到另一个分区
help [COMMAND] #打印通用求助信息,或关于 COMMAND 的信息
mklabel 分区类型 #将磁盘分区设置为mbr或者gpt
mkfs MINOR 文件系统类型 #在 MINOR 创建类型为“文件系统类型”的文件系统
mkpart 分区类型 [文件系统类型] 起始点 终止点 #创建一个分区
mkpartfs 分区类型 文件系统类型 起始点 终止点 #创建一个带有文件系统的分区
move MINOR 起始点 终止点 #移动编号为 MINOR 的分区
name MINOR 名称 #将编号为 MINOR 的分区命名为“名称”
print [MINOR] #打印分区表,或者分区
quit #退出程序
rescue 起始点 终止点 #挽救临近“起始点”、“终止点”的遗失的分区
resize MINOR 起始点 终止点 #改变位于编号为 MINOR 的分区中文件系统的大小
rm MINOR #删除编号为 MINOR 的分区
select 设备 #选择要编辑的设备
set MINOR 标志 状态 #改变编号为 MINOR 的分区的标志

  • 查看分区情况

[root@localhost ~]# parted /dev/sda print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sda: 53.7GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number Start End Size Type File system 标志
1 1049kB 1075MB 1074MB primary xfs 启动
2 1075MB 53.7GB 52.6GB primary lvm

[root@localhost ~]# parted /dev/sdb print
错误: /dev/sdb: unrecognised disk label
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags:

  • 设置磁盘的分区表

[root@localhost ~]# parted /dev/sdb mklabel gpt
信息: You may need to update /etc/fstab.

[root@localhost ~]# parted /dev/sdb print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name 标志

  • 对磁盘进行分区

[root@localhost ~]# parted /dev/sdb mkpart primary 1 200M
信息: You may need to update /etc/fstab.

[root@localhost ~]# parted /dev/sdb print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name 标志
1 1049kB 200MB 199MB primary

  • 删除分区

[root@localhost ~]# parted /dev/sdb rm 1
信息: You may need to update /etc/fstab.

[root@localhost ~]# parted /dev/sdb print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name 标志

  • 修改磁盘为mbr分区,注意会丢失所有数据

[root@localhost ~]# parted /dev/sdb mklabel msdos
警告: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do
you want to continue?
是/Yes/否/No? yes
信息: You may need to update /etc/fstab.

fdisk工具

管理磁盘分区fdisk [磁盘名称]

fdisk命令中的参数以及作用

参数作用
m查看全部可用的参数
n添加新的分区
d删除某个分区信息
l列出所有可用的分区类型
t改变某个分区的类型
p查看分区信息
w保存并退出
q不保存直接退出

[root@localhost ~]# fdisk /dev/sdb
操作完成添加完分区就可以通过lsblk查看到自己新建的分区了
但是分区完成后还要进行格式化操作
[root@localhost ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Apr 12 04:20:38 2019
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk’
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=ff13d896-a59e-430d-8d14-3997d19f5de9 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
/dev/sdb1 /data1 ext4 defaults 0 0
/dev/sdb2 /data2 ext4 defaults 0 0

gdisk工具

  • 类fdisk 的GPT分区工具

存储结构与磁盘划分

Linux系统中常见的目录名称以及相应内容

目录名称应放置文件的内容
/boot开机所需文件—内核、开机菜单以及所需配置文件等
/dev以文件形式存放任何设备与接口
/etc配置文件
/home用户家目录
/bin存放单用户模式下还可以操作的命令
/lib开机时用到的函数库,以及/bin与/sbin下面的命令要调用的函数
/sbin开机过程中需要的命令
/media用于挂载设备文件的目录
/opt放置第三方的软件
/root系统管理员的家目录
/srv一些网络服务的数据文件目录
/tmp任何人均可使用的“共享”临时目录
/proc虚拟文件系统,例如系统内核、进程、外部设备及网络状态等
/usr/local用户自行安装的软件
/usr/sbinLinux系统开机时不会使用到的软件/命令/脚本
/usr/share帮助与说明文件,也可放置共享文件
/var主要存放经常变化的文件,如日志
/lost+found当文件系统发生错误时,将一些丢失的文件片段存放在这里

表示路径的方式:

  • 绝对路径指的是从根目录(/)开始写起的文件或目录名称
  • 相对路径则指的是相对于当前路径的写法

物理设备的命名规则

常见的硬件设备及其文件名称

硬件设备文件名称
IDE设备/dev/hd[a-d]
SCSI/SATA/U盘/dev/sd[a-p]
软驱/dev/fd[0-1]
打印机/dev/lp[0-15]
光驱/dev/cdrom
鼠标/dev/mouse
磁带机/dev/st0或/dev/ht0

一般的硬盘设备都会是以“/dev/sd”开头,分区编号按照如下规则:

  • 主分区或扩展分区的编号从1开始,到4结束;
  • 逻辑分区从编号5开始。

文件系统:

文件系统解释
Ext3是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。然而,当硬盘容量较大时,所需的修复时间也会很长,而且也不能百分之百地保证资料不会丢失。它会把整个磁盘的每个写入动作的细节都预先记录下来,以便在发生异常宕机后能回溯追踪到被中断的部分,然后尝试进行修复。
Ext4Ext3的改进版本,作为RHEL 6系统中的默认文件管理系统,它支持的存储容量高达1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外,Ext4文件系统能够批量分配block块,从而极大地提高了读写效率。
XFS是一种高性能的日志文件系统,而且是RHEL 7中默认的文件管理系统,它的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费极低的计算和存储性能。并且它最大可支持的存储容量为18EB,这几乎满足了所有需求。

日志系统记录利用inode表存储数据,记录数据存储的位置,通过读inode可以知道文件存在哪个block

日志文件系统用独立的日志文件跟踪磁盘内容的变化,日志型文件系统的基本思想是这样的:在真正更新磁盘上的数据之前,先往磁盘上写入一些信息,这些信息主要是描述接下来要更新什么,相当于 wrtie ahead,因此这种方式又被称为write-ahead logging。这样,即便发生crash,也可通过记录的日志信息,回溯并恢复crash前正在进行的操作(称为replay)。在更新的时候增加一点额外的操作,换来了recovery时所需的工作量的减少。

https://zhuanlan.zhihu.com/p/107558961

索引式文件系统:fat,exfat u盘 block里面存着下一块block地址的信息

格式化后会发生如下事情

  • Linux创建一个硬盘地图’superblock’,记录此filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
  • inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block 号码,默认一个inode表格128字节,一个block记录消耗4B,记录满了后会新建inode用于扩展。
    • 该文件的访问权限(read、write、execute);
    • 该文件的所有者与所属组(owner、group);
    • 该文件的大小(size);
    • 该文件的创建或内容修改时间(ctime);
    • 该文件的最后一次访问时间(atime);
    • 该文件的修改时间(mtime);
    • 文件的特殊权限(SUID、SGID、SBIT);
    • 该文件的真实数据地址(point)。
  • block:用于存储数据

计算机系统在发展过程中产生了众多的文件系统,为了使用户在读取或写入文件时不用关心底层的硬盘结构,Linux内核中的软件层为用户程序提供了一个VFS(Virtual File System,虚拟文件系统)接口,这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作了。

mkfs工具

  • Linux mkfs(英文全拼:make file system)命令用于在特定的分区上建立 linux 文件系统。
  • 格式:

mkfs [-V] [-t fstype] [fs-options] filesys [blocks]

  • 选项:
    • device : 预备检查的硬盘分区,例如:/dev/sda1
    • -V : 详细显示模式
    • -t : 给定档案系统的型式,Linux 的预设值为 ext2
    • -c : 在制做档案系统前,检查该partition 是否有坏轨
    • -l bad_blocks_file : 将有坏轨的block资料加到 bad_blocks_file 里面
    • block : 给定 block 的大小
  • 实例,使用parted分区,然后使用mkfs创建ext4文件系统

[root@localhost ~]# parted /dev/sdb mklabel gpt
[root@localhost ~]# parted /dev/sdb mkpart primary 0 10G
[root@localhost ~]# mkfs.ext4 /dev/sdb1
[root@localhost ~]# parted /dev/sdb print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name 标志
1 1049kB 10.0GB 9999MB ext4 primary

mount

挂载文件系统mount 文件系统 挂载目录

mount命令中的参数以及作用

参数作用
-a挂载所有在/etc/fstab中定义的文件系统
-t指定文件系统的类型

临时挂载文件系统

系统在重启后挂载就会失效[root@node-1 ~]# mkdir backup
[root@node-1 ~]# mount /dev/sdb1 /root/backup

如果想让硬件设备和目录永久地进行自动关联,就必须把挂载信息按照指定的填写格式“设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检”,写入到/etc/fstab文件中。

用于挂载信息的指定填写格式中,各字段所表示的意义

字段意义
设备文件一般为设备的路径+设备名称,也可以写唯一识别码(UUID,Universally Unique Identifier)
挂载目录指定要挂载到的目录,需在挂载前创建好
格式类型指定文件系统的格式,比如Ext3、Ext4、XFS、SWAP、iso9660(此为光盘设备)等
权限选项若设置为defaults,则默认权限为:rw, suid, dev, exec, auto, nouser, async
是否备份若为1则开机后使用dump进行磁盘备份,为0则不备份
是否自检若为1则开机后自动进行磁盘自检,为0则不自检
  • 实例,挂载分区/dev/sdb1/mnt/volume1下,并且设置为永久自动挂载

[root@localhost ~]# mkdir -p /mnt/volume1
[root@localhost ~]# mount /dev/sdb1 /mnt/volume1
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 47G 995M 46G 3% /
devtmpfs 979M 0 979M 0% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 8.5M 982M 1% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/sda1 1014M 133M 882M 14% /boot
tmpfs 199M 0 199M 0% /run/user/0
/dev/sdb1 9.1G 37M 8.6G 1% /mnt/volume1

[root@localhost ~]# vim /etc/fstab
# 最后一行加上
/dev/sdb1 /mnt/volume1 ext4 defaults 0 0

[root@localhost ~]# mount -a
# 测试是否正确配置

umount

撤销已经挂载的设备文件umount [挂载点/设备文件][root@node-1 ~]# umount /dev/sda2

du

查看文件数据占用量du [选项] [文件]
[root@localhost ~]# du -sh /etc
23M /etc

添加交换分区

SWAP(交换)分区是一种通过在硬盘中预先划分一定的空间,然后将把内存中暂时不常用的数据临时存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术

在生产环境中,交换分区的大小一般为真实物理内存的1.5~2倍[root@localhost ~]# umount /dev/sdb2
[root@localhost ~]# mkswap /dev/sdb2
mkswap: /dev/sdb2: warning: wiping old ext4 signature.
Setting up swapspace version 1, size = 5241852 KiB
no label, UUID=6707cde0-c7df-4557-b99b-45fbf5b36dcd
[root@localhost ~]# free -h
#free 命令用于显示系统内存的使用情况。当在终端中输入 free 后,它会返回系统的内存和交换空间使用情况的摘要信息。
total used free shared buff/cache available
Mem: 1.8G 149M 1.0G 9.5M 601M 1.4G
Swap: 2.0G 0B 2.0G
[root@localhost ~]# swapon /dev/sdb2
#Linux swapon命令用于激活Linux系统中交换空间,Linux系统的内存管理必须使用交换区来建立虚拟内存
[root@localhost ~]# free -h
total used free shared buff/cache available
Mem: 1.8G 153M 1.0G 9.5M 601M 1.4G
Swap: 7.0G 0B 7.0G
[root@localhost ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Apr 12 04:20:38 2019
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk’
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=ff13d896-a59e-430d-8d14-3997d19f5de9 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
/dev/sdb1 /data1 ext4 defaults 0 0
/dev/sdb2 swap swap defaults 0 0

磁盘容量配额

linux系统作为一个多用户的操作系统,在生产环境中,会发生多个用户共同使用一个磁盘的情况,会造成Linux根分区的磁盘空间耗尽,导致Linux系统无法建立新的文件,从而出现服务程序崩溃、系统无法启动等故障现象。 为了避免这种情况,解决方法就是 ,对用户在指定文件系统中使用磁盘空间、文件数量进行限制,防止用户占用大量的磁盘空间,从而保持系统存储空间可以稳定使用。 如果要针对某个目录进行配额限制的话,XFS文件系统支持 Project Quota 功能,通过该特性,可以支持目录级别的配额限制。

quota命令还有软限制和硬限制的功能。

  • 软限制:当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用。
  • 硬限制:当达到硬限制时会提示用户,且强制终止用户的操作。

[root@localhost ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Apr 12 04:20:38 2019
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk’
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=ff13d896-a59e-430d-8d14-3997d19f5de9 /boot xfs defaults,uquota 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
/dev/sdb1 /data1 ext4 defaults 0 0
/dev/sdb2 swap swap defaults 0 0
[root@localhost ~]# reboot
[root@localhost ~]# mount | grep boot
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,usrquota)
[root@localhost ~]# useradd test
[root@localhost ~]# chmod -Rf o+w /boot
由于/boot目录对其他用户有w的限制,对/boot 加入w权限

xfs_quota

专门针对XFS文件系统来管理quota磁盘容量配额服务

通过系统层面对磁盘进行配额xfs_quota [参数] 配额 文件系统

  • xfs_quota 命令有多个参数,以下是一些常用的参数:
    • -x:指定要操作的文件系统路径。
    • -c command:执行指定的命令。
    • -u username:指定用户名来操作用户配额。
    • -g groupname:指定组名来操作组配额。
    • -d:显示详细的配额信息。
    • -h:以人类可读的格式显示配额信息。
    • -P:以项目(project)模式显示或操作配额。
    • -t:限制命令执行时间。

硬盘使用量的软限制和硬限制分别为3MB和6MB;创建文件数量的软限制和硬限制分别为3个和6个。[root@localhost ~]# xfs_quota -x -c ‘limit bsoft=3m bhard=6m isoft=3 ihard=6 test’ /boot#bsoft软限制,bhard硬限制

[root@localhost ~]# xfs_quota -x -c report /boot
User quota on /boot (/dev/sda1)
Blocks
User ID Used Soft Hard Warn/Grace
———- ————————————————–
root 115516 0 0 00 [——–]
test 0 3072 6144 00 [——–]
[root@localhost ~]# su – test
[test@localhost ~]$ dd if=/dev/zero of=/boot/tom bs=5M count=1
1+0 records in
1+0 records out
5242880 bytes (5.2 MB) copied, 0.00350676 s, 1.5 GB/s
#if=文件名:输入文件名,默认为标准输入。即指定源文件。
#of=文件名:输出文件名,默认为标准输出。即指定目的文件。
#bs=bytes:同时设置读入/输出的块大小为bytes个字节。
#count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
[test@localhost ~]$ dd if=/dev/zero of=/boot/tom bs=8M count=1#if=input from ,表示输入的来源,同理of表示输出去处
dd: 写入”/boot/tom” 出错: 超出磁盘限额
记录了1+0 的读入
记录了0+0 的写出
4194304字节(4.2 MB)已复制,0.0103877 秒,404 MB/秒
[test@localhost boot]$ touch file6
touch: 无法创建”file6″: 超出磁盘限额

edquota

用于编辑用户的quota配额限制edquota [参数] [用户]

  • -u参数表示要针对哪个用户进行设置
  • -g参数表示要针对哪个用户组进行设置

把用户test的硬盘使用量的硬限额从5MB提升到8MBimage-20240311163709961[root@localhost ~]# yum install -y quota
[root@localhost ~]# edquota -u test
Disk quotas for user test (uid 1001):
Filesystem blocks soft hard inodes soft hard
/dev/sda1 4096 3072 8192 1 3 6
[root@localhost ~]# su – test
Last login: Fri Apr 12 06:01:13 EDT 2019 on pts/0
[test@localhost ~]$ dd if=/dev/zero of=/boot/tom bs=8M count=1
1+0 records in
1+0 records out
8388608 bytes (8.4 MB) copied, 0.019578 s, 428 MB/s
[test@localhost ~]$ dd if=/dev/zero of=/boot/tom bs=10M count=1
dd: 写入”/boot/tom” 出错: 超出磁盘限额
记录了1+0 的读入
记录了0+0 的写出
8388608字节(8.4 MB)已复制,0.0130297 秒,644 MB/秒

软硬链接

硬链接:可以将它理解为一个“指向原始文件inode的指针”,类似于复制,源文件删除依然可以通过硬链接访问

软链接:仅仅包含所链接文件的路径名,因此能链接目录文件,也可以跨越文件系统进行链接。但是,当原始文件被删除后,链接文件也将失效,从这一点上来说与Windows系统中的“快捷方式”具有一样的性质。

ln

参数:

-s :创建“软链接”(如果不带-s参数,则创建硬链接) -f :强制创建文件或目录的链接

-i :覆盖前先询问

-v :显示创建链接的过程

演示:

软链接演示[root@localhost ~]# echo “hello” > test
[root@localhost ~]# ln -s test test123
[root@localhost ~]# cat test123
hello
[root@localhost ~]# ls -l test
-rw-r–r–. 1 root root 6 Apr 12 06:10 test
[root@localhost ~]# rm -f test
[root@localhost ~]# cat test123
cat: test123: No such file or directory

硬链接演示[root@localhost ~]# echo “hello” > test
[root@localhost ~]# ln test test123
[root@localhost ~]# cat test123
hello
[root@localhost ~]# ls -l test
-rw-r–r–. 2 root root 6 Apr 12 06:12 test
[root@localhost ~]# rm -f test
[root@localhost ~]# cat test123
hello
但是硬链接不能跨分区创建,因为本质是指向磁盘里面的block的位置,跨磁盘就找不到位置了
[root@localhost ~]# echo “hello” > test
[root@localhost ~]# ln test /mnt/test1
ln: 无法创建硬链接”/mnt/test1″ => “test”: 无效的跨设备连接
软链接就可以,只保存一个路径,就可以
[root@localhost ~]# ln -s /root/test /mnt/test1
[root@localhost ~]# cat /mnt/test1
hello

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
下一篇