zoukankan      html  css  js  c++  java
  • linux 文件系统的管理 (硬盘) 工作原理

    一、系统在初始化时如何识别硬盘 
    1、系统初始时根据MBR的信息来识别硬盘,其中包括了一些执行文件就来载入系统,这些执行文件就是MBR里前面446bytes里的boot loader 程式,而后面的16X4的空间就是存储分区表信息的位置;如下图
    133_U3_1_1 
    2、在分区表中,主要储存了以下信息:
    (1)分区号,常见的分区号有以下几种:其它编号可以使用fdisk指令,再执行 l (小写L) 查看

    0x5 (or 0xf) 扩展分区
    0x82 Linux swap
    0x83 Linux
    0x8e Linux LVM
    0xfd Linux RAID auto

    (2)分区的起始磁柱;
    (3)磁柱的总数;
    所以在系统初始化时,就根据分区表中的这三项信息来识别硬盘。

    二、介绍硬盘分区的相关事项
    1、当主分区都用完时,可以使用扩展分区来增加额外的分区,这已在前面介绍过了,但是在Linux的kernel里:
    ·IDE的硬盘最多可以支持到16个分区;
    ·SCSI硬盘最多支持15个分区;
    2、硬盘做多分区的好处:如下:
    (1)从控制方面的考虑
    将硬盘分成多个分区,就可以把应用程序、使用者的资料、或是一些需要有安全性的资料,分别放入不同分区中方便管理;
    (2)从效率方面的考虑
    因为硬盘在使用一段时间后,都分有区块不连续的情况,如果一块大容量的硬盘没有划分成多个小分区,那么硬盘在搜索信息时,因为搜索的范围非常大,所以会比较久,如果将大容量的硬盘划分多个小分区,在搜索的时候相对就会快一些;
    (3)为为使用磁盘配额的功能
    因为配额只能对分区做设定,所以我们可以将/home目录单独做一个分区,然后可以对这个分区做配额;
    (4)从资料备份和恢复考虑
    例如,/home这个目录是专门用于存放用户信息的目录,将这个目录单独设定一个分区,就可以定期就是个分区作备份工作,恢复的时候也比较方便。

    三、介绍分区的管理
    1、可以使用下面的指令来建立分区及查看分区
    fdisk /dev/hda 建立分区    
    参数:-l 查看分区
    执行 fdisk 指令后,如下图:
    133_U3_3_1 
    例1:在新建分区 ,输入n,系统会要求输入起始的磁柱编号,默认系统会指定一个最近的未使用的磁柱号,回车后,再输入结束的磁柱号,不过根据磁柱号来算一个分区的容量不太方便,可以用“+数值K或+数值M (例:+1000M)” 这样直接以容量的表示方式来设定,这样直观一些;再执行p,就可以看到新增加的分区了;
    133_U3_3_1_1 
    例2:删除分区 ,输入d,要求输入要删除的分区号,在DEVICE字段列可以看到每个分区对应的编号,输入想要删除的分区号回车即可
    133_U3_3_1_2 
    以前所有操作认为没有问题,输入 w ,保存退出即可。
    这时主机屏幕上会提示:
    The kernel still uses old table 表示目前系统还是在使用旧的分区表;
    The new table will be used at the next reboot. 表示只有在下次重新开机后才会使用新的分区表;
    2、使用下面的指令重新载入分区表到kernel中,这样可以不用重新开机就可以启用新的分区表。
        partprobe

    四、建立文件系统(对硬盘分区进行格式化)
    1、格式化指令及指令语法:
        mke2fs [参数] 要格式化的分区
    例如上面的例子中,格式化hda6这个分区 mke2fs /dev/hda6
    2、格式化后,会出现一些分区的相关信息,为了理解这些信息,先了解一下分区的格式:
    我们使用fdisk建立的分区,不能直接用来存放资料,必须先对这个分区做格式化的工作,格式化就是将分区划分成一格一格的block及多少个Inode可以使用,而每个block就是文件系统存取资料的最小单位,所以才可以将资料存放在这些block中,而且每多个 block 会组成一个 group;如下图所示:除了boot sector 之外,第一个block 称为 super block 用来记录这个分区共有多少个block和inode 已经使用;多少block和inode等信息;
    133_U3_4_2_1 
    如下图所示:
    13 block groups :表示这个分区被划分出了13个block group;
    8192 blocks per group:表示每个group中有8192个block;
    2008 inodes per group:表示每个group中有8192个inodes;
    如果super block 损坏,这个分区将无法访问,所以每隔一段block 就会备份一次这个super block,如下图:
    superblock backups stored on block:下面的数值就是备份super block 所在的block的位置。
    133_U3_4_2_2 
    3、dumpe2fs 指令查看分区的详细信息
    dumpe2fs /dev/hda6 | more    查看指定分区的信息(前一页半是super block的内容,后面是每个Group的详细信息),因为所显示的内容很多所以加上了 | more 用于分页显示;
    显示信息的部分说明:
    Inode count:   Inode的总数量;
    Block count:    Block的总数量;
    Free blocks:    剩余的block数量;
    Fre inodes:     剩余的Inode数量;
    Filesystem features: has_journal表是为ext3文件系统
    4、mke2fs格式化指令格式及参数
    格式:mke2fs [参数] 要格式化的分区文件名(例:/dev/hda6) 
    mke2fs -j /dev/hda6 
    参数:
    ·b:设定每个block的大小,预设为1024bytes(1K),最大4096bytes(4K),如果设定太大将使用4096bytes;
    ·c:格式化前检查分区中是否有损坏的block;
    ·i :设定每个Inode的大小,例:mke2fs –i 4096 /dev/hda6
    ·N:直接设定Inode 的总数量;所设置的值只是接近而矣;
    ·m:设定在分区上,保留多少空间给root,预设保留5%;mke2fs –m 10 /dev/hda6
    ·L:设定分区卷标,预设不设定,通常习惯将卷标名称设为同挂载点目录名称相同方便记忆;mke2fs –L data /dev/hda6
    ·j:建立成为ext3文件系统,也就是加入日志功能;

    五、介绍将ext2格式的分区转成ext3
    1、ext2与ext3的区别如下:
    (1)ext2和ext3的格式完全相同,只是在ext3硬盘最后面有一部分空间用来存放Journal(日志)的记录;
    (2)在ext2中,写资料到硬盘中时,先将资料写入缓存中,当缓存写满时才会写入硬盘中;
    (3)在ext3中,写资料到硬盘中时,先将资料写入缓存中,鼗缓存写满时系统先通知Journal,再将资料写入硬盘,完成后再通知Journal,资料已完成写入工作;
    (4)是否有Journal的差别:
    在ext2中,系统开机时会去检查有效位(Valid bit),如果值为1,表示系统上次有正常关机;如果为0,表示上次关机未正常关机,那系统就会从头检查硬盘中的资料,这样时间会很长;
    在ext3中,也就是有Journal机制里,系统开机时检查Journal的资料,来查看是否有错误产生,这样就快了很多;
    (5)tune2fs –j /dev/hda6 将ext2转换成ext3
    2、在ext3里有三个Journal的模式:
    (1)ordered:预设模式,只记录Inode-table里的信息;
    (2)Journaled:记录资料本身的信息,需要大量空间来做记录;
    (3)writeback:不记录信息,可提供较好的效能;

    六、介绍在分区里设定相应的卷标 
    1、前面分区的表示法一直在使用 hda1 或 sda1类似这样的表示法,其实也可以用卷标的表示法,这样更好便记忆。
    2、设定及查看卷标的指令格式及说明如下:
        e2label 指令:
    例:e2label /dev/hda6    查看hda6分区的卷标名称;如为空白表示未设定卷标;
         e2label /dev/hda6 data 设定这个分区的卷标为 data;
    注:在这里先不要修改hda1~hda5的卷标,可能会造成无法开机,以后再做说明。

    七、介绍mount指令挂载分区 
    1、挂载的概念:当要使用某个设备时,例如要读取硬盘中的一个格式化好的分区、光盘或软件等设备时,必须先把这些设备对应到某个目录上,而这个目录就称为“挂载点(mount point)”,这样才可以读取这些设备,而这些对应的动作就是“挂载”。
    mount的详细说明将在下一小节介绍
    示例如下图:
    133_U3_7_1_1 
    下面以卷标的方式进行挂载,注意:使用卷标挂载进必须加上 –L 的参数表示使用卷标挂载
    133_U3_7_1_2

    八、介绍mount指令及参数
    1、mount 指令格式:
    mount   [-t 文件系统类型]   [-o 参数]   设备名或卷标   挂载点目录名
    注:如果使用卷标方式挂载,必须使用 –L 参数。
    (1)-t 后面设定所要挂载的文件系统的类型,例如:vfat、ext2、ext3、iso9660(光盘),通常这部分不需要加kernel可以自己判断
    (2)-o 后面加一些设定参数:
    · suid:允许挂载后的文件系统可以使用suid、sgid的特殊权限;
    · dev:允许挂载的文件系统建立设备文件,例如:/dev/hda6 下的 hda6 就是设备文件;
    · exec:允许挂载文件系统后,可以执行里面的执行文件;
    · noexec:不允许执行文件;
    · auto:在电脑开机后自动挂载这个文件系统;
    · nouser:指只允许super user (也就是root)挂载这个文件系统;
    · async:设为不同步,就是电脑写入资料时先写入缓存再写到硬盘中;
    · loop:用来挂载loopback设备,例如光盘机就是loopback设备;
    · ro:挂载文件系统后设定为只读;
    · rw:挂载文件系统后设定为可读可写;
    · remount :重新挂载文件系统;
    如果在挂载ext2或ext3时,预设会使用下面的参数设定:
    rw,suid,dev,exec,nouser,async

    九、介绍卸载文件系统
    1、使用mount指令查看已挂载了哪些文件系统;
    卸载指令及格式如下:
    umount 设备文件名或挂载点
    例如:上图中已挂载到/data目录的上设备,可以使用 umount /dev/hda6 或 umount /data 进行卸载
    2、如果文件系统正在使用中,就无法正常卸载,可以使用下面的指令查看并停止所有对这个文件系统的操作,然后再进行卸载操作;
    fuser -v 设备文件名或挂载点       查看有哪个服务或使用者正在对这个文件系统做操作;
    fuser –km 设备文件名或挂载点        强制停止所有对这个文件系统的所有操作;
    3、可以使用 remount 这个参数来改变文件系统的状态;
    例如:mount –o remount,ro /data     重新挂载文件系统为只读,这样就不用先卸载再挂载了。

    十、介绍一些挂载的范例
    1、挂载一个不允许执行的文件系统
    mount –o noexec /dev/hda6 /data      noexec表示为不允许执行;
    2、挂载一个文件系统的镜像文件
    mount –t iso9660 -o ro,loop boot.iso /iso      加loop参数是因为光盘是loopback设备,boot.iso为镜像文件名 ,/iso 为挂载点;

    十一、介绍挂载网络上的共享资源 
    1、在Unix 和Linux的网络资源主要分为两种 NFS (Network File System)和SMB
    ·NFS:Linux/Unix和Unix/Linux之间用来共享资源的;
    ·SMB:Linux/Unix和Microsoft(windows)之间用来共享资源的;
    2、共享NFS网络资源的主机称为:NFS Server;
        共享SMB网络资源折主机称为:Samba Server;
    3、这些网络资源的连接方式:
    (1)NFS部分的连接方式:
    showmount –e IP地址     #查看共享资源
    mount ip地址:/共享目录   /挂载点    #挂载网络资源
    (2)SMB部分的连接方式:
    smbclient –L ip地址 -N    #查看指定Samba Server 上有哪些共享目录;
    mount //IP地址/共享目录   /挂载点 -o username=用户名%密码     #挂载windows网络共享资源;

    十二、介绍/etc/fstab 文件的功能
    1、fstab文件的功能就是根据fstab文件中设定的内容自动挂载设备到指定的挂载点上;
    2、下面就介绍fstab这个文件内容的详细说明:
    如下图:fstab文件内容共分为6个栏位
    133_U3_12_2_1 
    下面对上图中6个栏位分别说明:
    (1)设备名 :可以用“LABEL=”卷标表示法,也可以使用设备名称表示法“/dev/hda6”;
    (2)挂载点 :挂载点目录必须是已存在的目录;
    (3)文件系统类型 :例如ext3,ext2等;
    (4)挂载参数 :就是前面mount指令中 –o 后面的参数,defaults代表使用预设参数设定;例如如/dev/hdc(光盘)和/dev/fd0(软盘)的这两行设定,exec可以执行文件,noauto 不会自动挂载,
    (5)备份 :设定备份次数,0表示不备份,1表示每天做一次备份,2表示每两天做一次备份;
    (6)检查顺序 :设定文件系统的检查顺序,0表示不检查,1表示第一个检查,2表示第二个检查,以此类推检查顺序最多到9,如果值相同,按从上到下的顺序检查,通常根目录的检查顺序排在第一位;
    所以如果要在电脑开机后自动挂载文件系统就可以修改fstab这个文件的设定。
    例如:可以将前面挂载的hda6写入这个文件中,当开机后自动挂载,设定方法如下,使用VI编辑fstab文件将下面的一行设定加入到最后一行即可:
    /dev/hda6          /data         ext3        defaults           0   0
    2、在挂载光盘或软盘时,只需要执行 mount /media/cdrom 或 mount /media/floppy 就可以了,而不用指定要挂载的设备,这是因为在fstab文件中有所设定,因为在挂载目录和设备时,如果未指定要挂载的设备,电脑会先到fstab文件中查看,有没有相对应的设备及目录挂载,如果没有还会到mtab文件(其实mtab文件就是目前系统的挂载设定,所以在卸载时也查看这个mtab文件,卸载时也就只需要指定挂载点或设备就可以了)中查看。

    十三、介绍auto-mounter自动挂载程序在使用网络共享时自动挂载网络共享资源 
    1、automounter是一个daemon程式,automounters可以监控某个目录,例如:监控/mnt/nfs目录,当我们需要存取这个目录时,使用cd /mnt/nfs 进入这个目录时,这时automounter程式发现使用者要存取这个目录时,就会按照设定自动将网络共享资源自动进行挂载,如果过一段时间(预设60秒)不使用也会自动卸载这个目录,这样可以减少对网络产生的负荷,使用网络的利用率更高。
    2、automounter的设定,以实例说明,仅供参考:
    (1)vi /etc/auto.master    编辑automount主要的设定文件
    (2)复制有--timeout=60那一行到下面,修改如下图:
    133_U3_13_2_2 
    (3)建立auto.nfs设定文件,预设/etc目录下没有这个文件,需要自己建立;
    可以由 auto.misc 做为模板复制得来,并重命名为auto.nfs,编辑auto.nfs修改如下:
    133_U3_13_2_3 
    (4)service autofs start    启动automount服务,如果已经启动可执行service autofs restart 或 service autofs reload重新启动或重新加载配置文件;
    (5)使用cd /mnt/nfs 目录,再执行ls 指令没有未何文件,
    使用 cd server1 却可以进入,这时已经进行自动挂载了,这时就可以查看NFS服务器上的共享文件了。
    使用mount可以查看到刚刚挂载上来的NFS网络共享目录。
    注:我这里还未建立NFS文件服务器,所以这里只能做客户端的设定,现在还无法试测; 

    十四、介绍在ext2和ext3文件系统里有哪些属性可以设定
    1、在ext2和ext3的文件系统里,都支持一些特殊的属性来控制文件的特性:
    ·lsattr 指令:显示文件的属性设定;
    ·chattr 指令:设定文件的属性;
    格式:
    chattr   +|-|=属性[属性…]   文件名[文件名…]
    +
     :增加属性
    - :去除属性
    =:设定属性
    可以设定一个或多个属性
    常见属性说明如下:
    ·A:当文件被修改时,atime(存取时间)记录不会被修改;
    ·a:让文件只可以附加内容,不允许原来的内容被覆盖掉;
    ·d:让系统在使用dump指令做备份时,可以不用备份这个文件;
    ·i:让文件永远不改变,不能删除或更改文件名;
    ·j:让系统将文件本身的信息记录在ext3的日志里,就算ext3的文件系统是挂载成ordered(有序)或writeback模式,都会将文件本身的信息记录在ext3的日志里。
    ·S:当文件被修改时,就做同步的动作,立刻将资料写入硬盘中;
    例:
    chattr +a test   添加只允许附加内容的属性
    chattr = test   去除掉所有的属性

    十五、介绍如何使用划分好的分区或文件来当作虚拟内存(swap)
    1、在Linux系统中虚拟内存称为:SWAP;
    2、SWAP分为两种类型:
    ·用划分好的分区作为SWAP;
    ·用文件当作SWAP;
    3、要建立SWAP的虚拟内存主要有以下几个基本设定:
    (1)建立SWAP的分区或是文件,并且在建立SWAP的分区时分区的编号要设定为82;
    (2)使用mkswap指令对swap分区或是swap文件写入一个特定的SWAP识别标志;
    (3)必须要在/etc/fstab文件中加入适当的记录,这样才能让系统在开机后能够自动挂载SWAP;
    (4)如果是SWAP的分区,要使用 swapon –a 指令启用SWAP,其实 swapon –a 指令会去读取 fstab 文件,并根据 fstab 里的记录,来启用所有的 swap 分区;
    (5)如果是使用SWAP文件,则使用 swapon 指令再指定要启用哪个SWAP文件;
    (6)可以使用 swapon –s 来检查SWAP的使用情况;
    范例1如下: 
    (1)使用分区作为SWAP
    ·fdisk /dev/hda 
    ·输入n;新建一个分区,如果一直以前面的例子做下来,硬盘应该还有剩余空间的,这里创建一个100M的分区;
    ·输入t;再输入7(我这里新建的分区是hda7,可以输入p查看到);再输入 82 (82表示设定为swap分区类型);
    ·再输入p;可以查看到 hda7 的system(系统)已经变为Linux swap
    ·wq:保存退出;
    ·执行“partprobe ”指令,让kernel重新读取分区表;
    (2)mkswap /dev/hda7    对SWAP分区或是SWAP文件写入特定的标志;类似于格式化成虚拟内存的格式;
    (3)编辑/etc/fstab文件添加记录,这样一会的swapon指令才可以在fstab文件中找到相应的分区,在下次开机时也可以找到新的SWAP分区的位置;复制原来的SWAP那行记录,将原来的卷标表示法修改为/dev/hda7的设备表示法,其它保持不变;
    (4)swapon –a 指令,根据fstab文件启动所有SWAP分区;为了验证可以先使用 swapon –s 指令查看当前SWAP的状态;
    133_U3_15_4_4 
    范例2如下:使用文件当虚拟内存这和windows下的虚拟内存使用方式非常相似
    (1)建立SWAP文件,这里建立的是100M的SWAP文件
    指令:dd if=/dev/zero of=/swapfile bs=1M count=100
    133_U3_15_4_5 
    说明:dd:转换并复制文件;
            if:是inputfile的缩写,if=/dev/zero 代表要把zero文件当作输入的文件,zero文件可以是当作都是零的文件;
            of:是outputfile的缩写,of=/swapfile 代表要输入到/swapfile文件上;
            bs:是block size的缩写,表示强制设定swapfile的block的大小;
            count:代表要建立多少个block;
    (2)mkswap /swaplife    为swapfile文件写入一个swap的标志,相当于格式化成虚似内存的格式;设定成功将会出现提信息;
    (3)修改 /etc/fstab文件,方式同上一范例相同,只是把 /dev/hda7改写成 /swapfile ,其它不变;
    133_U3_15_4_6 
    (4)swapon –a 启用swap文件
    在启用前也可以用 swapon –s 查看,等启用后再次查看SWAP是否加载进来了。

    十六、介绍一些维护文件系统的工具及一些重要的相关事项
    1、如果文件系统的文件有丢失或毁损,可以使用fsck指令来维护文件系统的一致性:
    检查某个分区前,分区必须处于未挂载状态,如正在使用中,必须先进行卸载,再执行检查工作;
    格式: fsck -Y /dev/hda6      -Y参说表示中途提示问题都回答Yes;
    2、系统在开机时就会检查文件有没有丢失或损坏的,系统是根据/etc/fstab文件中最后一栏的设定来决定检查的先后顺序的,这个栏位前面已做过介绍;
    3、如果检查出有问题文件,就会先放到 lost+found 目录中当作备分;所以当一个分区挂载成功后都会发现有这个目录存在;
    4、电脑在开机时,发生严重错误,系统会用sulogin的方式启动,下图例中我将fstab文件中根目录的卷标随意的修改了一下,重新启动后将会出现严重错误,就停在了下图图的位置:
    133_U3_16_4_1 
    5、将ext2文件系统转成ext3文件系统,指令下如:
    tune2fs -j /dev/hda6 将hda6分区转成ext3文件系统,转换成功后将有提示信息;这样原有分区内的资料将不会丢失;
    6、查看文件系统目前的状态信息
    dumpe2fs -h   /dev/hda6     显示hda6的分区信息,这个指令前面已介绍过;
    -h   可以显示superblock的信息

    十七、如何加入一块新硬盘
    1、第一步当然是要将硬盘接在电脑上啦;
    2、进入系统后,使用fdisk对硬盘进行分区,并设定好分区类型编号;例如:linux 为 83
    3、建立好分区后,执行 patrprobe 重新载入分区,使用最新分区表;
    4、建立完分区后,格式化分区,如果建立的是SWAP分区,需要为这个SWAP分区写入一个SWAP标志;
    5、如果要使用卷标表示法,需要为分区创建卷标名称;
    6、建立新的挂载点,并将分区挂载上;
    7、在/etc/fstab文件中加入新分区的记录,让电脑以后可以自动挂载这个新建的分区;

  • 相关阅读:
    嵌入式开发之基于模型的设计思想
    tslib库的移植以及"selected device is not a touchscreen I understand"问题解决
    rocketMq broker.conf全部参数解释
    rocketMq 消息偏移量 Offset
    3、验证,数据绑定和类型转换
    2、springframe Resources
    1、Spring Framework 5.0简述
    POI导出Excel时下拉列表值超过255的问题(String literals in formulas can't be bigger than 255 characters ASCII)
    rocketMq console MQClientException异常
    25. Secure Object Implementations(安全对象实现)
  • 原文地址:https://www.cnblogs.com/wuchanming/p/3826294.html
Copyright © 2011-2022 走看看