文件与目录类型
常见的文件类型
- 普通文件:最为常见的文件类型,包括纯文本文件(ASCII),二进制文件(binary),数据文件(data)等
- 目录:即文件夹,用于包含更多目录和文件
- 块设备文件:将硬盘、光盘等存储设备以文件形式供用户操作
- 字符设备文件:将串行端口的接口设备,如键盘、鼠标等以文件形式供用户操作
- 套接字文件:又称为数据接口文件,用于网络数据连接
- 管道文件:用于进程间的通讯
- 链接文件:分为硬链接和软链接,用于通过快捷方式或引用快速访问另一个文件或目录
Linux目录
指令集
- /bin Binaries的缩写,存放普通用户可使用的系统命令,如:ls
- /sbin Super user Binary的缩写,存放只有系统管理员才能使用的系统命令,如:shutdown、reboot
- /usr/bin 存放安装软件后,普通用户可以使用的软件命令,如:c++、make、wget等
- /usr/sbin 存放系统管理员用户安装使用的高级管理程序和系统服务程序,如:httpd、netconfig、tcpd等
系统文件
- /etc Etcetera(其他)的缩写,这个目录用来存放所有系统管理所需要的配置文件和子目录
- /var 存放一些经常被修改、扩充的文件,如各种日志文件
- /boot 存放引导启动Linux时使用的核心文件,如镜像文件等
- /sys Linux2.6内核新增的文件系统sysfs,sysfs文件系统集成了3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统
- /lib 存放系统所需要的动态链接库(如C++库),相当于windows的dll文件
- /dev Device的缩写, 将Linux主机的硬件以文件形式存储并提供访问,相当于Windows的设备管理器
- /usr/src 内核源代码、说明文档等默认放置目录
- /opt 默认为空,常用于安装额外软件
- /proc Processes(进程)的缩写,虚拟的目录,用于管理内存空间,是系统内存的映射,我们可以直接访问这个目录来获取系统信息。这个目录的内容不在硬盘上而是在内存里
- /selinux 全称为security-enhanced linux,该目录是 Redhat/CentOS 所特有的目录,是Redhat/CentOS的安全子系统
- /srv service缩写,存放一些服务启动后需要提取的数据
用户
- /root 系统管理员的账号主目录
- /home 存放普通用户的相关文件,Linux会在home目录下为每一个用户生成一个以用户账号命名的目录
- /usr Unix Software Resource(共享资源)的缩写,放置用户的应用程序和文件,类似于windows下的program files目录
- /usr/local 软件安装目录,一般通过源码编译安装方式安装的软件都会存放于该目录下
- /usr/include 放置如c/c++等程序语言的头文件(header)与包含档(include)
- /usr/lib 放置各应用软件的函式库、目标文件等,如果使用的是X86_64的Linux系统,则可能会生成/usr/lib64文件夹
外部文件
- /media 挂载U盘、光驱等设备的目录,类似于windows的其他设备
- /mnt 让用户挂载其他的文件系统,如将Windows上的某个目录挂载在/mnt下,可用于共享文件等
临时文件
- /lost+found 一般情况下为空目录,用于存放系统非法关机或者发生意外错误后,fsck(磁盘修复)过程修复的部分文件
- /tmp 用于存放临时文件
- /run 一个临时文件系统,存放存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。
文件系统
简介
与Windows不同,Linux在路径中不使用驱动器盘符。Windows将物理磁盘驱动器分为盘符(如C盘、D盘),每个盘都会有自己的目录结构,并通过诸如C:\Users\ Administrator \Documents等方式访问文件。
Linux则采用了一种不同的方式,Linux内核采用虚拟文件系统(Virtual File System,VFS),内核将所有安装在PC上的存储设备的文件纳入单个目录结构中,这个目录被称为虚拟目录(virtual directory)。Linux虚拟目录结构只包含一个称为根(root)目录的基础目录。根目录下的目录和文件会按照访问它们的目录路径一一列出,并使用正斜线 /(windows使用反斜线\)来做路径划分。
Linux文件系统结构是从Unix文件结构演进过来的,并遵守文件系统层级标准(filesystem hierarchy standard,FHS),它确定了Linux系统中每个目录的用途和应该包含的内容,并保证不同Linux发行版之间的文件布局是一致的
Linux内核支持通过不同类型的文件系统从硬盘中读写数据。除了自有的诸多文件系统外,Linux还支持从其他操作系统(比如Windows)采用的文件系统中读写数据,但内核必须在编译时加入对所有可能用到的文件系统的支持,以下为Linux系统用来读写数据的标准文件系统
文件系统 | 说明 |
---|---|
ext | Linux扩展文件系统,最早的Linux文件系统 |
ext2 | 第二代扩展文件系统,在ext的基础上提供了更多的功能 |
ext3 | 第三代扩展文件系统,支持日志功能 |
ext4 | 第四代扩展文件系统(Fourth Extended File System),支持高级日志功能,目前Linux主流的文件系统 |
tmpfs | 一种临时文件系统,常见于类Unix操作系统,使用内存(RAM)作为文件存储区,适合需要高速读写和不需要持久存储的数据情况 |
devtmpfs | 临时设备文件系统,常见于类Unix操作系统,该文件系统会在内存中创建一个区域,用于管理/dev目录下的设备文件,方便动态管理硬盘、网络接口、终端等物理设备,可以简化设备管理,提高系统启动速度 |
FAT16 | 用于微软的ms-dos操作系统,Windows最初是作为MS-DOS的一个图形用户界面(GUI)扩展而开发的,但随着技术的进步,Windows操作系统逐渐发展成一个独立的操作系统,从Windows NT 4.0 开始,Windows不再依赖于MS-DOS |
VFAT | FAT32的扩展版本,在FAT32的基础上加入了长文件名支持功能,名称上实际仍称为FAT32。FAT32是windows98等旧版本windows的主要文件系统,现在广泛用于相机SD卡、U盘等,最大支持的单个文件大小为4GB,最大分区大小为2TB |
NTFS | 全称为New Technology File System,目前windows主要使用的高级文件系统,广泛用于windows7、10,支持数据加密,文件权限控制,日志记录与恢复等功能,最大支持的单个文件大小为16TB(取决于分区大小),分区大小可达到256TB或更高 |
hpfs | OS/2高性能文件系统 |
jfs | IBM日志文件系统 |
iso9660 | 标准CD-ROM文件系统,主要用于CD |
minix | MINIX文件系统 |
ncp | Netware文件系统 |
nfs | 网络文件系统 |
proc | 访问系统信息 |
ReiserFS | 高级Linux文件系统,能提供更好的性能和硬盘恢复功能 |
smb | 支持网络访问的Samba SMB文件系统 |
sysv | 较早期的Unix文件系统 |
ufs | BSD文件系统 |
umsdos | 建立在msdos上的类Unix文件系统 |
XFS | 高性能64位日志文件系统 |
文件系统的架构
Linux 文件系统采用了层次化的设计,通常分为以下几层:
- 虚拟文件系统(Virtual File System,VFS):虚拟文件系统是操作系统内核的一部分,它为不同类型的文件系统提供了统一的接口,屏蔽了底层文件系统的差异性,使Linux能够同时挂载各种文件系统
- 实际文件系统(File System Implementation Layer):该层实现了具体的文件系统,如 ext4、XFS、Btrfs、FAT32 等,每种文件系统都有其独特的数据结构和实现方式,但它们都通过 VFS 提供一致的接口,向上层应用程序隐藏具体细节
- 存储设备层(Storage Device Layer):该层包括实际的存储设备(如 HDD、SSD、USB 闪存盘等)及其驱动程序,管理设备的物理 I/O 操作。文件系统将逻辑数据映射到这些物理设备上,通过块设备接口(如 /dev/sda)来访问硬盘的块(block)数据
Linux文件系统都有以下几个重要组成部分:
- 超级块(Superblock):超级块包含了文件系统的元数据,比如文件系统的大小、块大小、inode 数量、已用和可用的 inode 及数据块等信息。超级块是文件系统的控制信息,通常被加载到内存中,用于文件系统的管理和访问。
- 索引节点(Inode):Inode是每个文件或目录的描述符,每个文件都有唯一的inode标识符,在文件系统中,文件通过inode号来唯一标识,inode包含文件的元数据,如:
- 文件类型(普通文件、目录、符号链接等)
- 文件大小
- 所有者(用户 ID 和组 ID)
- 访问权限(读、写、执行)
- 时间戳(创建时间、修改时间、访问时间)
- 指向数据块的指针
- 数据块(Data Block):数据块是文件的实际内容存储区域。每个数据块大小通常为4KB,文件系统通过 inode 中的指针(direct 和 indirect pointers)来定位文件的数据块
- 目录(Directory):目录是一种特殊类型的文件,它包含了其他文件或子目录的列表。每个目录项包含文件名和对应的inode号。当用户查找一个文件时,系统会先根据目录文件中的inode号找到对应的 inode,再通过inode中的指针找到数据块。
- 日志(Journaling):大多数现代Linux文件系统(如 ext3、ext4、XFS)都使用日志机制来提高数据可靠性。日志记录文件系统中所有的元数据变化操作,确保在系统崩溃或突然断电时,可以通过重播日志恢复文件系统的完整性。
文件系统的工作
- 文件查找: 当用户要访问某个文件时(如 /home/user/file.txt),系统会按照以下步骤进行查找:
- 从根目录 / 开始,找到 home 目录的 inode。
- 根据 home 目录 inode 中的数据块指针,找到 user 目录的 inode。
- 最终找到 file.txt 的 inode,然后通过该 inode 访问文件的数据块。
- 文件读操作: 当文件被读取时(例如使用 cat 命令),系统会:
- 根据目录结构找到文件的 inode。
- 读取 inode 中指向的数据块指针。
- 从数据块中读取文件内容,并将其返回给用户。
- 文件写操作: 当文件被修改或创建时(例如使用 echo 命令),系统会:
- 为新文件分配一个 inode,设置文件的元数据(所有者、权限等)。
- 分配新的数据块,并写入文件内容。
- 更新 inode 中的指针,使其指向新的数据块。
- 更新文件系统的超级块信息(例如可用 inode 和数据块数量)。
- 元数据更新和日志记录:为了防止数据丢失,文件系统通常会先将元数据更新写入到日志区域中,然后再进行实际操作。这种机制被称为 “Write Ahead Logging”。在日志写入成功后,再进行实际的文件写操作,确保在系统故障时能够快速恢复文件系统。
文件的信息
时间信息
在 Linux 系统中,文件的时间戳主要包括以下三种类型:
- 访问时间(Access Time,atime):文件上次被读取的时间,使用cat、less、head等命令读取文件内容,或通过bash script.sh执行脚本文件,都会更新atime。但认情况下,为了提升性能,大多数 Linux 文件系统(如 ext4)会使用relatime挂载选项,这意味着只有在 atime 比 mtime 或 ctime 旧时,atime 才会更新。因此,某些文件访问操作不会立即反映到atime中
- 修改时间(Modification Time,mtime):文件内容上次被修改的时间,通过echo、vim、nano和重定向符修改文件内容都会更新mtime
- 更改时间(Change Time,ctime):文件的元数据(如权限、所有者、文件名等文件属性)上次被更改的时间,通过chmod、chown、chattr修改文件属性,使用mv命令移动、重命名文件都会更新ctime,使用vim,nano修改文件时,编辑器可能会创建临时文件,并使用新文件覆盖原文件,也会更新ctime
- 创建时间(Birth Time或Creation Time,btime):表示文件首次被创建时的时间,这是一个教新引入的时间戳,因此,一些传统的文件系统不支持该时间戳,一些新的文件系统(如 ext4)也默认不保存创建时间,需要特定文件系统(如 btrfs)或内核版本支持才可以查看
df查看文件系统空间使用情况
GNU提示:df命令仅安装在拥有挂载表的系统上,因此跨平台可移植脚本不应该依赖该命令
df [参数] [挂载点]
- 默认情况下,命令会输出所有当前已挂载文件系统的信息
- -a 显示所有文件系统信息,包括特殊文件系统,这些文件系统通常无法直接访问,因此默认不显示
- -h 将磁盘大小单位换算为KB、MB等单位,以1024作为基数进行换算
- -H 等价于--si选项,换算单位为K、M等单位,以1000作为基数进行换算
- -m 以MB为单位显示容量
- -k 以KB为单位显示容量,默认值
- -T 显示文件系统类型
- -i 列出 inode 使用情况信息,而不是块使用情况
- -l 只列出本地文件系统,默认情况下还会列出远程文件系统
- --output=项目:只列出指定项目,指定多个项目可以用逗号分隔(如--output=source,target),接收的参数有:source(挂载来源,通常是设备)、target(挂载点)、fstype(文件系统类型)、itotal(inode总数)、iused(已用inode数量)、iavail(可用inode数量)、ipcent(iused除以 itotal的百分比)、size(块总数)、used(已使用的块数)、avail(可用的块数)、pcent(used除以size)、file(文件名,需要在命令行指定)
- -t 文件系统:只显示某个文件系统的信息,可以指定多个-t选项
du显示目录或文件大小
通过df命令发现磁盘空间快满时,可以通过du命令查看是哪些文件占用了较大的存储空间
du [参数] [目录或文件名]…
- 默认情况下,命令会显示当前目录中每个子目录的磁盘块占用数量,并在最后一行输出当前目录总占用数量,该行为会递归进行,即会打印子目录的后代子目录信息,它会以磁盘块为单位来表明每个文件或目录占用了多大存储空间
- -a 打印每个子目录以及子文件的大小
- -h 将文件大小单位换算为K、M等单位
- -k 以K为单位打印占用空间
- -m 以M为单位打印占用空间
- -c 在处理完所有文件后,打印总计
- -s 只统计总大小,不列出子目录和文件
- -d 值depth:只从当前目录向下统计depth层(文件的层次结构),当前目录为第0层
- --inodes 列出inode的使用情况,而不是块使用情况
- -L 显示链接指向的文件或目录的所占用空间大小,而不是链接文件本身
- -t 值:如果给定的值为正数,则只打印大于等于该值的目录或文件信息,如果值为负数,则只打印小于等于该值的目录或文件,这里的值可以使用kB、k、KiB等单位
- --time:打印文件或目录的上一次内容修改时间mtime
- --time=ctime:打印文件或目录上一次属性修改时间ctime
- --time=atime:打印文件或目录上一次访问时间atime
- --exclude=正则pattern:递归统计时,跳过与pattern匹配的子目录或文件,如du --exclude=’*.o’ 排除以.o结尾的文件
- -X 文件名:从该文件中获取需要排除的文件或目录,每一行表示一个或一类文件,可以使用正则表达式,如果文件名为-,表示从标准输入获取
文件系统修复
fsck [参数] 分区设备名
- -a 不显示用户提示,自动修复文件系统
- -y 功能同-a,部分文件系统仅支持-y
文件系统挂载与卸载
Linux文件系统将所有的磁盘都并入一个虚拟目录下。在使用新的存储媒体之前(如载入U盘等),需要把它放到虚拟目录下,这个步骤称为挂载(mounting)
查询挂载信息
mount显示已经挂载的设备
- -l显示卷标
自动挂载
在桌面版Linux中,默认会自动挂载设备,也可以通过命令完成自动挂载,自动挂载会根据文件/etc/fstab中指定的文件系统完成挂载
mount -a根据配置文件 /etc/fstab 自动挂载
- -a 挂载所有未挂载的文件系统
- -aF 会同时挂载所有文件系统
- -aO 可以在/etc/fstab中为某个文件系统指定特定的挂载选项,并应用这些选项
手动挂载
mount [-t 文件系统] [-L 卷标名] [-o 特殊选项] 设备文件名 挂载点
- -t 文件系统:挂载指定文件系统,如 ext4、iso9660
- -L 卷标名:自定义卷标的名字
- -f 模拟挂载设备,但并不真的挂载
- -s 忽略该文件系统不支持的挂载选项
- -r 将设备挂载为只读的
- -w 将设备挂载为可读写的(默认参数)
- -v 详细模式,详细说明挂在设备的每一步
- -n 挂载设备,但不注册到/etc/mtab已挂载设备文件中
- -s 忽略该文件系统不支持的挂载选项
- -o 特殊选项:指定挂载的额外选项,以下是几个常用的选项:
参数 | 说明 |
---|---|
ro | 以只读方式挂载, |
rw | 以可读写方式挂载 |
user/nouser | 是否允许普通用户挂载文件系统,默认为不允许 |
check=none | 挂载文件系统时不进行完整性校验 |
loop | 挂载一个文件 |
atime/noatime | 访问分区文件时是否更新文件访问时间 |
exec/noexec | 是否允许文件系统中的可执行程序可以运行,默认为exec允许 |
remount | 重挂载已经挂载的文件系统,一般用于修改特殊权限后重挂载 |
硬件设备文件名
通过文件名可以判断该设备文件对应的设备,以下说常用的设备文件名
硬件 | 设备文件名 |
---|---|
IDE硬盘 | /dev/hd[a-d] |
SCSI/SATA/USB硬盘 | /dev/sd[a-p] |
光驱 | /dev/cdrom 或 /dev/sr0 |
软盘 | /dev/fd[0-1] |
打印机(25针) | /dev/lp[0-2] |
打印机(USB) | /dev/usb/lp[0-15] |
鼠标 | /dev/mouse |
挂载光盘
为方便文件查找,一般将光盘挂载于根目录下的 /media ,U盘挂载于/mnt目录下,iso9660为光盘默认文件系统,因此-t iso9660 可以省略
mount -t iso9660 /dev/cdrom /media
挂载U盘
fdisk -l查看U盘设备文件名
mount -t 文件系统 /dev/U盘设备文件名 /mnt
linux默认不支持NTFS文件系统(大部分移动硬盘设备使用NTFS文件系统),但可以通过插件提供支持
卸载设备
注意,如果有任何程序正在使用设备上的文件,系统就不允许卸载,而是会提示 device is busy,注意命令不是un开头,没有n
umount 设备文件名或挂载点目录名卸载设备
如果在卸载设备时,系统提示设备繁忙,无法卸载设备,通常是有进程还在访问该设备或使用该设备上的文件。这时可用lsof命令获得使用它的进程信息,然后在应用中停止使用该设备或停止该进程。如:lsof /path/to/device/node,或者lsof /path/to/mount/point
压缩与解压缩
文件的压缩与解压(.gz格式)
.gz是GNU gzip软件的压缩格式,与windows不同,下述命令只能压缩与解压缩文件,不能处理文件夹,并且压缩完只保留压缩文件,不保留原文件
- gzip 文件名 压缩(GUN zip)
- gunzip 文件名 解压缩(GUN unzip)
- gzcat 文件名 原来查看压缩过的文本文件内容
文件的打包、压缩与解压(.tar.gz格式)
打包与压缩
tar命令用于文件的归档打包,它将指定的文件或目录以指定的方式进行组织和存储,包括文件的权限、所有者、时间戳等信息,并打包成一个单独的文件,打包后的文件格式一般为.tar,打包后的文件可以用gzip命令压缩,生成.tar.gz(或.tgz)格式的压缩包文件,tar命令也支持直接将文件重定向给gzip命令,一次性完成打包、压缩操作,打包压缩后的文件名可以不写.tar.gz等后缀,但不方便用户识别
tar [参数] [打包后文件名] [打包文件/目录] 打包文件或目录
- -c(--create) 打包为一个新的归档文件
- -z 将输出重定向给gzip命令,即打包后压缩(需要和-c等参数一起使用)
- -r(--append) 追加文件到已有tar归档文件末尾
- -A(--concatenate) 将一个已有tar归档文件追加到另一个已有tar归档文件
- -d(--diff) 检查该文件和其在归档文件中的不同之处,如果被修改则标记为changed,被删除标记为deleted,该文件未被打包到归档文件中则标记为added
- --delete 从已有tar归档文件中删除
- -u(--update) 将比tar归档文件中已有的同名文件新的文件追加到该tar归档文件中
- -p 保留所有文件权限
- -v 显示详细信息
- -t(--list) 列出已有tar归档文件的内容
- -f 指定文件名(该参数必须)
解压
tar [参数] [解压缩的文件]
- -x 解包,提取文件
- -v 显示详细信息
- -f 指定解压缩的文件(该参数必须)
- -z 解包后解压缩(需要和x参数一起使用)
最常用的是解压一个.tar.gz文件,因此大多数情况下-zxf为必用参数
示例: # tar -zxvf test.tar.gz 解压缩test.tar.gz文件,并显示详细信息
.zip格式的压缩与解压
zip [选项] [-r] [压缩后文件名] [压缩文件或目录]
- -r 压缩目录
.zip格式为Linux和windows通用格式,zip命令会保留原文件,并且一个命令就可以处理文件与文件夹
unzip [解压的文件名]
解压文件
.bz2、.tar.bz2格式的压缩与解压
1. 压缩
对文件(格式为.bz2)
bzip2 [参数] [-k][文件]
- -k 压缩后保留原文件
对文件夹(格式为.tar.bz2)
tar -jcf [压缩后文件名] [压缩目录]
即将tar中的z参数改为j参数就是压缩为.tar.bz2格式
2. 解压
对文件(格式为.bz2)
bunzip2 [-k] [解压文件]
- -k 解压缩后保留原文件
对文件夹(格式为.tar.bz2)
tar -jxf [解压文件]
同样将tar中的z参数改为j参数就是解压.tar.bz2格式