跳至内容

文件系统

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


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

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

以及发现

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

🏁 **硬件**、**磁盘**、**分区**、**lvm**、**linux**

**知识**: ⭐ ⭐
**复杂性**: ⭐ ⭐

**阅读时间**: 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。

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开始提供,其主要特点是

  • 更灵活的磁盘容量;
  • 在线数据移动;
  • stripe模式存在的磁盘;
  • 镜像卷(重新复制);
  • 卷快照(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时,有几种存储机制,其中两种是

  • 线性卷;
  • stripe模式存在的卷;
  • 镜像卷。

Linear volumes

Volumes in stripe mode

用于卷管理的LVM命令

主要的相关命令如下

项目PVVGLV
扫描pvscanvgscanlvscan
创建pvcreatevgcreatelvcreate
显示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

# 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(创建文件系统) 命令允许您创建Linux文件系统。

mkfs [-t fstype] filesys

示例

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

警告

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

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

注意

唯一的例外是交换分区。

引导扇区

引导扇区是可引导存储介质的第一个扇区,即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,对应于创建的文件。每个记录包含构成文件的data块的地址。

注意

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 文件并重新启动或运行带有 -F 选项的 shutdown 命令。

[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此目录包含可能改变大小的文件,例如 spool 文件和日志文件变量
/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挂载点名称,绝对路径交换除外)
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 optsopts 参数是逗号分隔的列表(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
部分描述
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 来查看,例如

# . 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 用户组其他)。

文件和目录的基本权限

文件权限的描述如下

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

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

属性使用 chmod 命令更改。

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

chmod 命令

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

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

警告

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

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

八进制(或数字)表示
数字描述
4r
2w
1x
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