本读书笔记主要记录文件系统的相关操作。基本上,Linux最重要的文件系统是EXT2。该文件系统中的信息主要包括:superblock:记录二级文件系统的整体信息,包括inode/block的总量、使用量、剩余量、文件系统格式及相关信息等。inode:记录的属性文件,一个文件占用一个inode,记录这个文件的数据所在的块号。每个inode的大小固定为128bytes。block:实际记录文件的内容,如果文件太大,会占用多个block。目录块记录了目录下的文件名和inode号的对照表。支持的块大小为1KB、2KB和4KB。磁盘和目录的容量。磁盘的整体数据在superblock块中,但每个单独文件的容量记录在inode中。常用来显示磁盘使用情况的两个命令df:列出文件系统的整体磁盘使用情况du:评估文件系统的磁盘使用情况(通常用于评估目录的容量)$df[-ahikHTm][directory或文件名]参数:-a:列出所有文件系统,包括系统特定的/proc等文件系统(/proc挂载在内存中,不会占用磁盘空间);-k:以KB为单位显示各个文件系统-m:以MB为单位显示各个文件系统-h:以GB、MB、KB等更便于人们阅读的格式显示-H:将M=1024K替换为M=1000K-T:列出分区的文件系统名称(如ext3)-i:df显示的inode数不是硬盘容量,主要是读取整个文件系统的数据,所以读取范围只需要是信息在超级块中,所以这个命令显示结果非常快。$du[-ahskm]文件或目录名参数:-a列出所有文件和目录容量,因为默认仅统计目录中的文件数-h以更易读的容量显示容量-s列出总量,并且不列出每个单独目录的占用容量-S排除子目录下的总量-k列出容量,以KB显示-m列出容量,以MB显示du会直接查找文件系统中的所有文件Data连接文件:lninlinux下有两种连接文件:一种是类似Windows的快捷方式,可以快速连接到目标文件或目录。另一种是通过文件系统的inode连接生成新文件名,而不是生成新文件。这称为硬链接(hardlink)。硬链接(hardlinkandactuallink)每个文件都会占用一个inode,文件的内容由inode的记录指向。如果要读取一个文件,必须通过目录中记录的文件名指向正确的inode号才能读取。文件名与目录相关,文件内容与inode相关,而硬链接就是在某个目录下创建一条关联记录,将文件名与某个inode号相连。vagrant@vagrant-ubuntu-trusty-64:~$cd/tmpvagrant@vagrant-ubuntu-trusty-64:/tmp$touchtesvagrant@vagrant-ubuntu-trusty-64:/tmp$lntesttest1vagrant@vagrant-ubuntu-trusty-64:/tmp$ll-itesttest162273-rw-rw-r--2vagrantvagrant0Dec1712:39test62273-rw-rw-r--2vagrantvagrant0Dec1712:39test1可以看到两个文件的inode号是一样的,它们的文件权限属性完全一样,连接数变成了2。硬链接最大的好处就是安全。如果删除任何一个文件名,则inode和block都存在。这时可以通过另一个文件名读取正确的文件数据。不管你用哪个文件名编辑,最后的结果都会写到同一个inode和block,所以可以修改数据。一般来说,使用硬链接建立连接文件时,磁盘空间和inode数是不会改变的。硬链接只是在某个目录下的一个block中多写入一个相关数据,既不会增加inode,也不会消耗使用block的数量(除非在block中多添加一个相关数据时磁盘已满,否则可能需要增加一个块来记录文件名关联,导致磁盘空间发生变化)。硬链接的限制:不能跨文件系统连接一个目录,因为如果使用硬链接连接一个目录,连接的数据需要和连接目录下的所有数据连接,这会造成相当大的复杂度环境,所以对于目录暂时不支持symboliclink(符号链接,即shortcut)。符号链接是创建一个独立的文件,这个文件会让要读取的数据指向它所链接的文件的文件名,因为它只是以文件作为指向操作,所以当源文件是删除后,符号链接文件将找不到源文件,无法打开。vagrant@vagrant-ubuntu-trusty-64:/tmp$ln-stesttest2vagrant@vagrant-ubuntu-trusty-64:/tmp$ll-itesttest262273-rw-rw-r--2vagrant流浪者0十二月1712:39test62275lrwxrwxrwx1vagrantvagrant4Dec1713:07test2->test这两个文件指向不同的索引节点号。链接文件的重要内容是它会写入目标文件的文件名,因为箭头右边的文件是4Byte,所以连接文件的大小是4字节。符号链接创建的文件是一个独立的新文件,所以会占用inode和block。当符号链接文件被修改时,它会被更改为源文件。$ln[-sf]源文件目标文件参数:-s:如果不带任何参数连接,是硬链接,-s是符号链接-f:如果目标文件存在,直接删除目标文件重建再次。关于目录的连接数当使用硬链接连接文件时,文件的连接数会增加1。当我们创建一个空目录时,因为有两个目录。和..,那么当我们在目录/tmp/testing中创建一个空目录时,基本上有三个东西:/tmp/testing/tmp/testing/./tmp/testing/..其中/tmp/testing和/tmp/测试/。两者都代表目录,而/tmp/testing/..代表/tmp目录,所以当我们新建目录时,新目录的连接数为2,上层目录的连接数会增加1。磁盘分区、格式化、校验、挂载如果要给系统添加新的硬盘,需要做如下操作:对磁盘进行分区,将分区格式化为新的可用分区,创建系统可用的文件.如果想更仔细一点,可以检查新建的文件系统。在Linux系统上,需要创建挂载点(即目录)并挂载。磁盘分区:fdisk$fdisk[-l]设备名参数:-l:输出以下设备的所有分区内容。如果只有fdisk-f,系统会列出整个系统能找到的设备的所有分区。#例如:#首先找出磁盘文件名vagrant@vagrant-ubuntu-trusty-64:/tmp$df/Filesystem1K-blocksUsedAvailableUse%Mountedon/dev/hdc14125113636319483588327610%/#输入fdisk,但不要加号vagrant@vagrant-ubuntu-trusty-64:/tmp$fdisk/dev/hdc会提示Command(mforhelp):输入m看相关参数提示d表示删除一个分区n表示添加一个分区p表示在屏幕上显示分区表,q表示不保存,离开fdisk程序w表示将刚才的操作写入分区表。特别注意q和w,只要在离开fdisk的时候按q,所有操作都不会生效,相反,按w表示操作生效。删除磁盘分区删除分区(如删除所有/dev/hdc分区),需要进行如下操作:fdisk/dev/hdc:首先进入fdisk界面p:首先查看分区信息,假设你想删除/dev/hdc1d:此时如果要选择分区,选择1w或q:w可以存入磁盘数据表,留下fdisk;如果你后悔了,就直接按q取消刚才的删除操作。添加新的磁盘分区需要以下操作:fdisk/dev/hdc:首先进入fdisk界面n:添加新分区poreorl:选择不同的分区类型,其中p代表主分区,e代表扩展partition,l代表Logicalpartition1-4:Partitionnumber,可选1-4,如果是逻辑分区,则不需要输入partitionnumber输入结束柱面号,如果计算起来太麻烦自己定义柱面/分区的大小,可以使用“+512M”之类的东西让系统为我们分配最接近512M的柱面号。p:查看分区信息w或q:w可以存入磁盘数据表,离开fdisk;如果您后悔了,只需按q取消删除操作。关于创建分区的形式(主分区/扩展分区/逻辑分区)和分区的大小,一般来说,新建分区的形式会有以下几种情况:还剩1-4个,系统没有haveanextendedpartition:此时会有一个选项让你选择Primary/Extended,你可以指定1到4之间的数字。1-4还有剩余的数字,系统有扩展分区:此时会出现选择Primary/Logical的选项,如果选择p,需要指定1~4之间的数字;如果选择l,则不需要设置编号,因为系统会自动指定逻辑分区的文件名编号1-4,系统有扩展分区:此时不会让你选择分区类型,则直接进入逻辑分区形式。一般分区后需要重启(reboot)更新内核分区表信息。您可以使用“partprobe”强制内核重新查找分区表。磁盘格式化和分区完成后,需要格式化文件系统$mkfs[-tfilesystemformat]设备文件参数:-t可以连接文件系统格式,如ext3、ext2、vfat等。(只有系统支持才会生效)#比如/dev/hdc6格式化为ext3文件系统$mkfs-text3/dev/hdc6如果要指定文件系统的卷标,block的大小和inode的个数,可以用mke2fs$mke2fs[-bblocksize][-iblocksize][-Lvolumelabel][-cj]Deviceparameters:-b可以设置每个的大小block,目前支持1024、2048、4096字节三种-i给一个inode多少容量-c检查磁盘错误,只发出一次-c时,会进行快速读取测试。如果-c-c发出两次,它将测试读写-L后跟卷标名称-j。原来mke2fs是EXT2。成为EXT3#例如:文件系统卷标设置为nancy_logical,块大小指定为2048,每8192字节分配一个inode,ext3文件系统构建为journal,格式/dev/hdc6$mke2fs-b2048-i8192starts-L"nancy_logical"-j/dev/hdc6文件系统会与硬盘和内存数据异步运行,所以驱动可能会导致文件系统混乱。您可以使用fsck检查磁盘$fsck[-t文件系统][-ACay]设备名称参数编号:-t和mkfs一样,这是一个综合软件,需要指定文件系统,linux会通过superblock自动区分文件系统,通常不需要指定这个参数-A根据的内容/etc/sftab,对需要的设备进行一次扫描,通常这个命令会在开机过程中执行-a自动修复检测到的有问题的扇区,这样就不用一直按y-y类似于-a,但是有些文件系统只支持参数-y-C可以重新检查使用直方图显示EXT2/EXT3的额外参数功能的当前进度-f强制检查,一般来说,如果fsck没有发现任何不干净的迹象,它不会主动进入详细检查,如果要强制fsck进入详细检查,就要加上-f标志-D,对文件系统下的目录进行优化配置#例如强制设备/dev/hdc6检查$fsck-C-f-text3/dev/hdc6badblocks用于检查硬盘或软盘是否有坏道$badblocks-[svw]设备名参数:-s列出进度screen-v可以在屏幕上看到进度-w使用写入方式测试,建议不要使用该参数,尤其是要检查的设备已经有文件。加载前需要确定:单个文件系统不能重复挂载到不同的挂载点(目录),单个目录不能重复挂载到多个文件系统。用作挂载点的目录理论上应该是一个空目录。如果使用的挂载目录不为空,则文件系统挂载目录的内容会暂时消失。假设/home目录和根目录/在同一个文件系统中,则有/home/test两个目录。如果要添加新硬盘,直接挂载到home下,那么挂载新分区时,/home会显示新分区的数据,而原来的test目录会暂时隐藏。它没有被覆盖,只是暂时隐藏。当新分区被卸载后,/home的原始内容将再次显示。使用mount命令挂载文件系统$mount-a$mount[-l]$mount[-t文件系统][-l卷标名][-o额外选项][-n]设备名挂载点参数:-a根据配置文件/etc/fstab中的数据挂载所有未挂载的磁盘-l只需输入mount即可显示当前挂载的信息,添加-l添加卷标的名称(Lable)-tadd指定类型要挂载的文件系统。Linux支持的常见类型有ext2、ext3、vfat、reiserfs、iso9660、nfs、cifs、smbfs(这三种是网络文件系统类型)-n默认情况下,系统会将实际挂载情况写入/etc/mtab中实时方便其他程序运行,但是在某些情况下(比如单用户维护模式),为了避免出现问题,系统会故意不写,这时候就得用这个-n参数-Lsystemout使用设备名,也可以使用文件系统的卷标名来挂载,最好取一个文件系统唯一的名字-o后跟一些挂载的附加参数,比如账号,密码,读写权限等:ro,rw:挂载文件系统为只读ro或读写rwasync,sync:此文件系统是使用同步写(sync)还是异步(async)内存机制,默认为asyncauto,noauto:允许使用mount-a(auto)dev自动挂载此分区,nodev:是否允许在此分区上创建设备文件?dev是允许suid,nosuid:这个分区是否允许包含suid/sgid文件格式exec,noexec:这个分区是否允许有一个可执行的二进制文件user,nouser:这个分区是否允许任何用户执行mount,一般来说,只有root才允许挂载,但是如果下达user参数,一般用户也可以挂载这个分区。Default:默认值为rw,suid,dev,exec,auto,nouser,andasyncremount:remounting,系统出现错误,或者重新更新参数时有用,#比如挂载EXT2/EXT3文件系统$mkdir/mnt/hdc6$mkdir/dev/hdc6/mnt/hdc6$df$unmount[-fn]设备文件名或挂载点参数:-f强制卸载,类似网络文件系统(NFS)无法读取时可用在fetch-nUninstallwithoutupdate/etc/mtab卸载后,可以使用df或mount-l查看目录树中是否还存在。可以使用命令dumpe2fs查询卷标名称$dumpe2fs-h/dev/hdc6linux内核识别的设备文件是由主设备码(Major)和次设备码这两个值决定的(次要的)。一般情况下,硬件文件名已经由系统实时自动生成,不需要我们手动创建。如果某些情况下需要创建设备文件,可以使用mknod命令$mknoddevicefilename[bcp][Major][Minor]参数:devicetype:b设置设备名称成为外部存储设备文件,如硬盘等cset设备名成为外部输入设备文件,如鼠标/键盘等p设置设备名成为FIFO文件Major主要设备代码Minor次要设备代码如果要改标签名称(Label),可以使用e2label更改设备的标签名称$e2labelDevicename新的Label名称需要tune2fe命令修改设备相关参数$tune2fe[-jlL]Devicecodeparameter:-l类似dumpe2fs-h功能,读出超级块中的数据-jConvertext2将文件系统转换为ext3文件系统-L类似e2label的功能,可以修改文件系统的label,设置boot山。如果想设置开机自动挂载我们想要的文件系统,可以在/etc/fstab中修改,但是系统挂载有一些限制:必须挂载根目录/,并且必须在其他挂载之前挂载点。其他挂载点必须是新创建的目录,可以任意指定,但必须符合系统必要的目录结构原则所有挂载点同时只能挂载一次。如果要卸载,必须先将工作目录移出挂载点(及其子目录)#查看文件/etc/fstab的内容$cat/etc/fstabLABEL=cloudimg-rootfs/ext4defaults00的该文件的内容有6个字段,分别代表:第一列:磁盘设备文件名或设备标签第二列:挂载点第三列:磁盘分区的文件系统第四列:文件系统参数,如async/sync,auto/noauto,rw/ro,exec/noexec,user/nouser,suid/nosuid,usrquota、grpquota、defaults(带有rw、suid、dev、exec、auto、nouser、async等参数),基本上默认使用defaults设置。第5列:dumpbackup命令可以使用,0表示不做dumpBackup命令,1表示每天进行dump操作。第6列:是否用fsck检查扇区,0表示不检查,1表示最早检查(一般只有根目录会设置为1),2也是要检查#比如我们要/dev/hdc6每次开机都会自动挂载到/mnt/hdc6#先编辑/etc/fstab,写入如下信息$cat/etc/fstab#将以下信息写入/dev/hdc6/mnt/hdc6ext3defaults12#使用df查看是否挂载,如果是,需要先卸载$df#如果出现/dev/hdc6的挂载信息,先卸载$unmount/dev/hdc6#最后测试写入/etc/fstab的语法有没有错很重要,因为如果错了,linux可能无法顺利开机以后每次开机都会成功挂载文件系统。/etc/fstab是开机时的配置文件,但实际的文件系统挂载记录在/etc/mtab和/proc/mounts这两个文件中。一旦/etc/fstab中输入的数据不正确,导致无法成功开机,可以进入单用户维护模式,重新挂载根目录$mount-n-oremount,rw/如果你下载的是linux或者其他光盘DVD镜像文件创建好后,就可以使用loop设备挂载了#假设要挂载镜像文件/root/centos5.2_x86_64.iso$ll-h/root/centos5.2_x86_64.iso$mkdir/mnt/centos_dvd$mount-oloop/root/centos5.2_x86_64.iso/mnt/centos_dvd$df#可以看到是否挂载成功$ll/mnt/centos_dvd#此时应该可以看到里面的内容了mirrorfile内存交换空间swap是Linux安装时建立的必须要有两个分区,一个是根目录,一个是swap(内存交换空间)。swap的作用是应对物理内存不足导致的内存扩展记录功能。创建swap的过程如下:建立一个swap分区Partition:首先用fdisk在磁盘上为系统划分一个分区作为swap。由于linux的fdisk默认会将分区ID设置为linux文件系统,所以可能需要设置系统ID格式:使用swap格式中新建的“mkswap设备文件名”对swap中的分区进行格式化格式。使用:最后启动swap设备,方法为“swapon设备文件名”查看:最后使用free命令查看内存使用情况创建虚拟内存文件$fdisk/dev/hdc命令(求助m):n:+256MCommand(mforhelp):PCommand(mforhelp):t//修改系统IDPartitionnumber(1-7):7//PartitionNo.7Hexcode(typeLtolistcodes):82//ChangetoIDCommand(mforhelp)ofswap:PCommand(mforhelp):w#此时更新分区表#强制更新内核分区表$partprobe#开始构建交换格式$mkswap/dev/hdc7#开始查看和加载$free#启动swap设备$swapon/dev/hdc7#再检查$free由于台式电脑的内存足够大,一般不需要swap,但如果是服务器,还是需要swap的。如果主机支持电源管理模式,即当linux主机进入休眠模式时,会在swap中记录允许运行的程序状态,作为唤醒主机的依据。另外,有些程序在运行的时候,会用到swap的特性,就是用来存放一些数据段,所以swap还是需要创建的,但是它有一定的局限性:内核版本2.4.10之后,就没有了2GB的限制对于单个交换,最多只能创建32个交换。由于目前x86_64(64位)最大内存寻址为64GB,所以最大swap量只能达到64GB。fdisk分区不支持超过2TB的分区。这种情况下需要使用parted进行处理。$parted[device][command[parameter]]parameter:commandfunctionaddpartition:mkpart[primary|logical|extended][ext3|vfat]起止分区表:printdeletepartition:rm[partition]#例如listthis分区的分区表信息$parted/dev/hdcprint分区表一般分为6个部分:Number:分区号Start:起始柱面位置,以capacity为单位End:结束柱面位置Size:从上面两者的分析可以看出分区有多少容量Type:分区的类型,包括primary,extended,logical等Filesystem:文件系统类型#比如新建一个分区,startof分区可以根据上图分区找到列表中最后一个柱面位置作为新分区的实际位置$parted/dev/hdcmkpartlogicalext319.3GB19.7GB#删除新创建的8号盘分区$分手/dev/hdcrm8
