Linux 目录与文件
1. 实验介绍
1.1 实验内容
本节实验从全局来了解 Linux 文件系统,主要介绍了 Linux 的 目录结构、文件存储、文件类型和属性、以及 常用的文件基本操作 。相信了解相关的知识之后对后面深入学习 Linux 会有很大的帮助。
1.2 实验知识点
- 文件系统
- 目录结构
- 文件类型
- 文件属性
- 文件操作
- 访问控制
- 默认权限
2. Linux 文件系统
2.1 文件系统介绍
Linux 文件系统作为一个系统不仅包含了文件中的数据而且还有文件系统的这样的结构。且文件系统中的文件是数据的一个集合,所有 Linux 用户和程序看到的 文件、目录、软连接 及 文件保护信息 等存储在其中。
Linux 主要采用的是树形结构,与 windows 不同(每个分区都是一颗文件树,根节点为盘符),它是单一的一棵树,无论有多少分区,都包含在以 / 为根节点的树结构上。其中分区是物理的分区,目录则是逻辑上的区分。Linux 中每个分区都要挂载到目录树中一个具体的目录下才能访问,其中根目录必须挂载一个分区。
对于挂载就是 Linux 文件系统与一个存储设备关联起来的过程(后面会着重介绍)。
因为 Linux 是一个多用户系统,一个规范的目录有助于对系统文件和不同的用户文件进行统一管理。
2.2 文件系统组成
- 名字空间
主要给事物对象命名,并按照一种层次结构来组织
- API(应用编程接口)
主要用于查询和操作对象的一种系统调用
- 安全模型
主要用于保护、共享和隐藏对象
- 实现
主要用于逻辑模型和硬件系统连接起来
3. Linux 目录结构
3.1 路径
我们了解到 Linux 的目录结构是树形结构,最顶级的目录为根目录 /。而其他目录可以通过挂载将它们添加到树中,通过接触挂载溢出。所以在开始之前,我们先了解一些什么是绝对路径和相对路径。
在 Linux 实验环境操作中,我们和通过 cd 命令来切换路径,. 表示当前目录,.. 表示上一级目录,- 表示上一次所在目录,~ 通常表示当前用户的 home 目录。可以使用 pwd 命令可以获取当前所在路径(绝对路径)。
进入用户主目录:
$ cd ~
转到上一级目录:
$ cd ..
获取当前路径:
$ pwd
3.1.1 绝对路径
在 Linux 中,绝对路径是从 / (也被称为根目录)开始的完整路径,比如:/usr、/etc/X11。
$ cd /usr/local/bin 注:我们以绝对路径方式进入/usr/share/doc目录下
$ pwd
3.1.2 相对路径
相对路径是以 . 或 .. 开始的,表示用户当前操作所处的位置,而 .. 表示上级目录,表示用户当前所处的目录。
$ cd ~
$ cd ../../usr/local/bin
$ pwd
3.2 文件树
文件结构是文件存放在磁盘等存储设备上的组织方法。主要体现在对文件和目录的组织上。
Linux 的目录结构采用的是树形结构。最上层是根目录,其他的所有目录都是从根目录处罚而生成的。微软的 DOS 和 windows 也是采用树型结构,但是在 DOS 和 windows 中这样的树型结构的根是磁盘分区的盘符,有几个分区就有几个树型结构,他们之间的关系是并列的。但是在 Linux 中,无论操作系统管理几个磁盘分区,这样的目录树只有一个。从结构上将,各个磁盘分区上的树型目录不一定是并列的。
在 Linux 的目录结构中,用户的主目录通常是保存在一个单独的文件系统上,然后挂载到根目录下的一个目录。而像这样的文件系统布局都是遵守了文件系统层次结构标准(FHS,Filesystem Hierarchy Standard)。FHS 定义了系统中每个区域的用途、所需要的最小构成文件的目录同时还给出了例外处理与矛盾处理。
FHS 标准定义了 两层 规范:
第一层是:/ 下面的各个目录应该放什么文件数据,例如 /etc 应放置配置文件,/bin 与 /sbin 则应该放置可执行文件等。
第二层是:针对 /usr 和 /var 这两个目录的子目录来定义。例如 /var/log 放置系统登录文件,/usr/share 放置共享数据等等。
FHS 标准图
除了概念上去理解文件树,我们还可以通过命令来直观的来体会一下:
$ sudo apt-get update
$ sudo apt-get install tree # ubuntu 默认情况是没安装 tree 软件包
$ tree /
4. Linux 文件属性
首先,我们先用命令 ls -al 来查看一下文件的详细信息。
$ ls -al
从屏幕打印出来的信息我们可以知道,从左到右依次表示:文件类型和权限、硬连接数、所有者、所属组、文件大小、最后修改时间、文件名。
还有一个比较重要的概念就是 Linux 里面一切皆文件。
4.1 文件类型
第一个字符代表的就是这个文件的类型,文件类型主要分为以下 7 种类型:
- 普通文件 -
文本文件、数据文件、可执行程序等等都可作为普通文件存储。
- 目录 d
目录中按照名字来对其他文件进行引用,用户通过 mkdir 创建目录,用 rmdir 来删除空目录,用 rm -r 来删除非空目录。
- 字符设备文件 c
字符设备文件让相关的驱动程序作为输入输出的缓冲。
- 块设备文件 b
块设备文件有处理块数据的 I/O 的驱动程序使用,同时让内核提供缓冲。
- 本地域套接口 s
实现进程间通信的连接,本地域套接口由系统调用 socket 创建,用 rm 或 unlink 删除。
- 有名管道(FIFO)p
让运行在同一主机上的两个进程相互通信,和 socket 相似,用 mknod 创建,用 rm 来删除。
- 符号链接 l
也叫作 软连接,通过名字指向文件。用 ln -s 创建,用 rm 来删除。
4.2 Linux 文件权限
4.2.1 概念
接下来的字符,以三个为一组,且均为 rwx 的三个参数的组合,代表了 Linux 的读、写、执行三种权限控制。( r 代表可读(read)、w 代表可写(write)、x 代表可执行(execute),要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号 - 。)
其中三为一组分别是所有者的权限(U,即 user)、所属组的权限(G,即group)、其他用户的权限(O、即 other)。
4.2.2 权限编码
表 4-1
数字 | 字符 | 文件/目录 |
---|---|---|
4 | r | 查看文件内容/查看目录下的文件或目录名称 |
2 | w | 修改文件内容/在目录下增删改 |
1 | x | 执行一些程序或脚本/可以用命令切换目录 |
表 4-2
八进制 | 二进制 | 权限 |
---|---|---|
0 | 000 | --- |
1 | 001 | —x |
2 | 010 | -w- |
3 | 011 | -wx |
4 | 100 | r-- |
5 | 101 | r-x |
6 | 110 | rm- |
7 | 111 | rwx |
4.2.3 chmod:改变文件或目录权限
语法
chmod [选项][权限][文件或目录]
选项说明:
—reference=RFILE:根据参考文档设置权限
-R:递归的将权限应用于所有的子目录和子文件
- 修改权限的3种形式
我们首先通过 ls -l 命令来查看一下 install.log 的文件,然后用 chmod 命令的三种不同的形式来修改文件所有权、所属组权限和其他人权限。
$ touch install.log
$ ls -l install.log
-rw-rw-r-- 1 shiyanlou shiyanlou 0 10月 30 13:43 install.log
- 使用字符形式修改权限
在 chmod 命令参数中,u 代表所有者,g 代表所属组,o 代表其他用户,a 代表所有人。
修改 install.log 文件的权限设置成为全部为可读、可写、可执行。
$ chmod u=rwx, g=rwx, o=rwx install.log
$ ls -l install.log
-rwxrwxrwx 1 shiyanlou shiyanlou 0 10月 30 13:43 install.log
$ chmod a=rw install.log
$ ls -l install.log
-rw-rw-rw- 1 shiyanlou shiyanlou 0 10月 30 13:43 install.log
- 使用操作符形式修改权限
操作符形式是在字符形式的基础上来对文件或目录使用 +/- 操作符来设置权限。
通过 + 符号增加相应的权限,- 符号减去相应的权限。
$ chmod u+x, g+x, o-rw install.log
$ ls -l install.log
-rwxrwx--- 1 shiyanlou shiyanlou 0 10月 30 13:43 install.log
- 使用数字形式修改权限
$ chmod 777 install.log # 修改文件权限为 rwxrwxrwx
$ chmod 700 install.log # 修改文件权限为 rwx------
$ sudo chmod 755 /home # 修改目录权限为 rwxr-xr-x
4.2.4 chown:改变归属关系
chown 命令主要用于改变属主的所有权,语法和 chmod 类似。
$ mkdir test
$ ls -l
$ sudo chown root test # 修改文件的所属者为root,因为是超级用户所以需要用到sudo
$ ls -l
drwxrwxr-x 2 root shiyanlou 4096 10月 30 13:52 test
4.2.5 chgrp:改变归属组
chgrp 命令是改变文件或目录的数组的所有权,语法和 chmod 类似。
$ sudo chgrp root test
$ ls -l
drwxrwxr-x 2 root root 4096 10月 30 13:52 test
补充:
chown 可以一次同时改变所属者和所属组。
$ sudo chown shiyanlou:shiyanlou test
$ ls -l
drwxrwxr-x 2 shiyanlou shiyanlou 4096 10月 30 13:52 test
4.2.6 umask:默认权限
umask 主要用来设置用户创建文件的默认权限,它与 chmod 的效果刚好相反,umask 设置的是权限"补码",而 chmod 设置的是文件权限码。一般在 /etc/profile、$[HOME]/.bash_profile 或 $[HOME]/.profile 中设置 umask 值。
那么如何计算 umask 值相应的文件和睦路缺省创建权限是多少呢?
具体步骤如下:
第一步,先写下具有全部权限的模式,即 777 (所有用户都具有读、写和执行权限)。
第二步,在下面一行按照 umask 值写下相应的位。
第三步,在接下来的一行中记下上面两行中没有匹配的位。这就是目录的缺省创建权限。
第四步,而对于文件来说,在创建时不能具有执行权限,只要拿掉相应的执行权限即可。
eg:我们来做个联系,假设 umask 值为 022:
- 文件的最大权限是:rwx rwx rwx(777)
- umask 值为 022(— -w- -w-)
- 目录权限就是 rwx r-x r-x(755)(这就是目录创建缺省权限)
- 文件权限 rw- r— r—(644)(这就是文件创建缺省权限)
5. Linux 文件操作
5.1 查看文件
5.1.1 ls 命令
在这之前我们已经多次接触了这个命令,如你所见,他的主要作用就是用来显示当前目录下的文件信息,当然在带参数的情况下,他就能用来查看文件权限或者其他更为详细的信息。
用长格式来显示文档的详细信息。(包括文件的类型和权限、硬链接数、所有者、所属组、文件大小、最后修改时间和文件名)
$ ls -l
显示所有,包括隐藏文件和目录
$ ls -a
5.1.2 cat 命令
用来查看文件的命令
查看文件 /etc/passwd,参数 -n 表示显示行号,包括空白行。
$ cat -n /etc/passwd
5.1.3 tac命令
用来打印文件内容到标准输出(终端),和 cat 正好相反,为倒序显示。
$ tac /etc/passwd
5.1.4 more & less 命令
这两个命令都是分页查看文件内容,通过空格键查看下一页,q 键退出,不过 less 还可以通过方向键来上下回翻。不过和前面的 cat 相比这两个命令更像是一个用来阅读文件内容的。
$ more /etc/passwd
$ less /etc/passwd
5.1.5 grep 命令
查找关键字并打印匹配的行。
在 /etc/passwd 文件中过滤出包含 sh 的行。
$ grep sh /etc/passwd
5.1.6 head & tail 命令
head
用来显示文件的开头的内容。在默认情况下,head 命令显示文件的前 10 行内容。
语法
head [选项][参数]
选项 | 说明 |
---|---|
-n<数字> | 指定显示头部内容的行数 |
-c<字符数> | 指定显示头部内容的字符数 |
-v | 总是显示文件名的头信息 |
-q | 不显示文件名的头信息 |
eg:显示前 3 行内容
head -3 /etc/passwd
tail
用来输入文件中的尾部内容,tail 命令默认在屏幕上显示指定文件的末尾 10 行。
语法
tail [-nkcvq][file]
eg:显示末尾 3 行内容
tail -3 /etc/passwd
5.2 操作文件
5.2.1 touch 命令
用来创建空白文件,也可以用来更改已有文件的时间戳。
$ touch hello.txt
5.2.2 mkdir 命令
用来创建一个空目录,也可以指定创建目录的权限属性。
$ mkdir world
$ mkdir -p /home/shiyanlou/hello/shi/yan/lou # 创建多级目录/hello/shi/yan/lou
5.2.3 cp 命令
用来复制文件和目录
将之前创建的 hello.txt 文件复制到 /home/shiyanlou/hello/shi/yan/lou 目录中。
$ cp hello.txt /home/shiyanlou/hello/shi/yan/lou
直接复制目录的时候会出现一些错误,所以需要加上 -r 或 -R 参数,表示递归复制。
$ cp -r world test
5.2.4 rm 命令
用来删除文件或目录
删除文件 hello.txt
$ rm hello.txt
有时候使用删除命令时,会出现一些提示,若想忽略不提示,则使用参数 -f 来强制删除。
$ touch hello.txt
$ chmod 444 hello.txt
$ rm hello.txt
$ rm -f hello.txt
删除目录和复制的操作相似,都需要加上 -r 或 -R 参数
$ rm -r world
5.2.5 mv 命令
移动或者重命名文件或目录
$ mkdir doc
$ touch file1
$ mv file1 doc
重命名文件
$ mv file1 file2
5.2.6 du 命令
用于计算机文件或目录的数量
查看 /home 目录机子目录的容量信息
$ du /home
使用参数 -s 查看 /root 所占磁盘的空间总和
$ sudo du -s /home
5.2.7 stat 命令
查看文件的状态
$ stat /home/shiyanlou/doc/file2
5.3 链接文件
在 Linux 中链接文件可以分为软链接和硬链接两种。
创建方法:
- 软连接(符号链接):ln -s source target
- 硬链接(实体链接):ln source target
5.3.1 软链接
软链接文件有类似于 Windows 的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
$ touch test.log # 创建一个测试文件 file
$ ln -s test.log test1.log # 创建 file 的一个软链接文件 test1.log
5.3.2 硬链接
硬链接指通过索引节点来进行连接。在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode)。在 Linux 中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬链接。
$ ln test.log test2.log # 创建 file 的一个硬链接文件 test2.log
$ ls -li # 参数 -i 显示出文件的节点信息
...
277972 lrwxrwxrwx 1 shiyanlou shiyanlou 8 10月 30 14:19 test1.log -> test.log
277971 -rw-rw-r-- 2 shiyanlou shiyanlou 0 10月 30 14:19 test2.log
277971 -rw-rw-r-- 2 shiyanlou shiyanlou 0 10月 30 14:19 test.log
5.3.3 两种链接的区别
硬链接文件有两个限制:
- 不允许给目录创建硬链接
- 只有在同一文件系统中的文件之间才能创建链接,而且只有超级用户才有建立硬链接权限。
软链接没有硬链接以上的两个限制,因而现在更为广泛使用,它具有更大的灵活性,甚至可以跨越不同机器、不同网络对文件进行连接。但是软链接的缺点在于:因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了,而硬链接就没有这个缺陷,你想怎么移就怎么移。还有它要系统分配额外的空间用于建立新的索引点和保存原文件的路径。
软链接可以跨分区,但源文件不能删除,硬链接不能跨分区,但可以删除源文件。
6 Linux 访问控制
6.1 ACL--访问控制列表
ACL 是 Access Control List 的缩写,主要目的是在提供传统的 owner、group、others 的 read、write、execute 权限之外的权限配置。ACL 可以针对单一使用者,单一文件或目录来进行 r、w、x 的权限规范,对于需要特殊权限的使用状况非常有帮助。
- 所有者(user):可以针对使用者来配置权限;
- 所属组(group):针对组为对象来配置其权限;
- 默认属性(mask):还可以针对该目录在创建新文件/目录时,规范新数据的默认权限。
6.2 ACL 安装
首先,我们需要安装工具来管理 ACL。
在 Ubuntu/Debian 中 (实验楼环境为 ubuntu);
$ sudo apt-get install acl
在 CentOS/Fedora/RHEL 中;
$ yum -y install acl
6.3 ACL 权限开启
由于实验楼环境的原因,可以跳过此步,但是在本地学习记得用 mount 命令来查看 ACL 是否已经开启
开启 ACL 权限
临时开启指定分区的 ACL 权限;
mount -o remount,acl /
永久开启指定分区的 ACL 权限:修改文件(/etc/fstab),在挂载选项部分添加ACL。
6.4 相关命令
dumpe2fs:获取 ext2,ext3 或 ext4 文件系统的信息;
getfacl:获取指定文件的 ACL 权限;
setfacl:设置指定文件的 ACL 权限;
6.5 ACL 权限简单应用
添加和修改
首先创建一个文件
$ touch file1
$ ls -l file1
查看文件缺省的 ACL,此时的文件通常只有 UGO 的权限,还没有 ACL。
$ sudo get facl file1
添加用户和设置密码,方便后续对它们进行权限操作。
$ sudo useradd u1
$ sudo passwd u1
测试一下,你会发现 file1 文件是不允许除了超级用户以外的用户来写。
$ su u1
$ echo "test" >> file1 # 用 exit 命令来退出用户 u1
所以,我们通过 ACL 来赋予 u1 足够的权限:
$ sudo setfacl -m u:u1:rw file1
$ su u1
$ echo "test" >> file1
$ cat file1
修改成功后,用户 u1 就具有读写的权限。
通过 ls 命令来看一下:
$ ls -l file1
从打印出来的信息可以发现,在全县位旁边多了一个 + ,这就说明了我们设置 ACL 成功了。
7. 总结
通过本节实验我们掌握了 LInux 文件系统中包含了 Linux 目录结构、文件存储、文件类型和属性、以及常用的文件基本操作。希望通过熟练的运用能够为后面学习 Linux 大虾坚实的基础。