一切皆是文件”是Unix/Linux 的基本哲学之一。

概念性的理论偏多,面试常问...
首先需要了解的就是,我们要对文件做些什么事情?
其实无非就是对一个文件进行、创建、复制、移动、查看、编辑、压缩、查找、删除、等等
既然linux系统里面,所有的都是文件,那么数百万,甚至数千万个文件应该如何保存,以及如何查看和管理,就需要一个专门的体系结构来帮助我们去处理,而这就是文件系统的作用。
Linux文件系统是Linux操作系统中用于管理和存储文件及目录的一套机制,它决定了文件在存储设备或分区上的文件的方法和数据结构,并提供用户交互接口,从而实现文件的存储、检索、保护、压缩、加密等功能。
为了方便了解linux的文件系统,将文件系统拆分成两部分:
操作系统用于组织和存储文件及数据的方法和数据结构。它定义了数据如何在存储设备(如硬盘)上被组 织、命名、访问和修改
可以理解为操作系统中与文件管理相关的所有功能和工具的集合;


🐱 ll /home/总用量 0drwx------. 2 fpaopao fpaopao 76 3月 13 16:42 fpaopao//例如我创建了一个用户,以这个用户账号命名🐱 useradd fpaopao001🐱 ll /home/总用量 0drwx------. 2 fpaopao fpaopao 76 3月 13 16:42 fpaopaodrwx------ 2 fpaopao001 fpaopao001 76 6月 16 19:49 fpaopao001🐱 ll /root/总用量 4-rw-------. 1 root root 1266 3月 13 16:43 anaconda-ks.cfg//普通用户无法进入该目录🐱 su - fpaopao[fpaopao@Rocky9 ~]$ id用户id=1000(fpaopao) 组id=1000(fpaopao) 组=1000(fpaopao)[fpaopao@Rocky9 ~]$ cd /root/-bash: cd: /root/: 权限不够
//比如SSH的配置文件🐱 ll /etc/ssh/sshd_config-rw-------. 1 root root 3667 12月 18 03:56 /etc/ssh/sshd_config🐱 ll /etc/hostname-rw-r--r--. 1 root root 11 3月 13 16:42 /etc/hostname
🐱 ll /liblrwxrwxrwx. 1 root root 7 11月 3 2024 /lib -> usr/lib🐱 ll /lib64lrwxrwxrwx. 1 root root 9 11月 3 2024 /lib64 -> usr/lib64//比如ls 命令,是依赖这些库文件的,它们不会自己写 “读取硬盘文件” 的代码,会调用系统自带的 shturl.(C 标准库)🐱 ldd /bin/ls linux-vdso.so.1 (0x00007ffd36ffb000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007feafe8cd000) libcap.so.2 => /lib64/libcap.so.2 (0x00007feafe8c3000) libc.so.6 => /lib64/libc.so.6 (0x00007feafe600000) libpcre2-8.so.0 => /lib64/libpcre2-8.so.0 (0x00007feafe827000) /lib64/ld-linux-x86-64.so.2 (0x00007feafe928000)
🐱 ls /sys/block bus class dev devices firmware fs hypervisor kernel module power🐱 ls /sys/fs/bpf cgroup fuse pstore selinux xfs
//这两个文件基本上都是同一个目录,软链接[fpaopao@Rocky9 ~]$ ll /sbinlrwxrwxrwx. 1 root root 8 11月 3 2024 /sbin -> usr/sbin[fpaopao@Rocky9 ~]$ ll /binlrwxrwxrwx. 1 root root 7 11月 3 2024 /bin -> usr/bin

//通过读取这个文件,可以看到内存,Cpu的信息,需要借助命令来查看;🐱 ll /proc/ioports-r--r--r-- 1 root root 0 6月 16 20:23 /proc/ioports🐱 ll /proc/cpuinfo-r--r--r-- 1 root root 0 6月 16 18:16 /proc/cpuinfo//容量比较大🐱 du -sh /var/276M /var///比如登陆SSH后,观察这文件🐱 ll /var/log/secure-rw------- 1 root root 2487 6月 16 20:43 /var/log/secure

其中有几个重要目录需要记住://黑洞目录🐱 ll /dev/nullcrw-rw-rw- 1 root root 1, 3 6月 16 18:17 /dev/null//摇钱树,取数据🐱 ll /dev/zerocrw-rw-rw- 1 root root 1, 5 6月 16 18:17 /dev/zero//用法: 生成一个大文件🐱 cd /tmp🐱 dd if=/dev/zero of=/tmp/datatest count=1025M bs=1🐱 ls -l总用量 1049600-rw-r--r-- 1 root root 1074790400 6月 16 20:12 datatest //是不是很大//生成随机数,一般用来做验证码和创建密码等;🐱 ll /dev/randomcrw-rw-rw- 1 root root 1, 8 6月 16 18:17 /dev/random//比如定义一个变量🐱 echo${RANDOM}22311🐱 echo${RANDOM}22127🐱 echo${RANDOM}5079🐱 echo${RANDOM}624

//早期挂载光盘用的,而且是个 空文件🐱 ll /media/总用量 0//挂载光盘,空目录🐱 ll /mnt总用量 0drwxr-xr-x. 2 root root 6 3月 13 16:35 hgfs //hgfs 是 VMware 独家开发的专用文件共享驱动,只给 VMware 虚拟机用。/第三方厂商,空目录🐱 ll /opt总用量 0//背景为绿色,谁创建的文件,谁才能删除🐱 ls /tmpdatatest systemd-private-c78c62899acd48f3a2d662859420ec4c-irqbalance.service-BydxSSsystemd-private-c78c62899acd48f3a2d662859420ec4c-bluetooth.service-eAdzJf systemd-private-c78c62899acd48f3a2d662859420ec4c-kdump.service-E8ubresystemd-private-c78c62899acd48f3a2d662859420ec4c-chronyd.service-3e0LO1 systemd-private-c78c62899acd48f3a2d662859420ec4c-systemd-logind.service-6b2RCosystemd-private-c78c62899acd48f3a2d662859420ec4c-dbus-broker.service-psasAd根据文件存储的格式、存储文件的额外功能、适用场景的不同,文件系统划分为了很多类型;



1. FAT(File Allocation Table)文件系统
2. NTFS(New Technology File System)文件系统
3. ext4
4. HFS+和APFS HFS+和APFS(Apple File System)
5. XFS (eXtended File System)
6. Btrfs(B-tree File System)
7. ZFS(Z File System)
8. Swap
1. 普通文件(Regular Files):
这是最常见的文件类型,包含文本、数据、程序代码等。
可以使用cat、less、more等命令来查看内容,使用cp、mv、rm等命令来管理。
2.目录文件(Directories):
目录用于存储其他文件的路径名和相关信息,被视为一种特殊的文件。
可以使用mkdir、rmdir来创建和删除目录,使用cd命令来切换当前工作目录。
3. 链接文件(Links):
硬链接指向文件的inode节点,允许多个文件名与同一个文件关联。(同个文件使用多个文件名)
//创建硬链接,可以看到inode号是一样的,文件也会同步✨ root@Rocky9[:/tmp/test01 🚀 $ ln 2.jar 123.jar✨ root@Rocky9[:/tmp/test01 🚀 $ ll -i 2.jar 123.jar67240364 -rw-r--r-- 2 root root 0 6月 17 09:54 123.jar67240364 -rw-r--r-- 2 root root 0 6月 17 09:54 2.jar//但是不支持创建目录,和跨分区操作✨ root@Rocky9[:/tmp/test01 🚀 $ ln 1.txt/ /tmp/2.jarln: 1.txt/: 不允许将硬链接指向目录
软链接是一个特殊的文件,它指向另一个文件或目录的路径,可以跨文件系统。(类似windows快捷方式),它一般用作版本升级,回退等;
//软链接的背后原理就是 通过inode指向block✨ root@Rocky9[:/tmp/test01 🚀 $ ll-rw-r--r-- 1 root root 0 6月 17 09:54 1.jar✨ root@Rocky9[:/tmp/test01 🚀 $ ln -s 1.jar update.jar//再次查看,软链接文件的指向lrwxrwxrwx 1 root root 5 6月 17 12:47 update.jar -> 1.jar//并且inode编号是不一样的,修改软链接文件,是同步的✨ root@Rocky9[:/tmp/test01 🚀 $ ll -i 67240353 -rw-r--r-- 1 root root 0 6月 17 09:54 1.jar 67240368 lrwxrwxrwx 1 root root 5 6月 17 12:47 update.jar -> 1.jar//软链接结合sed -i结合遇到的问题,文件修改竟然没同步,并且软连接实效✨ root@Rocky9[:/tmp/test01 🚀 $ echo 111222 > r110.txt✨ root@Rocky9[:/tmp/test01 🚀 $ ln -s r110.txt r.txt✨ root@Rocky9[:/tmp/test01 🚀 $ ls -llrwxrwxrwx 1 root root 8 6月 17 13:03 r.txt -> r110.txt✨ root@Rocky9[:/tmp/test01 🚀 $ sed -i 's#222#333#' r.txt✨ root@Rocky9[:/tmp/test01 🚀 $ cat r.txt111333✨ root@Rocky9[:/tmp/test01 🚀 $ cat r110.txt111222

4. 特殊文件(Special Files):
特殊文件主要指的是设备文件,它们通常位于/dev目录下。
设备文件分为块设备文件(block devices)和字符设备文件(character devices)。
块设备文件以块为单位进行读写,如硬盘、光驱等;以4k的空间批量方式随机操作。
字符设备文件以字符为单位进行读写,如键盘、鼠标等。以字符的方式按顺序操作
5. 可执行文件(Executable Files):
可执行文件是包含程序代码的文件,可以被操作系统直接执行。
在Linux中,可执行文件通常需要具有执行权限(x)。
6. 其他文件:
除了上述几种类型外,Linux系统中还可能存在其他类型的文件,
如管道文件(pipe files,显示为青黄色),管道文件主要用于进程间通讯。
套接字文件(socket files,有时显示为粉红色),用于进程间的网络通信,也可以用于本机之间的非 网络通信。
//比如特殊文件中的字符设备✨ root@Rocky9[:/ 🚀 $ ll /dev/tty1crw--w---- 1 root tty 4, 1 6月 17 09:32 /dev/tty1

在Linux系统中,文件类型以及它们的颜色标识是用户与系统交互时的重要元素,它们帮助用户快速识别 和理解文件或目录的性质。
一般情况下,文件有两部分组成:
那么用颜色区别不同文件类型,在rokcy中可以看到文件颜色背后的文件的支持;
Linux系统中的文件颜色标识是通过ls命令的别名或环境变量(如LS_COLORS)来设置的。不同的颜 色和样式(如加粗、闪烁)用于区分不同类型的文件。常见的颜色标识包括:

mkdir /data/file_type -ptouch /data/file_type/file.txttouch /data/file_type/file1mkdir /data/file_type/directory/dir1/dir2 -pln -sv /data/file_type/file.txt /data/file_type/file_linkln -sv /data/file_type/file1 /data/file_type/file1_linkrm -f /data/file_type/file1cp -a /dev/autofs /data/file_typecp -a /dev/mqueue /data/file_type/cp /usr/share/man/man1/od.1.gz /data/file_type/cp /usr/bin/ls /data/file_type/cp -a /var/run/mcelog-client /data/file_type/cp -a /run/dmeventd-client /data/file_type/
注意: 不同文件后缀的颜色控制,可以查看 /etc/DIR_COLORS 文件中,修改后需要账号退出,重新登 录后生效。
✨ root@Rocky9[:/ 🚀 $ ll /etc/DIR_COLORS-rw-r--r--. 1 root root 4673 1月 17 11:07 /etc/DIR_COLORS✨ root@Rocky9[:/ 🚀 $举例两个两命令
file 命令是一个在 Unix 和类 Unix 系统中常用的命令行工具,用于确定给定文件的类型。它可以基 于文件的内容(而不是文件扩展名)来猜测文件的类型,包括文本文件、图像文件、可执行文件、压缩文件等。
file 命令非常有用,因为它提供了对文件内容的直接洞察,而不仅仅是依赖文件扩展名或文件属性。
//比如,查看了ls的信息,这是一个可执行的命令文件,不能直接通过后缀名来判断文件类型信息,linux是不区分后缀的,但是实际工作中,会标注文件的后缀,大大方便了观察文件类型✨ root@Rocky9[:/ 🚀 $ file /bin/ls/bin/ls: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=1be20c59ffcc5d3c0e500c224df239ba42db406e, for GNU/Linux 3.2.0, stripped
stat 命令是 Linux 系统中的一个非常有用的工具,用于显示文件或文件系统的状态信息。它提供了比 ls 命令更详细的信息,包括文件的访问时间、修改时间、更改时间、文件大小、权限、所有者等。


正因为在磁盘上存储和读取数据非常的繁琐,所以需要一套规则来规划信息如何存取,而这套规则就是 文件系统。
我们之前所说的目录结构和路径的问题,其实是在逻辑层面,也就是能用眼睛看到的层面,去找到我们需 要的文件。
文件本质上是保存到磁盘里面,所以如何去磁盘里面找到对应的文件,这就是如何存储文件所涉及到的内容了~


我们找数据,肯定是从大范围方向确定,然后从小范围去定位查询。根据上面我们对于磁盘的结构了解, 大范围肯定是柱面,小范围是簇,再具体点就是扇区,然后就找到真实的数据了。
换一种说法,就是 我们先去某个 系统分区【柱面】上,然后再去文件系统【簇】中,最后到具体的目录 【扇区】里,最后就找到这个具体的文件了。
所谓的系统分区,在一个物理磁盘上面划分了多个逻辑的磁盘空间。
在windows系统里面就是各个盘 在linux系统里面就是,将物理盘的这些分区盘关联到一个目录里面


常见存储设备


在Linux中,我们通过解析路径,根据沿途的目录文件来找到某个文件。 (注意之前学到的链接文件)


不同OS内部,对于文件内的处理格式方面有细微的差异,有可能呢过导致文件无法运行;
Windows创建的txt文件在Linux系统中无法直接使用,主要是由于两个系统在处理文本文件时存在的一 些格式差异,尤其是换行符的差异。


换行符差异:
可以使用cat 和 hexdump
hexdump是一个在 Unix 和类 Unix 系统(如 Linux)中常用的命令,用于以十六进制和 ASCII 码 的形式显示文件的内容。它属于系统工具级别的命令。
hexdump命令主要用于系统管理、调试、数据分析以及对二进制文件的查看和处理等工作。例如,系统管 理员可能会用它来检查系统日志文件的原始内容,开发人员可能会用它来分析程序生成的二进制数据文件,以查找可能存在的错误或异常

不同OS内部,对于文件内的处理格式方面有细微的差异,有可能呢过导致文件无法运行;
dos2unix是一个在Linux系统中广泛使用的命令行工具,主要用于将Windows风格的文本文件格式转换 为Unix/Linux风格的文本文件格式,从而解决在不同操作系统之间传输文本文件时可能出现的格式不兼容问 题。。
文件编码差异
虽然txt文件通常是纯文本文件,不涉及复杂的编码问题,但仍有可能因为编码不一致(如Windows常用 的GBK、GB2312编码与Linux常用的UTF-8编码)而导致在Linux系统中显示乱码或处理错误。不过,这种情 、况相对较少见,因为现代操作系统和文本编辑器大多支持多种编码格式。
✨ root@Rocky9[:/data/file_type 🚀 $ whereis dos2unixdos2unix://未安装的安装该命令✨ root@Rocky9[:/data/file_type 🚀 $ yum install dos2unix✨ root@Rocky9[:/data/file_type 🚀 $ which dos2unix/usr/bin/dos2unix✨ root@Rocky9[:/data/file_type 🚀 $ cp windows.txt windows.txt.bak✨ root@Rocky9[:/data/file_type 🚀 $ hexdump windows.txt0000000 6966 656c 7974 65700000008//开始转换✨ root@Rocky9[:/data/file_type 🚀 $ dos2unix windows.txtdos2unix: converting file windows.txt to Unix format...//转换之后,格式发生了变化✨ root@Rocky9[:/data/file_type 🚀 $ hexdump -C windows.txt00000000 66 69 6c 65 74 79 70 65 |filetype|00000008