文件管理 - Linux系统文件属性

1. Linux系统文件属性

使用ls -l命令可以查看文件的详细信息,包括文件属性、权限、所有者等信息。

1.1 文件属性详解

1
-rw-------. 1 root root 4434 May 30 13:58 ks.cfg

文件属性说明:

位置 内容 说明
-rw-------. 文件类型与权限
1 硬链接次数
root 所属用户
root 所属组
4434 文件大小(字节)
⑥⑦⑧ May 30 13:58 最新修改的时间与日期
ks.cfg 文件或目录名称

1.2 文件属性详细说明

① 文件类型与权限 (-rw-------.):

  • 第一个字符: 文件类型

    • -: 普通文件
    • d: 目录
    • l: 链接文件
    • b: 块设备文件
    • c: 字符设备文件
    • s: 套接字文件
    • p: 管道文件
  • 后续9个字符: 文件权限(rwxrwxrwx)

    • 前3位: 所有者权限
    • 中3位: 所属组权限
    • 后3位: 其他用户权限
  • 最后一个字符: SELinux上下文(.表示有SELinux上下文)

② 硬链接次数: 表示有多少个文件名指向同一个Inode

③ 所属用户: 文件的所有者

④ 所属组: 文件所属的用户组

⑤ 文件大小: 文件占用的字节数

⑥⑦⑧ 修改时间: 文件最后修改的日期和时间

⑨ 文件名: 文件或目录的名称


2. Linux系统文件类型

通过颜色或者后缀判断文件类型不一定准确。最准确的方法是使用ls -l命令查看第一个字符,或使用file命令查看文件类型。

2.1 文件类型识别

1
2
# 查看文件类型(看第一个字符)
ls -l 文件名

2.2 文件类型说明

格式 说明 示例
- 普通文件(文本, 二进制, 压缩, 图片, 日志等) /etc/hosts, /bin/ls
d 目录文件 /tmp, /home
b 设备文件(块设备)存储设备硬盘 /dev/sda1, /dev/sda2
c 设备文件(字符设备)打印机,终端 /dev/tty1, /dev/zero
s 套接字文件, 进程间通信(socket) /dev/log
p 管道文件 /run/dmeventd-client
l 链接文件 /etc/grub2.cfg

2.3 文件类型示例

1
2
3
4
5
6
7
8
9
10
11
# 查看不同类型文件的属性
[root@liyanzhao ~]# ll -d /etc/hosts /tmp /bin/ls /dev/sda /dev/tty1 /etc/grub2.cfg /dev/log /run/dmeventd-client

-rwxr-xr-x. 1 root root 117656 Jun 30 2016 /bin/ls # 普通文件(可执行文件)
srw-rw-rw-. 1 root root 0 Jan 20 10:35 /dev/log # 套接字文件
brw-rw----. 1 root disk 8, 0 Jan 20 10:36 /dev/sda # 块设备文件
crw--w----. 1 root tty 4, 1 Jan 20 10:36 /dev/tty1 # 字符设备文件
lrwxrwxrwx. 1 root root 22 Jan 13 11:31 /etc/grub2.cfg -> ../boot/grub2/grub.cfg # 软链接文件
-rw-r--r--. 1 root root 199 Jan 20 11:03 /etc/hosts # 普通文件(文本文件)
prw-------. 1 root root 0 Jan 20 10:36 /run/dmeventd-client # 管道文件
drwxrwxrwt. 61 root root 8192 Jan 21 13:01 /tmp # 目录文件

2.4 查看文件类型命令file

file命令可以更详细地识别文件类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 查看文本文件
[root@liyanzhao ~]# file /etc/hosts
/etc/hosts: ASCII text

# 查看可执行文件
[root@liyanzhao ~]# file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=aa7ff68f13de25936a098016243ce57c3c982e06, stripped

# 查看块设备文件
[root@liyanzhao ~]# file /dev/sda
/dev/sda: block special

# 查看字符设备文件
[root@liyanzhao ~]# file /dev/tty1
/dev/tty1: character special

# 查看软链接文件
[root@liyanzhao ~]# file /etc/grub2.cfg
/etc/grub2.cfg: broken symbolic link to `../boot/grub2/grub.cfg'

# 查看目录
[root@liyanzhao ~]# file /home
/home: directory

# 查看管道文件
[root@liyanzhao ~]# file /run/dmeventd-client
/run/dmeventd-client: fifo (named pipe)

注意: Linux文件扩展名不代表任何含义, 仅仅是为了运维人员便于识别。例如,.txt.sh等扩展名只是约定俗成,Linux系统并不依赖扩展名来识别文件类型。


3. Linux系统链接文件

Linux系统中有两种链接文件:软链接(符号链接)和硬链接

3.1 软链接(Symbolic Link)

Linux里的软链接文件类似于Windows系统中的”快捷键方式”,里面具体存放的是源文件的路径,并指向源文件实体,因此通过访问这个”快捷方式”可迅速访问到源文件。软链接文件类型是l

创建软链接

1
ln -s 源文件 目标软链接文件

注意: 软链接和源文件是不同类型的文件,所以inode也不同。

文件软链接示例

1
2
3
4
5
6
7
8
9
# 创建源文件
touch /root/file

# 创建软链接
ln -s /root/file /tmp/file_bak

# 查看软链接
ll /tmp/file_bak
# 输出: lrwxrwxrwx. 1 root root 10 Jan 20 11:00 /tmp/file_bak -> /root/file

目录软链接示例

1
2
3
4
5
6
7
8
9
# 创建目录
mkdir /soft/nginx1.1 -p

# 创建目录软链接
ln -s /soft/nginx1.1/ /soft/nginx

# 查看链接指向
ll /soft/nginx
# 输出: lrwxrwxrwx. 1 root root 15 Jan 20 11:00 /soft/nginx -> /soft/nginx1.1/

生产环境软链接作用

  1. 软件升级: 通过软链接指向不同版本,方便切换

    1
    2
    3
    ln -s /usr/local/nginx-1.18.0 /usr/local/nginx
    # 升级时只需修改软链接指向
    ln -sf /usr/local/nginx-1.20.0 /usr/local/nginx
  2. 企业代码发布: 通过软链接实现零停机发布

    1
    ln -s /var/www/html-v2 /var/www/html
  3. 不方便目录移动: 保持原有路径访问,实际文件已移动

    1
    2
    3
    # 移动大文件到其他分区,但保持原路径可访问
    mv /var/log /data/log
    ln -s /data/log /var/log

3.2 硬链接(Hard Link)

Linux文件系统中, 多个文件名指向同一个索引节点Inode是正常且允许的(文件的多个有效的入口),这种情况的文件称为硬链接。

通过执行ln 源文件 硬链接文件给文件设置硬链接,来防止重要文件被误删。

注意:

  • 目录不能创建硬链接
  • 硬链接文件可以用rm命令删除
  • 硬链接不可以跨越分区系统

文件硬链接示例

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建源文件
touch /root/file

# 创建硬链接
ln /root/file /tmp/file_hard

# 查看硬链接
ll /tmp/file_hard
# 输出: -rw-r--r--. 2 root root 0 Jan 20 11:00 /tmp/file_hard

# 查看inode号(硬链接的inode号相同)
ls -i /root/file /tmp/file_hard
# 输出: 两个文件的inode号相同

硬链接特点

1
2
3
4
5
6
7
8
9
10
# 查看硬链接次数
ls -l /root/file
# 输出: -rw-r--r--. 2 root root 0 Jan 20 11:00 /root/file
# 注意: 数字2表示有2个硬链接(源文件+硬链接文件)

# 创建多个硬链接
ln /root/file /tmp/file_hard2
ls -l /root/file
# 输出: -rw-r--r--. 3 root root 0 Jan 20 11:00 /root/file
# 注意: 数字变为3(源文件+2个硬链接文件)

3.3 软硬链接区别

Linux下软链接和硬链接的区别:

对比项 软链接 硬链接
创建命令 ln -s ln
目录支持 支持 不支持
跨分区 支持 不支持
Inode 与源文件不同 与源文件相同
文件类型 链接文件(l) 普通文件(-)
删除源文件 软链接失效 硬链接仍然有效
删除链接文件 对源文件无影响 对源文件无影响
文件大小 存储路径,很小 与源文件相同

详细区别说明

  1. 创建命令不同

    • ln命令创建硬链接
    • ln -s命令创建软链接
  2. 目录支持

    • 目录不能创建硬链接,并且硬链接不可以跨越分区系统
    • 目录软链接特别常用,并且软链接支持跨越分区系统
  3. Inode关系

    • 硬链接文件与源文件的inode相同
    • 软链接文件与源文件inode不同
  4. 删除影响

    • 删除软链接文件,对源文件及硬链接文件无任何影响
    • 删除文件的硬链接文件,对源文件及链接文件无任何影响
    • 删除链接文件的源文件,对硬链接无影响,会导致软链接失效
    • 删除源文件及其硬链接文件,整个文件会被真正的删除

实际验证示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 创建测试文件
echo "test content" > /tmp/source.txt

# 创建硬链接
ln /tmp/source.txt /tmp/hard_link.txt

# 创建软链接
ln -s /tmp/source.txt /tmp/soft_link.txt

# 查看inode号
ls -i /tmp/source.txt /tmp/hard_link.txt /tmp/soft_link.txt
# 输出:
# 1234567 /tmp/hard_link.txt # 与源文件inode相同
# 1234567 /tmp/source.txt # 与硬链接inode相同
# 1234568 /tmp/soft_link.txt # 与源文件inode不同

# 删除源文件
rm /tmp/source.txt

# 查看硬链接(仍然有效)
cat /tmp/hard_link.txt
# 输出: test content

# 查看软链接(失效)
cat /tmp/soft_link.txt
# 输出: cat: /tmp/soft_link.txt: No such file or directory

4. Inode详解

4.1 Inode概念

Inode(Index Node)是Linux文件系统中存储文件元数据的数据结构,每个文件都有一个唯一的Inode号。

4.2 Inode包含的信息

  • 文件类型和权限
  • 文件所有者信息
  • 文件大小
  • 时间戳(创建、修改、访问时间)
  • 指向数据块的指针
  • 硬链接计数

4.3 查看Inode信息

1
2
3
4
5
6
7
8
# 查看文件Inode号
ls -i filename

# 查看文件系统Inode使用情况
df -i

# 查看文件详细信息(包括Inode)
stat filename

5. 链接文件应用场景

5.1 软链接应用场景

  1. 软件版本管理

    1
    2
    3
    4
    5
    # 当前版本
    ln -s /usr/local/nginx-1.18.0 /usr/local/nginx

    # 升级到新版本
    ln -sf /usr/local/nginx-1.20.0 /usr/local/nginx
  2. 配置文件管理

    1
    2
    # 统一管理配置文件
    ln -s /etc/nginx/conf.d/site.conf /var/www/site/nginx.conf
  3. 日志文件管理

    1
    2
    # 将日志文件链接到其他分区
    ln -s /data/logs/app.log /var/log/app.log

5.2 硬链接应用场景

  1. 文件备份保护

    1
    2
    # 创建重要文件的硬链接作为备份
    ln /etc/passwd /root/passwd.backup
  2. 防止误删

    1
    2
    # 创建硬链接,即使删除源文件,硬链接仍然有效
    ln important_file.txt backup_link.txt

6. 常见问题

6.1 软链接失效

问题: 软链接指向的文件被删除或移动

解决: 重新创建软链接或恢复源文件

1
2
3
4
5
# 检查软链接是否失效
ls -l /path/to/link

# 重新创建软链接
ln -sf /new/path/to/file /path/to/link

6.2 硬链接无法跨分区

问题: 硬链接不能跨越文件系统

解决: 使用软链接代替

1
2
3
4
5
# 错误:硬链接跨分区会失败
ln /dev/sda1/file /dev/sdb1/link # 失败

# 正确:使用软链接
ln -s /dev/sda1/file /dev/sdb1/link # 成功

6.3 目录硬链接

问题: 目录不能创建硬链接

原因: Linux系统限制,防止目录树形成循环

解决: 使用软链接

1
2
3
4
5
# 错误:目录硬链接会失败
ln /etc /tmp/etc_link # 失败

# 正确:使用软链接
ln -s /etc /tmp/etc_link # 成功

7. 命令总结

7.1 查看文件属性

1
2
3
4
5
6
7
8
9
10
11
# 详细列表
ls -l filename

# 包含inode号
ls -li filename

# 查看文件类型
file filename

# 查看文件详细信息
stat filename

7.2 创建链接

1
2
3
4
5
6
7
8
# 创建硬链接
ln source_file link_file

# 创建软链接
ln -s source_file link_file

# 强制创建软链接(覆盖已存在的链接)
ln -sf source_file link_file

7.3 删除链接

1
2
3
4
5
6
7
8
# 删除软链接(注意:不要加斜杠)
rm link_file

# 删除硬链接
rm link_file

# 删除源文件(硬链接仍然有效,软链接失效)
rm source_file

7.4 查找链接文件

1
2
3
4
5
6
7
8
# 查找所有软链接
find /path -type l

# 查找指向特定文件的链接
find /path -lname "target_file"

# 查找硬链接(通过inode)
find /path -inum inode_number

8. 实战练习

练习1: 创建和管理软链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1. 创建测试文件
echo "test" > /tmp/original.txt

# 2. 创建软链接
ln -s /tmp/original.txt /tmp/soft_link.txt

# 3. 查看软链接
ls -l /tmp/soft_link.txt

# 4. 通过软链接访问文件
cat /tmp/soft_link.txt

# 5. 删除源文件,观察软链接
rm /tmp/original.txt
cat /tmp/soft_link.txt # 应该失败

# 6. 恢复源文件,软链接自动恢复
echo "test" > /tmp/original.txt
cat /tmp/soft_link.txt # 应该成功

练习2: 创建和管理硬链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 1. 创建测试文件
echo "test" > /tmp/original.txt

# 2. 创建硬链接
ln /tmp/original.txt /tmp/hard_link.txt

# 3. 查看inode号(应该相同)
ls -i /tmp/original.txt /tmp/hard_link.txt

# 4. 查看硬链接计数
ls -l /tmp/original.txt # 应该显示2

# 5. 删除源文件,硬链接仍然有效
rm /tmp/original.txt
cat /tmp/hard_link.txt # 应该成功

# 6. 删除硬链接,文件真正删除
rm /tmp/hard_link.txt

练习3: 软件版本管理

1
2
3
4
5
6
7
8
9
10
11
# 1. 创建不同版本的目录
mkdir -p /opt/app/{v1.0,v2.0}

# 2. 创建当前版本软链接
ln -s /opt/app/v1.0 /opt/app/current

# 3. 升级到新版本
ln -sf /opt/app/v2.0 /opt/app/current

# 4. 验证
ls -l /opt/app/current