跳至内容

文件系统

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


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

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

还将发现

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

🏁 硬件磁盘分区lvmlinux

知识⭐ ⭐
复杂度⭐ ⭐

阅读时间: 20 分钟


分区

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

分区表存储在磁盘的第一个扇区(MBR:主引导记录)中,记录了物理磁盘到分区卷的划分。

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

  • 主分区(或主分区)
  • 扩展分区

警告

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

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

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

Breakdown into only 4 primary partitions

Breakdown into 3 primary partitions and one extended

设备文件名命名约定

在 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 必须是第一个逻辑分区。

警告

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

Identification of partitions

至少有两个命令可以用来分区磁盘: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(GNOME 分区编辑器)。

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(卷组):类似于标准分区中的物理磁盘,VG 由一个或多个 PV 组成。

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

PE:在物理卷中可分配的最小存储单元,默认为4MB。您可以指定额外的尺寸。

LE:在逻辑卷中可分配的最小存储单元。在同一个 VG 中,PE 和 LE 相同并一一对应。

Volume group, PE size equal to 4MB

缺点是,如果其中一个物理卷发生故障,那么所有使用该物理卷的逻辑卷都会丢失。您将不得不使用 RAID 磁盘上的 LVM。

注意

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

信息

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

LVM 的写入机制

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

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

Linear volumes

Volumes in stripe mode

用于卷管理的 LVM 命令

主要相关命令如下

项目 PV VG LV
扫描 pvscan vgscan lvscan
create pvcreate vgcreate lvcreate
显示 pvdisplay vgdisplay lvdisplay
删除 pvremove vgremove lvremove
扩展 vgextend lvextend
缩减 vgreduce lvreduce
汇总信息 pvs vgs lvs

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

# It can also be written in other ways, such as
[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 指示要使用的文件系统类型。

警告

没有文件系统就无法使用磁盘空间。

每个文件系统在每个分区上都有相同的结构。系统会初始化一个引导扇区和一个超级块,然后管理员初始化一个inode表和一个数据块

注意

唯一的例外是swap分区。

引导扇区

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

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

超级块

超级块表的大小在创建时定义。它存在于每个分区中,并包含其使用所需的所有元素。

它描述了文件系统

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

系统初始化后,会将该副本加载到中央内存中。修改时会立即更新此副本,系统会定期保存它(sync 命令)。

系统停止时,会将此内存表复制到其块中。

inode 表

inode 表的大小在创建时定义并存储在分区上。它由对应于已创建文件的记录(称为 inode)组成。每条记录包含构成文件的数据块的地址。

注意

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

系统初始化后,会将该副本加载到中央内存中。修改时会立即更新此副本,系统会定期保存它(sync 命令)。

系统停止时,会将此内存表复制到其块中。

文件由其 inode 号管理。

注意

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

inode 表中的信息

  • inode 号;
  • 文件类型和访问权限;
  • 所有者识别号;
  • 所有者组的识别号;
  • 此文件的链接数;
  • 文件大小(字节);
  • 文件最后访问日期;
  • 文件最后修改日期;
  • inode 最后修改日期(= 创建日期);
  • 指向包含文件片段的逻辑块的多个指针(块表)。

数据块

其大小对应于分区剩余的可用空间。此区域包含每个目录的目录以及文件内容的对应数据块。

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

这些表在系统关机时被写入硬盘。

注意

如果突然断电,文件系统可能会丢失一致性并导致数据丢失。

文件系统修复

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

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

fsck 命令

fsck 命令是 Linux 文件系统的控制台模式完整性检查和修复工具。

fsck [-sACVRTNP] [ -t fstype ] filesys

示例

[root]# fsck /dev/sda1

要检查根分区,可以创建一个 forcefsck 文件并重启,或运行 shutdown 并带 -F 选项。

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

警告

要检查的分区必须已卸载。

文件系统的组织

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

Organization of a file system

注意

在 Linux 中,一切皆文件。

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

Linux 遵循FHS文件系统层次结构标准)(参见 man hier),它定义了文件夹的名称和角色。

目录 功能 完整名称
/ 包含特殊目录
/boot 与系统启动相关的文件
/sbin 系统启动和修复所必需的命令 系统二进制文件
/bin 基本系统命令的可执行文件 二进制文件
/usr/bin 系统管理命令
/lib 共享库和内核模块
/usr 保存与 UNIX 相关的系统资源 UNIX 系统资源
/mnt 临时挂载点目录 挂载
/media 用于挂载可移动媒体
/misc 用于挂载 NFS 服务的共享目录。
/root 管理员的登录目录
/home 普通用户主目录的上级目录
/tmp 包含临时文件的目录 临时
/dev 特殊设备文件 设备
/etc 配置文件和脚本文件 可编辑文本配置
/opt 特定于已安装的应用程序 可选
/proc 这是 proc 文件系统的挂载点,它提供有关正在运行的进程和内核的信息 进程
/var 此目录包含大小可能变化的​​文件,例如假脱机文件和日志文件 变量
/sys 虚拟文件系统,类似于 /proc
/run 即 /var/run
/srv 服务数据目录 服务
  • 要挂载或卸载到树级别,您不能位于其挂载点之下。
  • 挂载到非空目录不会删除内容。它只是被隐藏了。
  • 只有管理员才能执行挂载操作。
  • 启动时自动挂载的挂载点必须在 /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 中列出的挂载点才会在重启时挂载。总的来说,我们不建议将 USB 闪存盘和可移动硬盘写入 /etc/fstab 文件,因为当外部设备被拔掉并重启时,系统会提示找不到设备,导致启动失败。那么我该怎么办?例如,临时挂载

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

# Read the information of the USB flash disk
Shell > cd /mnt/usb/

# When not needed, execute the following command to pull out the USB flash disk
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 opts opts 参数是一个逗号分隔的列表(remountro、...)。

注意

mount 命令单独显示所有挂载的文件系统。如果挂载参数是 -o defaults,它等同于 -o rw,suid,dev,exec,auto,nouser,async,并且这些参数独立于文件系统。如果您需要浏览与文件系统相关的特殊挂载选项,请阅读 man 8 mount 中的“挂载选项 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:网页。

文件名详情

[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
部分 描述
1 inode 号
2 文件类型(10 个字符块的第 1 个字符),"-" 表示这是一个普通文件。
3 访问权限(10 个字符块的最后 9 个字符)
4 如果是目录,这个数字表示该目录中有多少子目录,包括隐藏目录。如果是文件,则表示硬链接的数量。当数量为 1 时,只有一个硬链接。
5 所有者姓名
6 组名称
7 大小(字节、千字节、兆字节)
8 最后更新日期
9 文件名

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

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

目录的补充说明

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

# . Indicates that in the current directory, for example, you need to execute a script in a directory, usually:
Shell > ./scripts

# .. represents the directory one level above the current directory, for example:
Shell > cd /etc/
Shell > cd ..
Shell > pwd
/

# For an empty directory, its fourth part must be greater than or equal to 2. Because there are "." and ".."
Shell > mkdir /tmp/t1
Shell > ls -ldi /tmp/t1
1179657 drwxr-xr-x 2 root root 4096 Nov 14 18:41 /tmp/t1

特殊文件

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

这些文件之所以特殊,是因为它们不包含数据,而是指定了与设备通信的访问模式。

它们有两种模式定义

  • 模式;
  • 字符模式。
# Block device file
Shell > ls -l /dev/sda
brw-------   1   root  root  8, 0 jan 1 1970 /dev/sda

# Character device file
Shell > ls -l /dev/tty0
crw-------   1   root  root  8, 0 jan 1 1970 /dev/tty0

通信文件

这些是管道(pipes)和套接字文件。

  • 管道文件通过 FIFO(先进先出)在进程之间传递信息。一个进程将瞬时信息写入管道文件,另一个进程读取它。读取后,信息就不再可访问。

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

这些文件允许为同一个物理文件设置多个逻辑名称,创建对文件的新的访问点。

有两种类型的链接文件

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

它们的主要特点是

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

具体示例如下

# Permissions and the original file to which they point
Shell > ls -l /etc/rc.locol
lrwxrwxrwx 1 root root 13 Oct 25 15:41 /etc/rc.local -> rc.d/rc.local

# When deleting the original file. "-s" represents the soft link option
Shell > touch /root/Afile
Shell > ln -s /root/Afile /root/slink1
Shell > rm -rf /root/Afile

Present the effect

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

# The ln command does not add any options, indicating a hard link
Shell > ln /home/paul/letter /home/jack/read

# The essence of hard links is the file mapping of the same inode number in different directories.
Shell > ls –li /home/*/*
666 –rwxr--r-- 2 root root  letter
666 –rwxr--r-- 2 root root  read

# If you use a hard link to a directory, you will be prompted:
Shell > ln  /etc/  /root/etc_hardlink
ln: /etc: hard link not allowed for directory

文件属性

Linux 是一个多用户操作系统,文件访问控制至关重要。

这些控制是以下因素的功能

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

文件和目录的基本权限

文件权限的描述如下

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

目录权限的描述如下

目录权限 描述
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 所有者(user)权限,此处为 rwx
2 所有者组权限(group),此处为 rw-
3 其他用户权限(others),此处为 r-x
4 文件所有者
5 文件的组所有者

默认情况下,文件的所有者是创建它的用户。文件的是创建该文件的所有者的组。其他用户是指不属于前两种情况的用户。

属性使用 chmod 命令更改。

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

chmod 命令

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

chmod [option] mode file
选项 观察
-R 递归地更改目录及其下的所有文件的权限。

警告

文件和目录的权限是不可分割的。对于某些操作,需要知道包含文件的目录的权限。一个只读文件可以被另一个用户删除,只要包含它的目录的权限允许该用户执行该操作。

模式指示可以是一个八进制表示(例如 744)或一个符号表示([ugoa][+=-][rwxst])。

八进制(或数字)表示法
数字 描述
4 r
2 w
1 x
0 -

将三个数字相加得到一个用户类型的权限。例如:755=rwxr-xr-x

Octal representation

Rights 777

Rights 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
符号表示法

这种方法可以被认为是用户类型、运算符和权限之间的“字面”关联。

Symbolic method

[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

这种行为由默认掩码定义。

原理是在最大权限(不含执行权限)上减去掩码定义的值。

对于目录

How the SUID works

对于文件,会移除执行权限

Default rights of a file

信息

/etc/login.defs 文件定义了默认的 UMASK,值为022。这意味着创建文件的权限是 755(rwxr-xr-x)。然而,出于安全考虑,GNU/Linux 在创建新文件时默认不赋予x权限。此限制适用于 root(uid=0)和普通用户(uid>=1000)。

# root user
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

作者:Antoine Morvan

贡献者:Steven Spencer、tianci li、Serge、Ganna Zhyrnova