跳转至

文件系统

在本章中,您将学习如何使用文件系统。


目标 : 在本章中,未来的 Linux 管理员们将学习如何:

✔ 管理磁盘上的分区;
✔ 使用LVM更好地利用磁盘资源;
✔ 为用户提供文件系统并管理访问权限。

同时也发现:

✔ Linux 中的树状结构是如何组织的;
✔ 提供不同类型的文件以及如何使用这些文件;

🏁 硬件磁盘分区lvmlinux

知识性: ⭐ ⭐
复杂度: ⭐ ⭐

阅读时间: 20 分钟


分区

分区将允许安装多个操作系统,因为它们不可能共存于同一逻辑驱动器上。 分区还允许在逻辑上分离数据(安全性、访问优化等)。

存储在磁盘第一个扇区(MBR: Master Boot Record)中的分区表记录了物理磁盘划分为分区卷的过程。

对于 MBR 分区表类型,同一物理磁盘最多可以划分为4个分区:

  • 主分区
  • 扩展分区

警告

每个物理磁盘只能有一个扩展分区。 也就是说,一个物理磁盘在 MBR 分区表中最多可以有:

  1. 三个主分区加上一个扩展分区
  2. 四个主分区

扩展分区无法写入数据和格式化,只能包含逻辑分区。 MBR 分区表可以识别的最大物理磁盘是 2TB

仅分为4个主分区

划分为3个主分区和1个扩展分区

设备文件名命名规范

在 GNU/Linux 世界,一切都是文件。 对于磁盘,它们在系统中被识别为:

硬件设备文件名
IDE 硬盘/dev/hd[a-d]
SCSI/SATA/USB 硬盘/dev/sd[a-z]
光盘驱动器/dev/cdrom 或 /dev/sr0
软盘/dev/fd[0-7]
打印机(25针)/dev/lp[0-2...]
打印机(USB)/dev/usb/lp[0-15]
鼠标/dev/mouse
虚拟硬盘/dev/vd[a-z]

Linux 内核包含大多数硬件设备的驱动程序。

我们称之为 设备 的是不带 /dev 存储的文件,用于标识主板检测到的不同硬件。

名为 udev 的服务负责应用命名约定(规则),并将其应用于检测到的设备。

欲了解更多信息,请查看 这里

设备分区号

块设备(存储设备)后面的数字表示分区。 对于 MBR 分区表,数字 5 必须是第一个逻辑分区。

警告

请注意! 这里所说的分区号主要是指块设备(存储设备)的分区号。

分区的识别

对磁盘进行分区至少有两个命令:fdiskcfdisk。 这两个命令都有一个交互式菜单。 cfdisk 更可靠且有更好的优化,所以最好使用它。

使用 fdisk 的唯一原因是您希望使用 -l 选项列出所有逻辑设备。 fdisk 使用 MBR 分区表,因此不支持 GPT 分区表,也无法处理超过 2TB 的磁盘。

sudo fdisk -l
sudo fdisk -l /dev/sdc
sudo fdisk -l /dev/sdc2

parted 命令

parted分区编辑器)命令可以对磁盘进行分区且没有 fdisk 的缺点。

parted 命令既可在命令行中使用,也可交互式使用。 它还具有恢复功能,能够重写已删除的分区表。

parted [-l] [device]

在图形界面下,有一个非常完整的 gparted 工具:Gnome PARtition EDitor。

gparted-l 命令列出计算机上的所有逻辑设备。

gparted 命令在不带任何参数的情况下运行时,将显示带有内部选项的交互式模式:

  • help 或错误的命令将显示这些选项。
  • 此模式下的 print all 将具有与命令行上的 gparted-l 相同的结果。
  • quit 返回到提示符。

cfdisk 命令

cfdisk 命令用于管理分区。

cfdisk device

示例:

$ sudo cfdisk /dev/sda
                                 Disk: /dev/sda
               Size: 16 GiB, 17179869184 bytes, 33554432 sectors
                       Label: dos, identifier: 0xcf173747
    Device        Boot       Start        End    Sectors   Size   Id Type
>>  /dev/sda1     *           2048    2099199    2097152     1G   83 Linux
    /dev/sda2              2099200   33554431   31455232    15G   8e Linux LVM
 lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
 x Partition type: Linux (83)                                                 x
 x     Attributes: 80                                                         x
 xFilesystem UUID: 54a1f5a7-b8fa-4747-a87c-2dd635914d60                       x
 x     Filesystem: xfs                                                        x
 x     Mountpoint: /boot (mounted)                                            x
 mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
     [Bootable]  [ Delete ]  [ Resize ]  [  Quit  ]  [  Type  ]  [  Help  ]
     [  Write ]  [  Dump  ]

在没有 LVM 的情况下,物理介质的准备工作需要经过五个步骤:

  • 设置物理磁盘;
  • 卷的分区(磁盘分区,安装多个系统的可能性,...);
  • 创建文件系统 (允许操作系统管理文件、 树结构、权限...);
  • 挂载文件系统(在树结构中注册文件系统);
  • 管理用户访问。

逻辑卷管理器(LVM)

Logical Volume Manager (LVM))

标准分区 创建的分区无法动态调整硬盘资源,一旦被挂载,容量就完全固定,这种限制对服务器来说是不可接受的。 虽然可以通过一定的技术手段强行扩大或缩小标准分区,但很容易造成数据丢失。 LVM 可以很好地解决这个问题。 LVM 从 Linux 内核 2.4 版开始可用,其主要功能包括:

  • 更灵活的磁盘容量;
  • 在线数据移动;
  • 磁盘工作在 条带 模式;
  • 镜像卷(重新复制);
  • 卷快照(snapshot)。

LVM 的原理非常简单:

  • 在物理磁盘(或磁盘分区)和文件系统之间添加逻辑抽象层
  • 将多个磁盘(或磁盘分区)合并为卷组(VG
  • 通过被称为逻辑卷(LV)的东西对它们执行底层磁盘管理操作。

物理介质:LVM的存储介质可以是整个硬盘、磁盘分区或 RAID 阵列。 在执行进一步操作之前,必须将设备转换或初始化为 LVM 物理卷(PV)。

PV(物理卷):LVM 的基本存储逻辑块。 要创建物理卷,可以使用磁盘分区或磁盘本身。

VG(卷组):与标准分区中的物理磁盘类似,由一个或多个 PV 组成。

LV(逻辑卷):与标准分区中的硬盘分区类似,LV 构建在 VG 之上。 您可以在 LV 上设置文件系统。

PE:PV 中可分配的最小存储单元,默认为 4MB。 您可以指定其他大小。

LE:LV 中可以分配的最小存储单元。 在相同的 VG 中,PE 和 LE 是相同的且一一对应。

卷组,PE 大小等于 4MB

LVM 的缺点——如果其中一个物理卷出现故障,则使用该物理卷的所有逻辑卷都会丢失。 因此,您必须在 RAID 磁盘上使用 LVM 。

说明

LVM 仅由操作系统管理。 因此,BIOS 至少需要一个没有 LVM 的分区才能启动。

信息

在物理磁盘中,最小的存储单元是 扇区 ;在文件系统中,GNU/Linux 最小的存储单元是 block,在 Windows 操作系统中称为 cluster。 在 RAID 中,最小的存储单元是 chunk

LVM 的写入机制

将数据存储到 LV 时有几种存储机制,其中两种是:

  • 线性卷;
  • 条带 模式的卷;
  • 镜像卷。

线性卷

条带模式下的卷

用于卷管理的 LVM 相关命令

主要相关命令如下:

PVVGLV
扫描pvscanvgscanlvscan
创建pvcreatevgcredlvcreate
显示pvdisplayvgdisplaylvdisplay
移除pvremovevgremovelvremove
扩展vgextendlvextend
缩小vgreducelvreduce
摘要信息pvsvgslvs

pvcreate 命令

pvcreate 命令用来创建物理卷。 它将 Linux 分区(或磁盘)转换为物理卷。

pvcreate [-options] partition

示例:

[root]# pvcreate /dev/hdb1
pvcreate -- physical volume « /dev/hdb1 » successfully created

您也可以使用整个磁盘(例如,这有利于在虚拟环境中增加磁盘大小)。

[root]# pvcreate /dev/hdb
pvcreate -- physical volume « /dev/hdb » successfully created

# 它也可以使用用其他方式书写,例如
[root]# pvcreate /dev/sd{b,c,d}1
[root]# pvcreate /dev/sd[b-d]1
选项说明
-f强制创建卷(磁盘已转化为物理卷)。 使用时要极其谨慎。

vgcreate 命令

vgcreate 命令用于创建卷组。 它将一个或多个物理卷归入一个卷组。

vgcreate  <VG_name>  <PV_name...>  [option]

示例:

[root]# vgcreate volume1 /dev/hdb1
…
vgcreate  volume group « volume1 » successfully created and activated

[root]# vgcreate vg01 /dev/sd{b,c,d}1
[root]# vgcreate vg02 /dev/sd[b-d]1

lvcreate 命令

lvcreate 用来创建逻辑卷。 然后在这些逻辑卷上创建文件系统。

lvcreate -L size [-n name] VG_name

示例:

[root]# lvcreate –L 600M –n VolLog1 volume1
lvcreate -- logical volume « /dev/volume1/VolLog1 » successfully created
选项说明
-L size以K、M 或 G 为单位设置逻辑卷大小。
-n name设置 LV 的名称。 在 /dev/name_volume 中使用此名称创建的特殊文件。
-l number设置要使用的硬盘容量的百分比。 您还可以使用 PE 的数量。 一个 PE 等于 4MB。

信息

使用 lvcreate 命令创建逻辑卷后,操作系统的命名规则为 - /dev/VG_name/LV_name,此文件类型为软链接(也称为符号链接)。 链接文件指向 /dev/dm-0/dev/dm-1 等文件。

用于查看卷信息的 LVM 命令

pvdisplay 命令

pvdisplay 命令允许您查看有关物理卷的信息。

pvdisplay /dev/PV_name

示例:

[root]# pvdisplay /dev/PV_name

vgdisplay 命令

vgdisplay 命令允许您查看有关卷组的信息。

vgdisplay VG_name

示例:

[root]# vgdisplay volume1

lvdisplay 命令

lvdisplay 命令允许您查看有关逻辑卷的信息。

lvdisplay /dev/VG_name/LV_name

示例:

[root]# lvdisplay /dev/volume1/VolLog1

物理介质的准备

物理支撑的 LVM 准备分为以下几个部分:

  • 设置物理磁盘
  • 卷的分区
  • LVM 物理卷
  • LVM 卷组
  • LVM 逻辑卷
  • 创建文件系统
  • 挂载文件系统
  • 管理用户访问

文件系统的结构

文件系统 FS 负责以下操作:

  • 确保对文件的访问权和修改权;
  • 操作文件:创建、读取、修改和删除;
  • 在磁盘上定位文件;
  • 管理分区空间。

Linux 操作系统可以使用不同的文件系统(ext2、ext3、ext4、FAT16、FAT32、NTFS、HFS、BtrFS、JFS、XFS......)。

mkfs 命令

mkfs(make file system) 命令用于创建 Linux 文件系统。

mkfs [-t fstype] filesys

示例:

[root]# mkfs -t ext4 /dev/sda1
选项说明
-t指示要使用的文件系统类型。

警告

如果没有文件系统,就不可能使用磁盘空间。

每个文件系统的结构在每个分区上都是相同的。 Boot SectorSuper block 由系统初始化完成,Inode tableData block 由管理员初始化完成。

说明

唯一例外的是 swap 分区。

Boot sector

Boot sector 是可引导存储介质的第一个扇区,即 0 柱面、0 磁道、1 扇区(1 扇区等于 512 字节)。 它由三个部分组成:

  1. MBR(主引导记录):446 字节。
  2. DPT(磁盘分区表):64 字节。
  3. BRID(启动记录 ID):2 字节。
说明
MBR存储 "引导加载程序"(或 ”GRUB");加载内核并传递参数;在启动时提供一个菜单界面;转移到另一个加载程序,例如在安装多个操作系统时。
DPT记录整个磁盘的分区状态。
BRID确定设备是否可用于引导。

Super block

Super block 表的大小在创建时定义。 它存在于每个分区上,并包含使用它所必需的元素。

它描述了文件系统:

  • 逻辑卷的名称;
  • 文件系统的名称;
  • 文件系统的类型;
  • 文件系统状态;
  • 文件系统大小;
  • 空闲 block 的数量;
  • 指向空闲 block 列表开头的指针;
  • inode 列表的大小;
  • 空闲 inodes 的数量和列表。

系统一经初始化,就会在中央内存中加载一份副本。 此副本在修改后立即更新,系统会定期保存(sync 命令)。

当系统停止时,它也将内存中的该表复制到它的 block 中。

inode 表

inode table 的大小在创建时定义,并存储在分区中。 它由称为 inode 的记录组成,这些记录与创建的文件相对应。 每条记录都包含组成文件的 data block 的地址。

说明

inode 编号在文件系统中是唯一的。

系统一经初始化,就会在中央内存中加载一份副本。 此副本在修改后立即更新,系统会定期保存(sync 命令)。

当系统停止时,它也将内存中的该表复制到它的 block 中。

文件由其 inode 编号管理。

说明

inode table 的大小决定了 FS 可以包含的最大文件数量。

inode table 中存在的信息:

  • Inode 编号;
  • 文件类型和访问权限;
  • 所有者的标识号;
  • 所属组的标识号;
  • 此文件上的链接数;
  • 文件大小(以字节为单位);
  • 文件最后被访问的日期;
  • 文件最后被修改的日期;
  • 最后一次修改 inode 的日期(等于文件的创建时间);
  • 指向包含文件片段的逻辑块的多个指针表(block 表)。

Data block

它的大小对应于分区的剩余可用空间。 该区域包含与每个目录相对应的目录和与文件内容相对应的 data block 。

为了确保文件系统的一致性,在加载操作系统时,会将 superblock 和 inode table 的镜像加载到内存(RAM)中,以便通过这些系统表完成所有的 I/O操作。 当用户创建或修改文件时,此内存镜像会首先更新。 因此,操作系统必须定期更新逻辑磁盘的 superblock(sync 命令)。

这些表在系统关闭时会写入到硬盘。

注意

如果操作系统突然停止,文件系统可能会失去一致性并导致数据丢失。

修复文件系统

可以使用 fsck 命令检查文件系统的一致性。

如果出现错误,则会提出解决方案来解决不一致问题。 修复之后,inode 表中没有条目的文件将附加到逻辑驱动器的 /lost+found 文件夹中。

fsck 命令

fsck 命令是用来检查和修复 Linux 文件系统完整性的工具。

fsck [-sACVRTNP] [ -t fstype ] filesys

示例:

[root]# fsck /dev/sda1

要检查根分区,可以创建一个 forcefsck 文件,然后使用 -F 选项重新启动或运行 shutdown

[root]# touch /forcefsck
[root]# reboot
or
[root]# shutdown –r -F now

警告

要检查的分区必须未挂载。

文件系统的组织

根据定义,文件系统是从根目录构建的目录树结构(一个逻辑设备只能包含一个文件系统)。

文件系统的组织

说明

在 Linux 中,一切都是一个文件。

文本文档、目录、二进制、分区、网络资源、屏幕、键盘、Unix内核、用户程序...

Linux 符合 FHSFilesystems Hierarchy Standard)(参阅 man hier),该标准定义了文件夹的名称及其角色。

目录功能完整单词
/包含特殊目录
/boot与操作系统启动相关的文件
/sbin系统启动和修复所需的命令system binaries
/bin基本系统命令的可执行文件binaries
/usr/bin系统管理命令
/lib共享库和内核模块libraries
/usr保存与 UNIX 相关的数据资源UNIX System Resources
/mnt临时装载点目录mount
/media用于挂载可移动介质
/misc用于挂载 NFS 服务的共享目录。
/root管理员的登录目录
/home普通用户主目录的上级目录
/tmp包含临时文件的目录temporary
/dev特殊的设备文件device
/etc配置和脚本文件editable text configuration
/opt专用于已安装的应用程序optional
/proc这是 proc 文件系统的挂载点,提供有关正在运行的进程和内核的信息processes
/var此目录包含大小可能改变的文件,如后台打印文件和日志文件variables
/sys虚拟文件系统,类似于 /proc
/run这是 /var/run
/srv服务数据目录service
  • 要在树级执行挂载或卸载,您不能位于其挂载点之下。
  • 在非空目录上挂载不会删除内容。 它只是被隐藏了。
  • 只有管理员可以执行挂载操作。
  • 要在启动时自动挂载挂载点,必须写入到 /etc/fstab 文件中。

/etc/fstab 文件

/etc/fstab 文件是在随系统启动时被读取的,其中包含要执行的挂载。 每个要挂载的文件系统都在一行上说明,字段由空格或制表符分隔。

说明

相关的命令按照顺序读取行(如 fsckmountumount)。

/dev/mapper/VolGroup-lv_root   /         ext4    defaults        1   1
UUID=46….92                    /boot     ext4    defaults        1   2
/dev/mapper/VolGroup-lv_swap   swap      swap    defaults        0   0
tmpfs                          /dev/shm  tmpfs   defaults        0   0
devpts                         /dev/pts  devpts  gid=5,mode=620  0   0
sysfs                          /sys      sysfs   defaults        0   0
proc                           /proc     proc    defaults        0   0
  1                              2         3        4            5   6
说明
1文件系统设备(如 /dev/sda1、UUID=... 等)
2使用 绝对路径 表示的挂载点名称(swap 除外)
3文件系统类型(如 ext4、swap等)
4挂载时的特殊选项(如 defaultsro等)
5启用或禁用备份管理(0:未备份,1:已备份)。 这里使用 dump 命令进行备份。 这是一个过时的功能,最初设计用于备份磁带上的旧文件系统。
6使用 fsck 命令检查 FS 时的检查顺序(0:不检查,1:优先,2:非优先)

mount -a 命令允许您根据配置文件 /etc/fstab 的内容自动挂载。 之后便将挂载的信息写入到 /etc/mtab

警告

只有 /etc/fstab 中列出的挂载点才会在重启时挂载。 一般来说,我们不建议将 U 盘和移动硬盘写入到 /etc/fsta 文件中,因为当外部设备拔下并重启操作系统时,操作系统会提示找不到该设备,从而导致无法正常启动。 那我该怎么做呢? 临时挂载,例如:

Shell > mkdir /mnt/usb     
Shell > mount -t  vfat  /dev/sdb1  /mnt/usb  

# 读取U盘信息
Shell > cd /mnt/usb/

# 不需要时,执行以下命令并拔出 USB 闪存盘
Shell > umount /mnt/usb

信息

可以制作一个 /etc/mtab 文件的副本,或将它的内容复制到 /etc/fstab 中。 如果您想查看设备分区号的UUID,可以输入以下命令:lsblk -o name,uuid。 UUID 是 Universally Unique Identifier 的缩写。

挂载管理命令

mount 命令

mount 命令允许您挂载和查看树中的逻辑驱动器。

mount [-option] [device] [directory]

示例:

[root]# mount /dev/sda7 /home
选项说明
-n挂载时不写入到 /etc/mtab
-t指示要使用的文件系统类型。
-a挂载 /etc/fstab 中提到的所有文件系统。
-r将文件系统挂载为只读(等同于 -o ro)。
-w默认情况下以读/写方式挂载文件系统(等同于 -o rw
-o optsopts 参数是逗号分隔的列表(如 remountro 等)。

说明

仅使用 mount 命令即可显示所有已挂载的文件系统。 如果挂载参数为 -o defaults ,则表示等同于 -o rw,suid,dev,exec,auto,nouser,async,且这些参数与文件系统无关。 如果您需要浏览与文件系统相关的特殊挂载选项,请阅读 man 8 mount 中的 "Mount options FS-TYPE" 部分(将 FS-TYPE 类型替换为相应的文件系统,如ntfs、vfat、ufs 等)。

umount 命令

umount 命令用于卸载逻辑驱动器。

umount [-option] [device] [directory]

示例:

[root]# umount /home
[root]# umount /dev/sda7
选项说明
-n设置卸载时不写入到 /etc/mtab 文件。
-r如果 umount 失败,重新挂载为只读。
-f强制卸载。
-a删除 /etc/fstab 文件中提到的所有文件系统的挂载。

说明

卸载时,您必须不能停留在挂载点中。 否则将显示以下错误消息:device is busy

文件命名约定

与任何系统一样,为了能够在树结构和文件管理中方便找到文件,尊重文件的命名规则非常重要。

  • 文件以 255 个字符编码;
  • 可以使用所有 ASCII 字符;
  • 区分大小写字母;
  • 大多数文件没有文件扩展名的概念。 在 GNU/Linux 世界中,除了少数几个(例如 .jpg、.mp4、.gif 等)之外,大多数文件扩展名都是不需要的。

用空格分隔的单词组必须用引号括起来:

[root]# mkdir "working dir"

说明

虽然在技术上创建包含空格的文件或目录并无不妥,但通常应该避免这种情况并用下划线替换任何空格是一种「最佳做法」。

说明

. 开头的文件表示这是隐藏文件,它不能被简单的 ls 看到。

文件扩展名协议示例:

  • .c : C 语言的源文件;
  • .h : C 和 Fortran 的头文件;
  • .o :C 语言的对象文件;
  • .tar:使用 tar 归档的数据文件;
  • .cpio :使用 cpio 归档的数据文件;
  • .gz :使用 gzip 压缩的数据文件;
  • .tgz:使用 tar 归档并用 gzip 进行压缩的数据文件;
  • .html :web 页面

文件名的详细信息

[root]# ls -liah /usr/bin/passwd
266037 -rwsr-xr-x 1 root root 59K mars  22  2019 /usr/bin/passwd
1      2    3     4  5    6    7       8               9
部分说明
1Inode 号
2文件系统(指 10 个字符块中的第一个字符),"-" 表示这是一个普通文件。
3访问权限(10个字符中的最后9个字符)
4如果这是一个目录,这个数字表示该目录中有多少个子目录(包括隐藏的子目录)。 如果这是一个文件,则表示硬链接的数量。 当数字为 1 时,表示只有一个硬链接。
5所有者的名称
6所属组名称
7文件大小(字节、千字节、兆字节)
8上次更新日期
9文件名称

在 GNU/Linux 世界中,有七种文件类型:

文件类型描述
-表示普通文件。 包括纯文本文件(ASCII);二进制文件(binary);数据格式文件(data);各种压缩文件。
d表示目录文件。
b表示块设备文件。 包括各种硬盘、USB 驱动器等。
c表示字符设备文件。 串口接口的设备,如鼠标、键盘等。
s表示套接字文件。 它是专门用于网络通信的文件。
p表示管道文件。 它是一种特殊的文件类型。 其主要目的是解决多个程序同时访问一个文件所引起的错误。 FIFO 是 first-in-first-out 的缩写。
l表示软链接文件,也称为符号链接文件,类似于 Windows 中的快捷方式。 硬链接文件,也称为物理链接文件。

目录补充说明

在每个目录中都有两个隐藏文件: ...。 你需要使用 ls -al 来查看,例如:

# . 表示在当前目录中,例如,您需要在某个目录中执行脚本,通常为:
Shell > ./scripts

# .. 表示当前目录的上一级目录,例如:
Shell > cd /etc/
Shell > cd ..
Shell > pwd
/

# 对于空目录,其第四部分必须大于或等于2。 因为其中有 "." 和 ".."
Shell > mkdir /tmp/t1
Shell > ls -ldi /tmp/t1
1179657 drwxr-xr-x 2 root root 4096 Nov 14 18:41 /tmp/t1

特殊文件

为了与外围设备(硬盘、打印机等)通信,Linux 使用被称为特殊文件的接口文件( (device filespecial file)。 这些文件允许外设识别它们自己。

这些文件很特殊,因为它们并不存储数据,而是定义了与设备通信的访问模式。

它们以两种模式进行定义:

  • block 模式;
  • character 模式。
# 块设备文件
Shell > ls -l /dev/sda
brw-------   1   root  root  8, 0 jan 1 1970 /dev/sda

# 字符设备文件
Shell > ls -l /dev/tty0
crw-------   1   root  root  8, 0 jan 1 1970 /dev/tty0

通信文件

这些是 管道套接字 文件。

  • 管道文件 通过 FIFO(First In, First Out)机制在进程间传递信息。 一个进程将临时信息写入到 管道 文件,另一个进程随后读取该信息。 读取之后,该信息即不可再访问。

  • 套接字文件 允许在本地或远程系统上的双向进程间通信。 它们会占用文件系统的 inode

链接文件

这些文件允许为同一个物理文件提供多个逻辑名称,从而为该文件创建一个新的访问点。

链接文件有两种类型:

  • 软链接文件,也称为符号链接文件;
  • 硬链接文件,也称为物理链接文件。

主要特性为:

链接类型说明
软链接文件此文件类似于 Windows 的快捷方式。 它具有 0777 权限并指向原始文件。 删除原始文件后,可以使用 ls -l 查看软链接文件的输出信息。 在输出信息中,软链接的文件名显示为红色,指向的原始文件显示为红色并闪烁提示。
硬链接文件此文件表示占用相同 inode 编号的不同映射。 它们可以同步更新(包括文件内容、修改时间、所有者、所属组、访问时间等)。 硬链接文件不能跨越分区和文件系统,且不能在目录上使用。

具体例子如下:

# 权限和他们指向的原始文件
Shell > ls -l /etc/rc.locol
lrwxrwxrwx 1 root root 13 Oct 25 15:41 /etc/rc.local -> rc.d/rc.local

# 删除原始文件时。 "-s" 表示软链接选项
Shell > touch /root/Afile
Shell > ln -s /root/Afile /root/slink1
Shell > rm -rf /root/Afile

呈现效果

Shell > cd /home/paul/
Shell > ls –li letter
666 –rwxr--r-- 1 root root  letter

# ln 命令没有添加任何选项时表示硬链接
Shell > ln /home/paul/letter /home/jack/read

# 硬链接的本质是相同 inode 号在不同目录下的文件映射。
Shell > ls –li /home/*/*
666 –rwxr--r-- 2 root root  letter
666 –rwxr--r-- 2 root root  read

# 如果您使用一个硬链接到目录, 您将会被提示:
Shell > ln  /etc/  /root/etc_hardlink
ln: /etc: hard link not allowed for directory

文件属性

Linux 是一个多用户的操作系统,对访问文件的控制是必不可少的。

这些控制的功能如下:

  • 文件访问权限;
  • 用户 (ugo Users Groups Others)。

文件和目录的基本权限

文件权限 的描述如下:

文件权限描述
r读取 允许读取文件 (catless, ...) 并复制文件 (cp...)。
w写入。 允许修改文件内容(cat>>vim...)
x执行。 将文件视为 可执行 文件(二进制或脚本)。
-无权限

目录权限 的描述如下:

目录权限描述
r读取 允许读取目录的内容(ls -R)。
w写入。 允许您在此目录中创建和删除文件或目录,例如 mkdirrmdirrmtouch 等命令。
x执行。 允许进入到目录(cd)。
-无权限

信息

对于目录的权限而言,rx 通常同时出现。 移动或重命名文件取决于文件所在的目录是否具有 w 权限,删除文件也是如此。

基本权限对应的用户类型

用户类型说明
u所有者
g所属组
o其他用户

信息

在某些命令中,您可以使用 aall)来表示 ugo。 例如:chmod a+x FileName 等同于 chmod u+x,g+x,o+x FileNamechmod ugo+x FileName

属性管理

权限的显示是通过使用 ls -l 命令来完成的。 这是10个字符块的最后9个字符。 更确切地说,是3乘3个字符。

[root]# ls -l /tmp/myfile
-rwxrw-r-x  1  root  sys  ... /tmp/myfile
  1  2  3       4     5
部分说明
1这里所有者(u)的权限为 rwx
2这里所属组(g)的权限为 rw-
3这里其他用户(o)的权限为 r-x
4文件所有者
5文件所属组

默认情况下,文件的 所有者 是创建它的人。 文件的 是创建该文件的所有者的组。 其他人 则是不关心之前案例的人。

可使用 chmod 命令更改属性。

只有管理员和文件的所有者可以更改文件的权限。

chmod 命令

chmod 命令允许您更改文件的访问权限。

chmod [option] mode file
选项说明
-R递归更改目录和目录下所有文件的权限。

警告

文件和目录的权限未被分离。 对于某些操作,需要了解包含文件的目录权限。 受写保护的文件可以被其他用户删除,只要包含该文件的目录权限允许该用户执行此操作。

Mode 指示可以用八进制表示(例如 744)或符号表示([ugoa] [+=-] [rwxst])。

八进制(或数字)表示法:
数字说明
4r
2w
1x
0-

将这三个数字加在一起即可获得一个用户类型的权限。 例如: 755=rwxr-xr-x

八进制表示

777权限

741权限

信息

有时候你会看到 chmod 4755。 数字4是指特殊权限 set uid 。 特殊权限暂时不会在这里细谈,只作为基本的了解。

[root]# ls -l /tmp/fil*
-rwxrwx--- 1 root root  /tmp/file1
-rwx--x--- 1 root root  /tmp/file2
-rwx--xr-- 1 root root  /tmp/file3

[root]# chmod 741 /tmp/file1
[root]# chmod -R 744 /tmp/file2
[root]# ls -l /tmp/fic*
-rwxr----x 1 root root  /tmp/file1
-rwxr--r-- 1 root root  /tmp/file2
符号表示法

此方法可以被视为用户类型、运算符和权限之间的「字面意思上的」关联。

符号方法

[root]# chmod -R u+rwx,g+wx,o-r /tmp/file1
[root]# chmod g=x,o-r /tmp/file2
[root]# chmod -R o=r /tmp/file3

默认权限和掩码

当创建一个文件或目录时,它已经拥有权限。

  • 对于目录:rwxr-xr-x755
  • 对于文件:rw-r-r-644

此行为由 默认掩码 定义。

其本质是在没有执行权限的情况下以最大权限删除掩码所定义的值。

对于目录:

SUID 如何工作

对于文件,执行权限将被删除:

文件的默认权限

信息

/etc/login.defs 文件定义了默认 UMASK,其值为 022。 这意味着创建文件的权限是 755 (rwxr-xr-x)。 但是,为了安全起见,GNU/Linux 针对新创建的文件并没有 x 权限。 这一限制适用于 root(uid=0) 和 普通用户(uid>=1000) 。

# root 用户
Shell > touch a.txt
Shell > ll
-rw-r--r-- 1 root root     0 Oct  8 13:00 a.txt

umask 命令

umask 命令允许您显示和修改掩码。

umask [option] [mode]

示例:

$ umask 033
$ umask
0033
$ umask -S
u=rwx,g=r,o=r
$ touch umask_033
$ ls -la  umask_033
-rw-r--r-- 1 rockstar rockstar 0 nov.   4 16:44 umask_033
$ umask 025
$ umask -S
u=rwx,g=rx,o=w
$ touch umask_025
$ ls -la  umask_025
-rw-r---w- 1 rockstar rockstar 0 nov.   4 16:44 umask_025
选项说明
-S用符号显示的文件权限。

警告

umask 并不会影响现有文件。 umask -S 显示将要创建文件的文件权限(没有执行权限)。 所以,它不是用减去最大值的掩码来显示的。

说明

在上面的示例中,使用命令修改掩码仅适用于当前连接的会话。

信息

umask 命令属于 bash 的内置命令,因此当你使用 man umask 时,所有内置命令都将被显示。 如果你只想查看 umask 的帮助,你需要使用 help umask 命令。

要保留该值,您必须修改以下配置文件:

对于所有用户:

  • /etc/profile
  • /etc/bashrc

对于特定用户:

  • ~/.bashrc

当编写上述文件时,它实际上是覆盖了 /etc/login.defsUMASK 参数。 如果你想要提高操作系统的安全性,你可以设置 umask 为 027077

Author: Antoine Morvan

Contributors: Steven Spencer, tianci li, Serge, Ganna Zhyrnova