文件系统是文件存放在磁盘等存储设备上的组织方法。Linux系统能支持多种目前流行的文件系统,如EXT二、 EXT三、 FAT、 FAT3二、 VFAT和ISO9660。node
文件系统指文件存在的物理空间,linux系统中每一个分区都是一个文件系统,都有本身的目录层次结构。linux会将这些分属不一样分区的、单独的文件系统按必定的方式造成一个系统的总的目录层次结构。一个操做系统的运行离不开对文件的操做,所以必然要拥有并维护本身的文件系统。linux
磁盘分区完毕后还须要进行格式化(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 字节大小的块。根据块使用的不一样,可分为:网络
经常会听到所谓的“碎片整理”吧?less
须要碎片整理的缘由就是文件写入的 block 太过于离散了,此时文件读取的效能将会变的不好所致。 这个时候能够透过碎片整理将同一个文件所属的 blocks 汇整在一块儿,这样数据的读取会比较容易啊! 想固然尔,FAT 的文件系统须要常常的碎片整理一下,那么 Ext2 是否须要磁盘重整呢?dom
因为 Ext2 是索引式文件系统,基本上不太须要经常进行碎片整理的。可是若是文件系统使用过久, 经常删除/编辑/新增文件时,那么仍是可能会形成文件数据太过于离散的问题,此时或许会须要进行重整一下的。 不过,老实说,鸟哥却是没有在 Linux 操做系统上面进行过 Ext2/Ext3 文件系统的碎片整理说!彷佛不太须要啦!^_^
能够用ln命令对一个已经存在的文件再创建一个新的链接,而不复制文件的内容。链接有软链接和硬链接之分,软链接又叫符号链接。它们各自的特色是:
硬连接和软连接的区别:
1:硬连接原文件和新文件的inode编号一致。而软连接不同。
2:对原文件删除,会致使软连接不可用,而硬连接不受影响。
3:对原文件的修改,软、硬连接文件内容也同样的修改,由于都是指向同一个文件内容的。
文件与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和权限位的概念,这是硬凑出来的。
linux系统中每一个分区都是一个文件系统,都有本身的目录层次结构。linux会将这些分属不一样分区的、单独的文件系统按必定的方式造成一个系统的总的目录层次结构。这里所说的“按必定方式”就是指的挂载。
将一个文件系统的顶层目录挂到另外一个文件系统的子目录上,使它们成为一个总体,称为挂载。把该子目录称为挂载点.
例如要读取硬盘中的一个格式化好的分区、光盘或软件等设备时,必须先把这些设备对应到某个目录上,而这个目录就称为“挂载点(mount point)”,这样才能够读取这些设备。 挂载后将物理分区细节屏蔽掉,用户只有统一的逻辑概念。全部的东西都是文件。
注意:
对于其余操做系统创建的文件系统的挂载也是这样。可是须要理解的是:光盘、软盘、其余操做系统使用的文件系统的格式与linux使用的文件系统格式是不同的。光盘是ISO9660;软盘是fat16或ext2;windows NT是fat1六、NTFS;windows98是fat1六、fat32;windows2000和windowsXP是fat1六、fat3二、 NTFS。挂载前要了解linux是否支持所要挂载的文件系统格式。
挂载时使用mount命令,其格式:mount [-参数] [设备名称] [挂载点]
其中经常使用的参数有
codepage=XXX 代码页
iocharset=XXX 字符集
ro 以只读方式挂载
rw 以读写方式挂载
nouser 使通常用户没法挂载
user 可让通常用户挂载设备
例如:
1. 挂载windows的文件系统:
# 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”是要挂载到的目标文件.
每次开机访问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实际上包含了一组默认参数:
你们能够看到在这个列表里,光驱和软驱是不自动挂载的,参数设置为noauto。(若是你非要设成自动挂载,你要确保每次开机时你的光驱和软驱里都要有盘,呵呵。)
磁盘和文件空间 :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