linux笔记-磁盘及文件系统管理详解

时间:2022-08-18 18:29:19

第十四章、磁盘及文件系统管理详解


08_03_磁盘及文件系统管理详解之一

 

磁盘管理:

        

机械式硬盘:

         U盘、光盘、软盘、硬件、磁带

        

此处查看PPT: Linux入门.ppt (search: 文件系统)

补充磁盘分区、文件系统、inode,VFS等相关知识后继续。


分区以柱面为单位进行划分。

inode: index node, 保存了文件的信息,大小,属主,属组,时间等。

linux笔记-磁盘及文件系统管理详解


inode位图,块位图



1. ln [-s -v] SRC DEST

 

硬链接:

         1、只能对文件创建,不能应用于目录;

         2、不能跨文件系统;

         3、创建硬链接会增加文件被链接的次数;

        

符号链接:

         1、可应用于目录;

         2、可以跨文件系统;

         3、不会增加被链接文件的链接次数;

         4、其大小为指定的路径所包含的字符个数;

 

2. du: 显示路径下所有目录占用磁盘大小

         -s: 路径占用磁盘大小

         -h: human readable

        

3. df: 显示整个磁盘分区使用情况

        -i: 显示inode信息替代块信息

        -P: posix输出格式(文件名太长不换行)

 

       

08_04_磁盘及文件系统管理详解之二

 

设备文件:

         b: 按块为单位,随机访问的设备;如硬盘

         c:按字符为单位,线性设备;如键盘

        


ls -l /dev

         主设备号(major number)

                   标识设备类型

         次设备号(minor number)

                   标识同一种类型中不同设备


设备文件作为设备的访问入口。


tty 命令可以查看对应设备文件

[root@CentOS tmp]# tty

/dev/pts/2

echo "hello" >> /dev/pts/1


mknod

mknod [OPTION]... NAME TYPE [MAJOR MINOR]

         -m MODE

        

硬盘设备的设备文件名:

IDE, ATA:hd

SATA:sd

SCSI: sd

USB: sd

         a,b,c,...来区别同一种类型下的不同设备

        

IDE:

         第一个IDE口:主、从

                   /dev/hda, /dev/hdb

         第二个IDE口:主、从

                   /dev/hdc, /dev/hdd

 

sda, sdb, sdc, ...

 

hda分区:

         hda1: 第一个主分区

         hda2:

         hda3:

         hda4:

         hda5: 第一个逻辑分区

        

Linux支持的文件系统

    传统:ext2, ext3, ext4, reiserfs, xfs, jfs

    光盘:iso9660

    集群文件系统:GFS2, OCFS2

    网络文件系统: NFS, CIFS


低级格式化:将空白的磁盘划分出柱面和磁道,再将磁道划分为若干个扇区等

高级格式化:创建文件系统

        

VFS:virtual file system

一个分区就是一个独立的文件系统,可以单独格式化


查看当前系统识别了几块硬盘:

fdisk -l [/dev/to/some_device_file]

 

管理磁盘分区:

fdisk /device/path

         p: 显示当前硬件的分区,包括没保存的改动

         n: 创建新分区

                   e: 扩展分区

                   p: 主分区

                   l: 逻辑分区

         d: 删除一个分区

         w: 保存退出

         q: 不保存退出

         t: 修改分区类型

                   L:

         l: 显示所支持的所有类型

        

partprobe: 让内核重读分区表,cat /proc/partations 中查看分区表,  

    partprobe [/dev/sda/] 


partx: Redhat6.0中类似partprobe的命令       



09_01_磁盘及文件系统管理详解之三 

 

查看Linux入门.ppt(search: 超级块),补充块组、超级块等相关知识。


linux笔记-磁盘及文件系统管理详解



超级块(Super Block)

        描述整个分区的文件系统信息,例如块大小、文件系统版本号、上次mount的时间等等

        超级块在每个块组的开头都有一份拷贝


块组描述符表(GDT,Group Descriptor Table)

        由很多块组描述符组成,整个分区分成多少个块组就对应有多少个块组描述符

        每个块组描述符(Group Descriptor)存储一个块组的描述信息,例如在这个块组中从哪里开始是inode表,从哪里开始是数据块,空闲的inode和数据块还有多少个等等

        和超级块类似,块组描述符表在每个块组的开头也都有一份拷贝,这些信息是非常重要的,一旦超级块意外损坏就会丢失整个分区的数据,一旦块组描述符意外损坏就会丢失整个块组的数据,因此它们都有多份拷贝


块位图(Block Bitmap)

        块位图就是用来描述整个块组中哪些块已用哪些块空闲的,它本身占一个块,其中的每个bit代表本块组中的一个块,这个bit为1表示该块已用,这个bit为0表示该块空闲可用

        与此相联系的另一个问题是:在格式化一个分区时究竟会划出多少个块组呢?主要的限制在于块位图本身必须只占一个块


inode位图(inode Bitmap)

        和块位图类似,本身占一个块,其中每个bit表示一个inode是否空闲可用


inode表(inode Table)

        一个文件除了数据需要存储之外,一些描述信息也需要存储,例如文件类型(常规、目录、符号链接等),权限,文件大小,创建/修改/访问时间等,也就是ls -l命令看到的那些信息,这些信息存在inode中而不是数据块中

        每个文件都有一个inode,一个块组中的所有inode组成了inode表

        inode表占多少个块在格式化时就要决定并写入块组描述符中

        mke2fs格式化工具的默认策略是一个块组有多少个8KB就分配多少个inode


数据块(Data Block)

        对于常规文件,文件的数据存储在数据块中

        对于目录,该目录下的所有文件名和目录名存储在数据块中,文件名保存在它所在目录的数据块中

            除文件名之外,ls -l命令看到的其它信息都保存在该文件的inode中

            目录也是一种文件,是一种特殊类型的文件

        对于符号链接,如果目标路径名较短则直接保存在inode中以便更快地查找,如果目标路径名较长则分配一个数据块来保存

        设备文件、FIFO和socket等特殊文件没有数据块,设备文件的主设备号和次设备号保存在inode中



inode table格式: 

linux笔记-磁盘及文件系统管理详解linux笔记-磁盘及文件系统管理详解



ext3比ext2多一个日志区,存入元数据区的inode,先放入日志区,文件写完成后移动到元数据区


09_02_磁盘及文件系统管理详解之四

 

文件系统管理

格式化:重新创建文件系统会损坏原有文件

 

创建分区

1. fdisk /dev/sda

2. n -> e -> 4 -> <Enter> -> <Enter>  创建一个扩展分区,使用MBR第四个位置,从开头到结尾(使用所有剩余的空间)

3. n -> +5G  创建一个5G的逻辑分区

4. w  保存退出

5. partprobe /dev/sda 让内核识别新建分区,cat /proc/partitions 


mkfs: make file system,创建文件系统

         -t FSTYPE:指定文件系统类型


cat /proc/filesystems : 查看当前内核所支持文件系统类型

文件系统类型:

         ext2

         ext3:比ext2多一个journal区

         vfat: fat32

        

mkfs其实会调用其他的程序

mkfs -t ext2 = mkfs.ext2

mkfs -t ext3 = mkfs.ext3

 

专门管理ext系列文件系统:

1. mke2fs

         -j: 创建ext3类型文件系统

         -b BLOCK_SIZE: 指定块大小,默认为4096;可用取值为1024、2048或4096;

         -L LABEL:指定分区卷标;

         -m #: 指定预留给超级用户的块数百分比

         -i #: 用于指定为多少字节的空间创建一个inode,默认为8192;这里给出的数值应该为块大小的2^n倍;

         -N #: 指定inode个数;

         -F: 强制创建文件系统;

         -E: 用户指定额外文件系统属性;

 

2. blkid: 查询或查看磁盘设备的相关属性

         UUID:通用唯一识别码 (Universally Unique Identifier)

         TYPE:文件系统类型

         LABEL: 卷标

        

3. e2label: 用于查看或定义卷标

         e2label 设备文件卷标: 设定卷标

        

4. tune2fs: 调整文件系统的相关属性

         -j: 不损害原有数据,将ext2升级为ext3;

         -L LABEL: 设定或修改卷标;

         -m #: 调整预留百分比;

         -r #: 指定预留块数;

         -o: 设定默认挂载选项;

                   acl

         -c #:指定挂载次数达到#次之后进行自检,0或-1表关闭此功能;

         -i #: 每挂载使用多少天后进行自检;0或-1表示关闭此功能;

         -l: 显示超级块中的信息;

        

5. dumpe2fs: 显示文件属性信息

         -h: 只显示超级块中的信息

        

6. fsck: 检查并修复Linux文件系统

         -t FSTYPE: 指定文件系统类型

         -a: 自动修复

        

7. e2fsck: 专用于修复ext2/ext3文件系统

         -f: 强制检查;

         -p: 自动修复;

        

 

一个文件系统想要使用必须挂载到根文件系统

挂载:将新的文件系统关联至当前根文件系统

卸载:将某文件系统与当前根文件系统的关联关系预以移除;

 

8. mount:挂载

mount 设备 挂载点

         设备:

                   设备文件:/dev/sda5

                   卷标:LABEL=“”

                   UUID: UUID=“”

         挂载点:目录

                   要求:

                            1、此目录没有被其它进程使用;

                            2、目录得事先存在;

                            3、目录中的原有的文件将会暂时隐藏;

 

新挂载的文件系统下会出现

新建的文件系统: lost+found 目录


mount: 显示当前系统已经挂载的设备及挂载点

mount [options] [-o options] DEVICE MOUNT_POINT

         -a: 表示挂载/etc/fstab文件中定义的所有文件系统

         -n: 默认情况下,mount命令每挂载一个设备,都会把挂载的设备信息保存至/etc/mtab文件;使用-n选项意味着挂载设备时,不把信息写入此文件;

         -t FSTYPE: 指定正在挂载设备上的文件系统的类型;不使用此选项时,mount会调用blkid命令获取对应文件系统的类型;

         -r: 只读挂载,挂载光盘时常用此选项

         -w: 读写挂载

         -o: 指定额外的挂载选项,也即指定文件系统启用的属性;

                   remount: 重新挂载当前文件系统

                   ro: 挂载为只读

                   rw: 读写挂载

e.g: mount -o remount,ro /dev/sda5

挂载完成后,要通过挂载点访问对应文件系统上的文件;

 

9. umount: 卸载某文件系统

         umount 设备

         umount 挂载点                

            -l: 强制卸载

 

         卸载注意事项:

                   挂载的设备没有进程使用;




练习:

1、创建一个2G的分区,文件系统为ext2,卷标为DATA,块大小为1024,预留管理空间为磁盘分区的8%;挂载至/backup目录,要求使用卷标进行挂载,且在挂载时启动此文件系统上的acl功能;

# mke2fs -L DATA -b 1024 -m 8  /dev/sda7

 

# mount -o acl LABEL=DATA /backup

或分两步:

# tune2fs -o acl /dev/sda7

# mount LABEL=DATA /backup

 

2、将此文件系统的超级块中的信息中包含了block和inode的行保存至/tmp/partition.txt中;

# tune2fs -l | egrep -i  "block|inode" >> /tmp/partition.txt 

# dumpe2fs -h | egrep -i  "block|inode" >> /tmp/partition.txt 


3、复制/etc目录中的所有文件至此文件系统;而后调整此文件系统类型为ext3,要求不能损坏已经复制而来的文件;

# cp -r /etc/*  /backup

# tune2fs    -j /dev/sda7


4、调整其预留百分比为3%;

# tune2fs -m 3 -L DATA /dev/sda7


5、以重新挂载的方式挂载此文件系统为不更新访问时间戳,并验正其效果;

# stat /backup/inittab

# cat /backup/inittab

# stat

 

# mount -o remount,noatime /backup

# cat

# stat

 

6、对此文件系统强行做一次检测;

e2fsck -f /dev/sda7


7、删除复制而来的所有文件,并将此文件系统重新挂载为同步(sync);而后再次复制/etc目录中的所有文件至此挂载点,体验其性能变化;

# rm -rf /backup/*

# mount -o remount,sync /backup

# cp -r /etc/* /backup

 

 

09_03_磁盘及文件系统管理详解之五


swap分区: 类似windows的虚拟内存

page out = swap in

page in = swap out


free: 查看当前系统上物理内存和交换分区的使用情况 

         -m: MB为单位显示

# free -m
             total       used       free     shared    buffers     cached
Mem:           490        394         95          0        142        101
-/+ buffers/cache:        149        340
Swap:         1023          0       1023


-/+ buffers/cache:        149(减去buffers+cached)         340(加上buffers+cached)

buffer: 存放元数据

cache: 存放数据

 

创建交换分区: mkswap, swapon


1. fdisk /dev/sda

2. n -> <Enter> -> +1G 创建一个新分区,大小1G

3. t -> 8 -> L -> 82    调整分区类型为82(Linux swap),L查看可用分区类型

4. w

5. mkswap /dev/sda8  创建交换分区文件系统

         -L LABEL


6. swapon /dev/sda8  启用交换分区

         -a:启用所有的定义在/etc/fstab文件中的交换设备

    swapoff /dev/sda8 关闭交换分区

 

 

回环设备:使用软件来模拟实现硬件



loopback, 使用软件来模拟实现硬件

如果磁盘已经没有空间可以创建新的分区,可以创建一个镜像文件,当作一块硬盘来用。

 

dd命令:

         if=数据来源

         of=数据存储目标

         bs=# :block size,以多大为单位,如1M

         count=#:计数

         seek=#: 创建数据文件时,跳过的空间大小;   

            dd if=/dev/zero of=/root/tmp seek=1023 bs=1M count=1

            表示跳过1023个bs,复制1个bs,ls查看文件大小为1G,du -sh 查看文件实际只有1M


dd不以文件为单位,而直接复制文件流,可以实现只复制一部分文件。


e.g: 

dd if=/dev/sda of=/mnt/usb/mbr.backup bs=512 count=1  备份磁盘MBR

dd if=/mnt/usb/mbr.backup of=/dev/sda bs=512 count=1  恢复MBR

 

使用文件创建swap分区:

1. dd if=/dev/zero of=/var/swapfile bs=1M count=1024  创建一个1G的文件

2. mkswap /var/swapfile

3. swapon /var/swapfile

 

cat /dev/cdrom > /root/rhel5.iso 把光盘制作成ISO镜像


/dev/null :数据黑洞,吞噬一切数据

/dev/zero:数据泡泡,产生无限0

        

mount命令,可以挂载iso镜像;

mount DEVICE MOUNT_POINT

         -o loop: 挂载本地回环设备

 

文件系统的配置文件/etc/fstab

         OS在初始时,会自动挂载此文件中定义的每个文件系统


如果只是使用命令:mount /dev/sda5 /mnt/test,重启后挂载的文件就不存在了

    

/etc/fstab 格式:    

要挂载的设备         挂载点              文件系统类型                   挂载选项                   转储频率(每多少天做一次完全备份)           文件系统检测次序(只有根可以为1)                

/dev/sda5                  /mnt/test                   ext3          defaults             0 0

 

mount -a:挂载/etc/fstab文件中定义的所有文件系统

 

 

fuser: 查看正在使用文件或套接字文件的进程

         -v: 查看某文件上正在运行的进程

         -k: kill 

         -m: mount

        

         fuser -km MOUNT_POINT:终止正在访问此挂载点的所有进程

        

练习:

1、创建一个5G的分区,文件系统为ext3,卷标为MYDATA,块大小为1024,预留管理空间为磁盘分区的3%,要求开机后可以自动挂载至/data目录,并且自动挂载的设备要使用卷标进行引用;

# fdisk /dev/sdb

   n -> p -> <Enter> -> +5G -> w

# mke2fs -j -L MYDATA -b 1024 -m 3

# mkdir /data

# vi /etc/fstab加一行

LABEL='MYDATA'        /data        ext3        default         0 0


2、创建一个本地回环文件/var/swaptemp/swapfile来用于swap,要求大小为512MB,卷标为SWAP-FILE,且开机自动启用此交换设备;

# mkdir /var/swaptemp

# dd if=/dev/zero of=/var/swaptemp/swapfile bs=1M count=512

# mkswap -L SWAP-FILE /var/swaptemp/swapfile

# vi /etc/fstab

/var/swaptemp/swapfile       swap                  swap                  defaults             0 0


3、上述第一问,如何让其自动挂载的同时启用ACL功能;

#vi /etc/fstab

LABEL='MYDATA'              /data                  ext3          defaults,acl      0 0