文件系统¶
在本章中,您将学习如何处理文件系统。
目标:在本章中,未来的 Linux 管理员将学会如何
管理磁盘上的分区;
使用 LVM 以更好地利用磁盘资源;
为用户提供文件系统并管理访问权限。
还将发现
Linux 中的树状结构是如何组织的;
提供的不同类型文件以及如何使用它们;
硬件、磁盘、分区、lvm、linux
知识:
复杂度:
阅读时间: 20 分钟
分区¶
分区允许安装多个操作系统,因为它们无法在同一个逻辑驱动器上共存。它还允许逻辑上分离数据(安全、访问优化等)。
分区表存储在磁盘的第一个扇区(MBR:主引导记录)中,记录了物理磁盘到分区卷的划分。
对于MBR分区表类型,同一物理磁盘最多可分为 4 个分区
- 主分区(或主分区)
- 扩展分区
警告
每个物理磁盘最多只能有一个扩展分区。也就是说,在 MBR 分区表中,一个物理磁盘最多可以有
- 三个主分区加一个扩展分区
- 四个主分区
扩展分区不能写入数据和格式化,并且只能包含逻辑分区。MBR 分区表能识别的最大物理磁盘是2TB。
设备文件名命名约定¶
在 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 必须是第一个逻辑分区。
警告
请注意!这里提到的分区号主要指块设备(存储设备)的分区号。
至少有两个命令可以用来分区磁盘:fdisk
和 cfdisk
。这两个命令都有交互式菜单。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 相同并一一对应。
缺点是,如果其中一个物理卷发生故障,那么所有使用该物理卷的逻辑卷都会丢失。您将不得不使用 RAID 磁盘上的 LVM。
注意
LVM 仅由操作系统管理。因此,BIOS 需要至少一个非 LVM 分区才能启动。
信息
在物理磁盘中,最小的存储单位是扇区;在文件系统中,GNU/Linux 的最小存储单位是块,在 Windows 操作系统中称为簇。在 RAID 中,最小的存储单位是块。
LVM 的写入机制¶
将数据写入LV时有几种存储机制,其中两种是
- 线性卷;
- 条带化模式卷;
- 镜像卷。
用于卷管理的 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 字节)。它由三个部分组成
- MBR(主引导记录):446 字节。
- DPT(磁盘分区表):64 字节。
- 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
警告
要检查的分区必须已卸载。
文件系统的组织¶
根据定义,文件系统是由从根目录构建的目录树结构(一个逻辑设备只能包含一个文件系统)。
注意
在 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
文件在系统启动时读取,并包含需要执行的挂载。要挂载的每个文件系统都描述在单独一行上,字段由空格或制表符分隔。
注意
行按顺序读取(fsck
、mount
、umount
)。
/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 | 用于挂载的特殊选项(defaults 、ro 、...) |
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 参数是一个逗号分隔的列表(remount 、ro 、...)。 |
注意
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
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 | 读取。允许读取文件(cat 、less 、...)和复制文件(cp 、...)。 |
w | 写入。允许修改文件内容(cat 、>> 、vim 、...)。 |
x | 执行。将文件视为一个 eXecutable(可执行文件)(二进制文件或脚本)。 |
- | 无权限 |
目录权限的描述如下
目录权限 | 描述 |
---|---|
r | 读取。允许读取目录内容(ls -R )。 |
w | 写入。允许在该目录中创建和删除文件/目录,例如命令 mkdir 、rmdir 、rm 、touch 等。 |
x | 执行。允许进入目录(cd )。 |
- | 无权限 |
信息
对于目录的权限,r
和 x
通常同时出现。移动或重命名文件取决于其所在目录是否具有 w
权限,删除文件也是如此。
与基本权限对应的用户类型¶
用户类型 | 描述 |
---|---|
u | 所有者 |
g | 所有者组 |
o | 其他用户 |
信息
在某些命令中,您可以使用a(all,所有)来表示ugo。例如:chmod a+x FileName
等同于 chmod u+x,g+x,o+x FileName
或 chmod 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。
信息
有时您会看到 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-x
或 755。 - 对于文件:
rw-r-r-
或 644。
这种行为由默认掩码定义。
原理是在最大权限(不含执行权限)上减去掩码定义的值。
对于目录
对于文件,会移除执行权限
信息
/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.defs
的UMASK参数。如果您想提高操作系统的安全性,可以将 umask 设置为027或077。
作者:Antoine Morvan
贡献者:Steven Spencer、tianci li、Serge、Ganna Zhyrnova