自学Linux Shell1.3-Linux文件系统

点击返回 自学Linux命令行与Shell脚本之路html

1.3-Linux文件系统

文件系统是文件存放在磁盘等存储设备上的组织方法。Linux系统能支持多种目前流行的文件系统,如EXT二、 EXT三、 FAT、 FAT3二、 VFAT和ISO9660。node

1. 文件类型概述

1.1 Linux下面的文件类型主要有:

  • 普通文件:C语言元代码、SHELL脚本、二进制的可执行文件等。分为纯文本和二进制。
  • 目录文件:目录,存储文件的惟一地方。
  • 连接文件:指向同一个文件或目录的的文件。
  • 设备文件:与系统外设相关的,一般在/dev下面。分为块设备和字符设备。
  • 管道(FIFO)文件 :  提供进程建通讯的一种方式
  • 套接字(socket) 文件: 该文件类型与网络通讯有关

文件系统指文件存在的物理空间,linux系统中每一个分区都是一个文件系统,都有本身的目录层次结构。linux会将这些分属不一样分区的、单独的文件系统按必定的方式造成一个系统的总的目录层次结构。一个操做系统的运行离不开对文件的操做,所以必然要拥有并维护本身的文件系统。linux

  • ext2 : 早期linux中经常使用的文件系统
  • ext3 : ext2的升级版,带日志功能
  • ext3 : ext3的升级版,带高级日志功能
  • RAMFS : 内存文件系统,速度很快
  • NFS : 网络文件系统,由SUN发明,主要用于远程文件共享
  • MS-DOS : MS-DOS文件系统
  • VFAT : Windows 95/98 操做系统采用的文件系统
  • FAT : Windows XP 操做系统采用的文件系统
  • NTFS: Windows NT/XP 操做系统采用的文件系统
  • HPFS : OS/2 操做系统采用的文件系统
  • PROC : 虚拟的进程文件系统
  • ISO9660 : 大部分光盘所采用的文件系统
  • ufsSun : OS 所采用的文件系统
  • NCPFS : Novell 服务器所采用的文件系统
  • SMBFS : Samba 的共享文件系统
  • XFS : 由SGI开发的先进的日志文件系统,支持超大容量文件
  • JFS :IBM的AIX使用的日志文件系统
  • ReiserFS : 基于平衡树结构的文件系统
  • udf: 可擦写的数据光盘文件系统

1.2 文件系统特性:

磁盘分区完毕后还须要进行格式化(format),以后操做系统才可以使用这个分区。 格式化的目的是能使操做系统可使用的文件系统格式(即咱们上面提到文件系统类型).ubuntu

每种操做系统可以使用的文件系统并不相同. 如windows 98 之前的微软操做系统主要利用的文件系统是 FAT (或 FAT16),windows 2000 之后的版本有所谓的 NTFS 文件系统,至于 Linux 的正统文件系统则为 Ext2 (Linux second extended file system, ext2fs)这一个。此外,在默认的状况下,windows 操做系统是不会认识 Linux 的 Ext2 的。windows

传统的磁盘与文件系统之应用中,一个分区就是只可以被格式化成为一个文件系统,因此咱们能够说一个 filesystem 就是一个 partition。可是因为新技术的利用,例如咱们常听到的LVM与软件磁盘阵列(software raid), 这些技术能够将一个分区格式化为多个文件系统(例如LVM),也可以将多个分区合成一个文件系统(LVM, RAID)! 因此说,目前咱们在格式化时已经再也不说成针对 partition 来格式化了, 一般咱们能够称呼一个可被挂载的数据为一个文件系统而不是一个分区喔!缓存

那么文件系统是如何运行的呢?这与操做系统的文件数据有关。较新的操做系统的文件数据除了文件实际内容外, 一般含有很是多的属性,例如 Linux 操做系统的文件权限(rwx)与文件属性(拥有者、群组、时间参数等)。 文件系统一般会将这两部份的数据分别存放在不一样的区块,权限与属性放置到 inode 中,至于实际数据则放置到 data block 区块中。 另外,还有一个超级区块 (superblock) 会记录整个文件系统的总体信息,包括 inode 与 block 的总量、使用量、剩余量等。服务器

对于一个磁盘分区来讲,在被指定为相应的文件系统后,整个分区被分为 1024,2048 和 4096 字节大小的块。根据块使用的不一样,可分为:网络

  1. 超级块(Superblock): 这是整个文件系统的第一块空间。包括整个文件系统的基本信息,如块大小,inode/block的总量、使用量、剩余量,指向空间 inode 和数据块的指针等相关信息。
  2. inode块(文件索引节点) : 文件系统索引,记录文件的属性。它是文件系统的最基本单元,是文件系统链接任何子目录、任何文件的桥梁。每一个子目录和文件只有惟一的一个 inode 块。它包含了文件系统中文件的基本属性(文件的长度、建立及修改时间、权限、所属关系)、存放数据的位置等相关信息. 在 Linux 下能够经过 “ls -li” 命令查看文件的 inode 信息。硬链接和源文件具备相同的 inode 。
  3. 数据块(Block) :实际记录文件的内容,若文件太大时,会占用多个 block。为了提升目录访问效率,Linux 还提供了表达路径与 inode 对应关系的 dentry 结构。它描述了路径信息并链接到节点 inode,它包括各类目录信息,还指向了 inode 和超级块。

经常会听到所谓的“碎片整理”吧less

须要碎片整理的缘由就是文件写入的 block 太过于离散了,此时文件读取的效能将会变的不好所致。 这个时候能够透过碎片整理将同一个文件所属的 blocks 汇整在一块儿,这样数据的读取会比较容易啊! 想固然尔,FAT 的文件系统须要常常的碎片整理一下,那么 Ext2 是否须要磁盘重整呢?dom

因为 Ext2 是索引式文件系统,基本上不太须要经常进行碎片整理的。可是若是文件系统使用过久, 经常删除/编辑/新增文件时,那么仍是可能会形成文件数据太过于离散的问题,此时或许会须要进行重整一下的。 不过,老实说,鸟哥却是没有在 Linux 操做系统上面进行过 Ext2/Ext3 文件系统的碎片整理说!彷佛不太须要啦!^_^

能够用ln命令对一个已经存在的文件再创建一个新的链接,而不复制文件的内容。链接有软链接和硬链接之分,软链接又叫符号链接。它们各自的特色是:

  • 硬链接:是给文件一个副本,原文件名和链接文件名都指向相同的物理地址。目录不能有硬链接;硬链接不能跨越文件系统(不能跨越不一样的分区)文件在磁盘中只有一个拷贝,节省硬盘空间;
                  因为删除文件要在同一个索引节点属于惟一的链接时才能成功,所以能够防止没必要要的误删除。
  • 软链接/符号链接:用ln -s命令创建文件的符号链接符号链接是linux特殊文件的一种,做为一个文件,它的数据是它所链接的文件的路径名。相似windows下的快捷方式。能够删除原有的文件而保存链接文件,没有防止误删除功能。

硬连接和软连接的区别:

1:硬连接原文件和新文件的inode编号一致。而软连接不同。

2:对原文件删除,会致使软连接不可用,而硬连接不受影响。

3:对原文件的修改,软、硬连接文件内容也同样的修改,由于都是指向同一个文件内容的。

2 文件系统在内核中的表示

文件与IO: 每一个进程在PCB(Process Control Block)中都保存着一份文件描述符表,文件描述符就是这个表的索引,每一个表项都有一个指向已打开文件的指针,如今咱们明确一下:已打开的文件在内核中用file结构体表示,文件描述符表中的指针指向file结构体。

在file结构体中维护File Status Flag(file结构体的成员f_flags)和当前读写位置(file结构体的成员f_pos)。在上图中,进程1和进程2都打开同一文件,可是对应不一样的file结构体,所以能够有不一样的File Status Flag和读写位置。file结构体中比较重要的成员还有f_count,表示引用计数(Reference Count),后面咱们会讲到,dup、fork等系统调用会致使多个文件描述符指向同一个file结构体,例若有fd1和fd2都引用同一个file结构体,那么它的引用计数就是2,当close(fd1)时并不会释放file结构体,而只是把引用计数减到1,若是再close(fd2),引用计数就会减到0同时释放file结构体,这才真的关闭了文件。

每一个file结构体都指向一个file_operations结构体,这个结构体的成员都是函数指针,指向实现各类文件操做的内核函数。好比在用户程序中read一个文件描述符,read经过系统调用进入内核,而后找到这个文件描述符所指向的file结构体,找到file结构体所指向的file_operations结构体,调用它的read成员所指向的内核函数以完成用户请求。在用户程序中调用lseek、read、write、ioctl、open等函数,最终都由内核调用file_operations的各成员所指向的内核函数完成用户请求。

file_operations结构体中的release成员用于完成用户程序的close请求,之因此叫release而不叫close是由于它不必定真的关闭文件,而是减小引用计数,只有引用计数减到0才关闭文件。对于同一个文件系统上打开的常规文件来讲,read、write等文件操做的步骤和方法应该是同样的,调用的函数应该是相同的,因此图中的三个打开文件的file结构体指向同一个file_operations结构体。若是打开一个字符设备文件,那么它的read、write操做确定和常规文件不同,不是读写磁盘的数据块而是读写硬件设备,因此file结构体应该指向不一样的file_operations结构体,其中的各类文件操做函数由该设备的驱动程序实现。

每一个file结构体都有一个指向dentry结构体的指针,“dentry”是directory entry(目录项)的缩写。咱们传给open、stat等函数的参数的是一个路径,例如/home/akaedu/a,须要根据路径找到文件的inode。为了减小读盘次数,内核缓存了目录的树状结构,称为dentry cache,其中每一个节点是一个dentry结构体,只要沿着路径各部分的dentry搜索便可,从根目录/找到home目录,而后找到akaedu目录,而后找到文件a。dentry cache只保存最近访问过的目录项,若是要找的目录项在cache中没有,就要从磁盘读到内存中。

每一个dentry结构体都有一个指针指向inode结构体。inode结构体保存着从磁盘inode读上来的信息。在上图的例子中,有两个dentry,分别表示/home/akaedu/a和/home/akaedu/b,它们都指向同一个inode,说明这两个文件互为硬连接。inode结构体中保存着从磁盘分区的inode读上来信息,例如全部者、文件大小、文件类型和权限位等。每一个inode结构体都有一个指向inode_operations结构体的指针,后者也是一组函数指针指向一些完成文件目录操做的内核函数。

和file_operations不一样,inode_operations所指向的不是针对某一个文件进行操做的函数,而是影响文件和目录布局的函数,例如添加删除文件和目录、跟踪符号连接等等,属于同一文件系统的各inode结构体能够指向同一个inode_operations结构体。

inode结构体有一个指向super_block结构体的指针。super_block结构体保存着从磁盘分区的超级块读上来的信息,例如文件系统类型、块大小等。super_block结构体的s_root成员是一个指向dentry的指针,表示这个文件系统的根目录被mount到哪里,在上图的例子中这个分区被mount到/home目录下。

file、dentry、inode、super_block这几个结构体组成了VFS的核心概念。对于ext2文件系统来讲,在磁盘存储布局上也有inode和超级块的概念,因此很容易和VFS中的概念创建对应关系。而另一些文件系统格式来自非UNIX系统(例如Windows的FAT3二、NTFS),可能没有inode或超级块这样的概念,但为了能mount到Linux系统,也只好在驱动程序中硬凑一下,在Linux下看FAT32和NTFS分区会发现权限位是错的,全部文件都是rwxrwxrwx,由于它们原本就没有inode和权限位的概念,这是硬凑出来的。

3  挂载文件系统

3.1 概述

linux系统中每一个分区都是一个文件系统,都有本身的目录层次结构。linux会将这些分属不一样分区的、单独的文件系统按必定的方式造成一个系统的总的目录层次结构。这里所说的“按必定方式”就是指的挂载。

将一个文件系统的顶层目录挂到另外一个文件系统的子目录上,使它们成为一个总体,称为挂载。把该子目录称为挂载点.

例如要读取硬盘中的一个格式化好的分区、光盘或软件等设备时,必须先把这些设备对应到某个目录上,而这个目录就称为“挂载点(mount point)”,这样才能够读取这些设备。 挂载后将物理分区细节屏蔽掉,用户只有统一的逻辑概念。全部的东西都是文件。

注意:

  • 挂载点必须是一个目录。
  • 一个分区挂载在一个已存在的目录上,这个目录能够不为空,但挂载后这个目录下之前的内容将不可用。

对于其余操做系统创建的文件系统的挂载也是这样。可是须要理解的是:光盘、软盘、其余操做系统使用的文件系统的格式与linux使用的文件系统格式是不同的。光盘是ISO9660;软盘是fat16或ext2;windows NT是fat1六、NTFS;windows98是fat1六、fat32;windows2000和windowsXP是fat1六、fat3二、 NTFS。挂载前要了解linux是否支持所要挂载的文件系统格式。

挂载时使用mount命令,其格式:mount [-参数] [设备名称] [挂载点]
其中经常使用的参数有

  • -t 指定设备的文件系统类型(什么提到的文件类型)
  • -o 指定挂载文件系统时的选项。有些也可用在/etc/fstab中。经常使用的有

codepage=XXX 代码页
iocharset=XXX 字符集
ro 以只读方式挂载
rw 以读写方式挂载
nouser 使通常用户没法挂载
user 可让通常用户挂载设备

例如:

1. 挂载windows的文件系统:

  • 1)首先咱们使用sudo fdisk -l查看挂载的设备,例如最下面有:/dev/hda5
  • 2)mkdir建立一个目录,这里的目录是做为挂在目录,就是你要把E盘挂到这个目录下:mk /mnt/winc
  • 3)windows和linux使用的不是一个文件系统,通常状况下linux不挂载windows文件系统,因此要你手动mount:

# mount -t vfat /dev/hda5 /mnt/winc  ( -t vfat指出这里的文件系统fat32)
如今就能够进入/mnt/winc等目录读写这些文件了。

2.挂载光盘:# mk /mnt/cdrom
# mount -t iso9660 /dev/cdrom /mnt/cdrom (关盘的名字通常都是cdrom,这条命令通常都通用)

3.虚拟机共享文件夹:例如在VirtualBox下,主机是Windows,Ubuntu是Guest。共分三步:

1). 首先要安装虚拟电脑工具包:在VirtualBox的菜单里选择”设备”->”安装虚拟电脑工具包”,你会发如今Ubuntu桌面上多出一个光盘图标,这张光盘默认被自动加载到了文件夹/media/cdom0,并且/cdrom自动指向这个文件夹。默认设置下文件管理器会自动打开这张光盘,能够看到里面有个”VBoxLinuxAdditions.run”文件。打开一个命令行终端,依次输入”cd /cdrom”和”sudo sh ./VBoxLinuxAdditions.run”,不含双引号,开始安装工具包。安装完毕,会用英文提示要重启Ubuntu,建议马上重启。重启后,比较明显的变化是鼠标是共享模式,而且剪贴板也和Windows共享了。若是有这些变化,说明虚拟电脑工具包已经装成功。

2). 下一步设置共享文件夹。
在共享文件夹设置窗口中,单击右侧的”添加一个共享文件夹”,路径选择你想要共享的Windows文件夹,共享名任取一个本身喜欢的,好比”myshare”,选项read-only是指是否只容许ubuntu读这个文件夹,请根据须要选择这个选项。

3). 在ubuntu下挂载这个共享文件夹:sudo mount -t vboxsf myshare /media/share
其中”myshare”是以前取的共享文件夹的名字,”/media/share”是要挂载到的目标文件.

3.2  自动挂载windows分区

每次开机访问windows分区都要运行mount命令显然太烦琐,为何访问其余的linux分区不用使用mount命令呢?

其实,每次开机时,linux自动将须要挂载的linux分区挂载上了。那么咱们是否是能够设定让linux在启动的时候也挂载咱们但愿挂载的分区,如windows分区,以实现文件系统的自动挂载呢?

这是彻底能够的。在/etc目录下有个fstab文件,它里面列出了linux开机时自动挂载的文件系统的列表。个人/etc/fstab文件以下:
/dev/hda2 / ext3 defaults 1 1
/dev/hda1 /boot ext3 defaults 1 2
none /dev/pts devpts gid=5,mode=620 0 0
none /proc proc defaults 0 0
none /dev/shm tmpfs defaults 0 0
/dev/hda3 swap swap defaults 0 0
/dev/cdrom /mnt/cdrom iso9660 noauto,codepage=936,iocharset=gb2312 0 0
/dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0
/dev/hdb1 /mnt/winc vfat defaults,codepage=936,iocharset=cp936 0 0
/dev/hda5 /mnt/wind vfat defaults,codepage=936,iocharset=cp936 0 0

在/etc/fstab文件里,第一列是挂载的文件系统的设备名,第二列是挂载点,第三列是挂载的文件系统类型,第四列是挂载的选项,选项间用逗号分隔。第五六列不知道是什么意思,还望高手指点。

在最后两行是我手工添加的windows下的C;D盘,加了codepage=936和iocharset=cp936参数以支持中文文件名。参数defaults实际上包含了一组默认参数:

  • rw 以可读写模式挂载
  • suid 开启用户ID和群组ID设置位
  • dev 可解读文件系统上的字符或区块设备
  • exec 可执行二进制文件
  • auto 自动挂载
  • nouser 使通常用户没法挂载
  • async 以非同步方式执行文件系统的输入输出操做

你们能够看到在这个列表里,光驱和软驱是不自动挂载的,参数设置为noauto。(若是你非要设成自动挂载,你要确保每次开机时你的光驱和软驱里都要有盘,呵呵。)

4 .文件目录管理命令

磁盘和文件空间 :fdisk df du

文件目录与管理: cd pwd mkdir rmdir ls cp rm mv

查看文件内容 cat、tac、more、less、head 、tail

文件目录与权限 :chmod chown chgrp umask

文件查找:which、whereis、locate、find、find

相关文章
相关标签/搜索