Linux 磁盘和文件系统管理

 1. 文件系统。

linux主要使用的时ext2(Linux Second Extended File System)分区,当然,现在使用的基本都是ext3了,但是ext3是以ext2为基础,只不过具有了日志能力而已。

我们知道,无论使用任何操作系统,在分区完成以后我们都有进行格式,为什么要格式化呢?因为不同的操作系统所设定的文件属性和权限以及数据的存储方式都不一样。

格式化,顾名思义,就是将分割槽初始化为操作系统可以识别的格式。这样操作系统才能认识。

比如windows一般使用的是FAT32的,或者NTFS格式的文件系统。而linux使用的则一般是ext2/ext3格式的文件系统。

对于传统的磁盘和文件系统中,一个分区只能被格式化为一个文件系统。但是目前由于LVM(Logical Volume Manager:逻辑卷管理)和RAID(Redundant Array of Independent Disk:独立冗余磁盘阵列)的使用,使得一个分区不一定只能格式化为一个文件系统,而一个文件系统也并非一定只有一个分区组成。比如银行系统的服务器一般都需要单位为T的,这时候经常会选择RAID来对磁盘进行操作。

2. 分区格式化后的内部构成。

大家可能在想,为什么要格式化啊,分区不就是要放数据的嘛?直接把需要的数据放进去就好了啊,其实并非如此简单的。

一个档案不仅仅要有数据,还有属性,权限等等很多东西,并且你如果通过档案的名称把档案的数据都找出来也是一个问题,还要考虑到效能。

一般的文件系统包含以下3个内容,

inode  ---存放档案的属性,权限,以及此档案的内容所在的位置(data block 的号码)等等信息。一个档案占用并且只占用一个inode

data block -----数据区块,存放该档案的数据内容

superblock  ----存放整个文件系统(File System)的整体信息,比如inode/block总量,使用率,剩余量,以及文件系统的格式等等相关的信息。

由于文件系统中每一个档案对应一个inode,而inode中又记录有此档案数据内容所在的block号码,所以我们只有找到档案的inode号码,就可以读取档案的内容了。

比如找到“1.txt”这个档案的inode号码为202,而202号inode中就记载这个档案的数据内容存放的block号码为12,15,17,24。这样我们就可以一口气打开此文档,查看内容了。

这种文件系统被称为“索引式文件系统”,

不过也有些文件系统并非如此,比如FAT格式的,此格式一般是闪存盘较多使用,也就是你随身携带的U盘了。

FAT格式的文件系统并没有inode存在,所以如果遇到较大的文件时,你不可以在一开始就把所有的档案内容都读出来,比如345这个档案占用了4个block,此时FAT会像如下方式读取:

先读取第一个block的内容,12号block,而12号block中有记载下一个block的号码15,这样读取一个block才可以知道下一个block的位置。这样下去知道读完整个文档。

这样读法如果一个档案的block分布的太离散的话就会比较的不方便,比如一个分区范围是从1200----2000,此时如果12、17号扇区在1200上,而15,24在2000上。读写头要来回3趟才能读完这个档案。

所谓的“磁盘碎片整理”就是这个意思,磁盘使用一定时间以后,block的分布就会比较离散了,此时效能就会降低,而通过“碎片整理”可以将同一文档的block 尽量集中。

 

3. ext2文件系统。

当分区格式化为文件系统以后,除非重新格式化(mke2fs)或者改变分割的大小(resize2fs),否则inode和block的数量就是固定的了。

此时如果文件系统太大,比如好几百个G,这样如果把如此庞大的inode和block放在一起就显得不太合适,不利于效能的发挥。

故此ext2文件系统在格式化时一般是分为若干个block群组,每个群组里包含自己的inode,block,superblock......等等,如下图所示。

(1)data block --- 数据区块

ext2支持的block的大小有3中,1k,2k,4k。由此形成的单文件最大容量和文件系统最大容量的对应关系如下:

BLOC大小1k2k4k
单文件最大容量16G256G2T
文件系统最大容量2T8T16T

一个档案如果比较大,可以放置到多个block中去,但是一个block中却只能放置一个档案的内容,即使该block没有被占用光。比如,如果你建立了一个档案A,他包含2个字节的内容,而你的block大小为4k,那么这个档案依然要占用4k的空间,剩余的容量就不可以再使用了。除非该档案删除以后该block被其他数据覆盖。直接给一个windows的截图好了。下图这个档案虽然只有1个字节的大小,但是依然占用了4k的空间。

我们可以看出,block的大小如果太大就会浪费很多的空间,但是如果太小,比如1k,那么1个大文件占用的block数量就是以前的4倍,如果你有很多这样的大文件,读写的效能就会降低,所以格式化的时候究竟要用多大的block还是要实际情况实际对待的。

(2)inode table (inode 表)

inode表记录了档案的权限和属性相关的信息,以及数据内容指向的block号码。和block一样,inode的大小和数量在格式化后都已经固定了,而由于一个文件只能对应一个inode,所以改文件系统最大能够建立多少个文件也是固定的。inode的大小为128bytes。系统在读取文档的时候,先要找到inode号码,然后用inode中档案的权限和用户相对照,符合则读出数据,否则拒绝。

inode中记录档案内容的指向,分为12个直接,一个间接,一个双间接,一个三间接。而每一个block号码的记录要花费4bytes。供15*4=60bytes。剩余的68bytes记录其他信息。

如果单个block的大小为1k的话,那么15个指向可以存储的数据量为

12*1k+1*(1024bytes/4bytes)*1k+1*(1024bytes/4bytes)*(1024bytes/4bytes)*1k+1*(1024bytes/4bytes)*(1024bytes/4bytes)*(1024bytes/4bytes)*1k

=12k+256k+(256*256)k+(256*256*256)k=12k+64M+16384M:=16G

(3)superblock (超级区块)

记录整个文件系统的inode和block的大小,数量,以及文件系统最户一次挂载时间,fsck的时间等等。

superblock的信息非常重要的。

事实上除了第一个 block group 内会有 superblock 外,后续的 block group 不一定有 superblock , 而若有 superblock 则该 superblock 主要是做为第一个 block group 内 superblock 的备份。

(4)Filesystem Description (文件系统描述说明)

这个区段可以描述每个 block group 的开始和结束的 block 号码,以及说明每个区段 (superblock, bitmap, inodemap, data block) 分别介于哪一个 block 号码间。

(5)block bitmap (区块对照表)

记录那些block被使用,那些没有被使用。

(6)inode bitmap (inode 对照表)

记录那些inode被使用,那些没有被使用。

4. ext2文件系统查看命令。

dumpe2fs  /dev/sda7  ----查看sda7这个分割槽的信息,包含superblock的信息和所有的block group的信息。

如果仅仅想查看分割槽的整体信息,也即superblock信息,可以使用

dumpe2fs -h  /dev/sda7 

我们可以使df命令找出目前系统中所有挂载的装置信息。

df  ----列出目前系统中所有实体挂载信息。

df -a   ----完全列出目前系统中的挂载信息(包含"proc"等等挂载信息)

df -h  ----以人们容易看懂的方式列出目前系统中挂载的所有实体分割槽的信息。

df -m  ---以M为单位列出目前系统中挂载的所有实体分割槽的信息

df -k  ---以k为单位列出目前系统中挂载的所有实体分割槽的信息

fdisk -l  ----列出目前系统中所有存在的实体分割的信息

5. journaling filesystem(日志式文件系统)

ext3是ext2的升级版本,比ext2多了日志功能。

由于每一个档案只能有一个inode,因此我们可以透过判断 inode 号码来确认相同文件名是否为相同的档案。

想要知道你的 Linux 支持的文件系统有哪些,可以察看底下这个目录:

ls -l /lib/modules/$(uname -r)/kernel/fs

6.磁盘于目录的容量

查看磁盘的容量使用的是:df,df在上文已经基本介绍了,这里不再赘述。

查看目录

du -m    ---以M为单位列出档案或者目录的容量

du -k    ---以k为单位列出档案或者目录的容量

du -h  ----以人们容易看懂的方式列出档案或者目录的容量

du -s  ----只列出总量,而不列出每个目录占用容量

由于我们一边想看目录或者档案中的容量,都是想看总的容量,但是也希望有清晰的单位,所以可以使用du  -sh xxxx

7. 实体链接和符号链接

(1)Hard Link----实体链接(实体链接只对档案有效,不支持目录)

我们知道一个档案只能有一个inode,如果有2个档案的inode号码一模一样,那么这两个档案其实是一个档案。这就是“实体链接”。

因为目录的block中记载的是该目录所含档案或者目录的名称和对应的inode号码,所谓的实体链接就是在目录的block中增加一条这样的记录。

所以说实体链接一般不占用空间。

由于实体链接使用的是同一个inode,就好比同一个房间的两把钥匙,所以查看和修改的都是同一个档案。

同时还有备份的功能,其中一个如果被删除了,那么另一个照样可以用。

实体链接的创建指令为:ln

ln  /etc/passwd   ./passwd

ls -ld /etc/passwd ./passwd  -----你会发现除了文件名不一样之外,其他的一模一样。

每一个档案新增一个实体链接,他的inode数量就会增加1.

请注意,同一个inode的档案都是同一个档案指的是在一个文件系统内部,如果不同的文件系统,即使有相同的inode也不是一个档案。

因此“实体链接”不能跨文件系统。

(2)Symbolic Link (符号链接,也叫快捷方式)

创建方法为:

cd /tmp

touch  123.txt

ln  -s  /tmp/123.txt  /root/123.txt

ls -lid /root/123.txt /tmp/123.txt

可以发现,两个文件的inode不一样,也就是说是两个不同 的档案,符号链接中存储的仅仅是其链接档案的档名而已,故此,他的大小等于所链接文档的档名长度。

8. 磁盘的分割、格式化、检验与挂载

(1)分区

对磁盘进行分割可以使用fdisk命令。此命令直接键入后,会有非常详细的说明,属于傻瓜操作,所以就不多介绍了

fdisk -----按提示操作即可。

fdisk  -l   ----查看当前的硬盘分区情况。

(2)格式化

分区以后就需要格式化了。格式化有两种方法,一种是直接使用mkfs(make filesystem)来格式化。方法如下:

mkfs -t  文件系统格式 装置文件名    如:

mkfs -t ext3 /dev/sda10  

虽然使用mkfs可以方便的格式化文件系统,但是这样格式化的很多设置就是默认的了,如果要使用更加精细的设置,比如文件系统的标头(Label)、Block大小以及inode 数量

那就要使用另一个命令:mke2fs

mke2fs  -L  ----设定格式化以后文件系统的卷标(volume)名称

mke2fs  -b  ----设定block的大小,分为1024,2048,4096这三种。

mke2fs  -j   -----设定为日志文件系统,即ext3格式。

如果是用上例中的内容,想把/dev/sda10   这个分割格式化为block大小为2k,卷标为mylinux的ext3系统。则可以使用如下语句

mke2fs  -j  -L  mylinux  -b 2048  /dev/sda10

其实如果没有特殊需求,比如希望能自己设定block的大小的话,那么mkfs其实已经很好用了。

(3)检查

磁盘检查命令,fsck(filesystem check)

fsck -t 文件系统类型  装置档案名 (基本选项)

fsck -C  --可以在检验的过程当中,使用一个直方图来显示目前的进度!(很好的一个功能)

fsck -y   ---自动修复检查到的有问题的扇区,所以就不用一直按y了。

fsck  -C -y -t ext3 /dev/sda10   ---检查/dev/sda10 这个ext3格式的文件系统并自动修复,同时显示完成进度。

badblocks  装置名称   -------检查硬盘是否有坏轨。

(4)磁盘挂载于卸除

1.一个文件不能挂载到多个挂载点

2. 一个挂载点不能挂载多个文件系统

3. 理论上作为挂载点的目录必须是空的

挂载指令:mount

mount   装置档案 挂载点      ------->   mount  /dev/sda10  /home/123   --------将/dev/sda10 这个分割挂载到/home/123   这个挂载点

由于整个系统最重要的就是根目录了,所以根目录是不能被卸除的。只能被重新挂带。

特别是在单人维护模式下,根目录常会被挂载为只读,此时重新挂载并修改参数就比较重要了。

mount -o remount,rw,auto /

通过mount也可以实现将一个目录挂载到另一个目录。类似于符号链接(一般在不支持symbolic link的地方使用)。

mkdir /mnt/home

mount  --bind  /home  /mnt/home   -----注意,这样得到的两个目录的inode时一样的。(和hard link的区别在于hard link不支持目录,和符号链接的区别在于符号链接是一个新档案,和原目录的inode是不一样的。)

(5)磁盘参数修订

我们一直在强调,linux中,所有的装置都是一个档案,那么档案是如何代表这些装置的呢?那就是major(主装置代码)和minor(次装置代码)。他们和硬盘的对应关系如下所示:

装置名majorminor
hda30-63
hdb364-127
sda80-15
sdb816-31

当然,在正常情况下,这些装置的major和minor都是会自动分配的,不用我们去操心的。但是,某些特殊情况下,我们可能还是得要手动处理装置档案的。指令如下:

mknod  装置名称 装置类型【b,c,p】 major  minor   其中装置名称为/dev/xxxx  ,装置类型b为“储存设备档案”,如硬盘。c为“输入设备档案”,如鼠标。

示例:

mknod  /dev/sda10 b 8 10

有时候我们格式化完了磁盘,觉得卷标不好看,希望可以修改卷标,那么怎么办呢?没问题,可以使用e2label这个指令。

e2label  装置档名  新卷标  ------>   e2label  /dev/sda10 newlabel   ---将/dev/sda10 这个分割的卷标修改为newlabel  

由于ext3是向下兼容ext2的,如果我们的一个文件系统为ext2格式,但是今天我们改变主意了,想把它转换为ext3的,那我们是不是需要重新格式化一遍呢?不需要的。

可以使用tune2fs 这个指令来完成。 这个指令也很简单。

tune2fs -j  /dev/sda10   -----假设原先/dev/sda10为ext2格式的,使用此命令就可以把它转换为ext3格式的了。

(6)设定开机挂载

开机挂载项的设定在/etc/fstab和/etc/mtab,如果我们要设定开机的时候挂载那些文件系统,那么就可以在这里新增了。

cat  /etc/fstab    -----大概的造型如下所示:

# Device                      Mount point     filesystem    parameters      dump       fsck

LABEL=/                        /                        ext3                 defaults             1               1

LABEL=/home             /home             ext3                 defaults             1               2

tmpfs                             /dev/shm        tmpfs              defaults             0               0

...........                            ...............          ...........              .............             ......           ......   这一行代表省略的意思。。。

我们可以发现fstab中由六项组成。

(1)device(label)

也就是装置名,或者是卷标。这两个都可以。系统默认是卷标。

由于sda7和sda8这个两个分割槽是我在装linux的时候使用图形分区的,并没有特别设置卷标,所以系统就自动以他们各自的挂载点/和/home这两个目录的名称作为卷标了。

当然你也可以使用/dev/sda7来替换第一项的/。这也是可以的。

(2)mount point

挂载点,这个就不用说了。

(3)filesystem 

文件系统类型,这个也不说了。

(4)parameters

挂载时的各类参数。包括“async/sync 异步/同步 ”、“auto/noauto自动/非自动”......等等很多的参数。

一般情况下使用defaults即可。

(5)dump

能否被dump这个备份指令作用。dump是一个用来备份的指令。我们可以通过fstab这个档案来指定是否需要进行dump备份,0代表不备份,1代表每天备份,2代表不定时备份。正常情况下这个参数不是0就是1了,对应我们要使用进行存储的实体文件系统,正常情况下设1即可。

(6)fsck

是否以 fsck 检验扇区,0,不检测  1,最先检测   2,也检测   一遍情况下就是0,2   只有根目录“/”才设置为1,代表“/”根目录要开机第一个检测。当然,像swap此类的分割就不用检测了。

看以下例子:我们将/dev/sda10(label=newlabel)这个分割槽,设定开机挂载到/mnt/sda10

mkdir /mnt/sda10  ----这个步骤不要忘了,一定要保证此目录是存在的,否则可能出现开不了机的情况。

nano /etc/fstab - ---使用nano文本编辑器,加入以下内容

LABEL=newlabel    /mnt/sda10   ext3    defaults    1   2

然后使用以下指令测试一下 

mount  -a    -----将/etc/fstab中的所有项目全部挂载。

df                  -----列出所有已挂在的文件系统,如果有/dev/sda10的挂载信息,说明我们的开机挂载设定是没问题的。

但是如果一不小心,我们的开始挂载还是弄错了,导致开机出现问题啦,无法正常开机。这怎么办呢?

没事,进入单人维护模式。 即使用single 模式启动。

然后

cat  /etc/fstab     ----查看/etc/fstab的信息,假设这个没有错,而是/mnt/sda10这个目录不存在。那么我们需要把目录建立起来。

mkdir  /mnt/sda10  ----建立目录,这个地方一些版本的linux是可以建立的,也有一些版本的linux在单人维护模式下根目录“/”处于“只读”(read only)状态。这样你根本就无法成功的创建/mnt/sda10这个目录。那怎么办呢?呵呵,使用上文说过的remount来重新挂载啊

mount -o remount,rw  /    ----以可以读写方式重新挂载根目录。

mkdir  /mnt/sda10  ----此时就可以建立目录了。

ok,搞定。

(7)特殊装置 loop (回环装置)挂载

1. 挂载光盘/DVD映象文件

如果在你的机器上有映像档案,比如iso文件,你想查看他的内容,而又不想把它刻录称为光盘,那该怎么办呢?

我们可以使用mount 来挂载这个iso文件,例:

我们的u盘中有一个centos.iso这么一个映像档,我们希望直接能够查看这个映像档的内容,可以这么做:

mkdir /media/disk  ---在media目录下建立一个disk目录,用来挂载u盘

fdisk -l    -------查看计算机的磁盘分区情况,藉此找到我们U盘的装置档名。假设为 /dev/sdb

mount /dev/sdb /media/disk   ----将u盘挂载到/media/disk这个挂载点。

ls -l  /media/disk   ----查看/media/disk目录下的内容,找到我们要查看的centos.iso

mkdir  /mnt/centos  ---建立centos这个目录,以便一会挂载使用

mount -o loop  /media/disk/centos.iso  /mnt/centos  ---将iso映像档案centos.iso挂载到/mnt/centos这个目录

ls  -l /mnt/centos   ---现在可以查看centos内的内容了。

df -h      ----查看本机的已挂载信息,发现u盘挂载在了/media/disk这个挂载点,而u盘内的centos.iso则挂载到了/mnt/centos这个挂载点。

2. 建立大档案以制作loop装置档案。

既然影像档案可以挂载,那么我们可不可以自己在某一个分割中开辟出一个空间,来独立的挂载,是它看起来比较像一个文件系统呢?

(为什么有这种想法呢?其实我们可以想一下windows中的vmware,此类虚拟机就是在windows中的某一个盘开辟出一块空间,这样你就可以在这个空间内安装另一套操作系统了,表面上看起来就像多了一个分区一样。又比如我们安装linux的时候,只是分了一个分区20G,并挂载到了根目录,这样我们后续觉得不太方便,希望能分出10G来,挂载到另一个文件夹,此时也可以这么做)

下边我们开始做一个例子(按照上文的假设):

dd if=/dev/zero of=/home/bigfile bs=1M count=10240   -----使用dd指令建立一个10个G大的文件,全名为“/home/bigfile ”

mkfs -t ext3 /home/bigfile   ----将此档案格式化为ext3类型

fdisk -l  ---通过此命令观看,可发现,计算机并没有新增任何的分区。

mount -o loop /home/bigfile /mnt   ----将此空间挂载到/mnt这个挂载点

ok,这样就搞定了,你再进入/mnt这个目录的时候,使用的就是你格式化后的那个10G的空间啰。

3.建立内存置换空间swap

建立swap有两种方法,一种是直接使用实体分区建立,一种是使用档案来建立swap。

第一种:

fdisk   。。。。。。。。  ------使用fdisk建立一个512M的分割,这里就不重复了,不过有一点是需要注意的,就是建立了分割以后,默认的是linux的标准分割,你需要把他们的system id 修改为swap的,这样才能作为swap来使用。(linux的id为83,linux的swap的id为82,这个可以通过l来查询,t来修改)。修改号以后按w写入分区表,然后退出。记得要重读分区表哦,即执行指令partprobe

mkswap  /dev/sda11  ----通过mkswap指令来格式化此分区。

free  ---透过此指令查看linux的内存以及swap的使用情况,此时我们发现swap的大小并没有改变啊,还是原来的大小啊?因为还没有启用此swap呢

swapon /dev/sda11  ---启用/dev/sda11这个swap

free  ----再次查看,我们发现swap的大小已经改变了。

swapon -s  -----查看目前使用的swap装置有哪些,想知道更多请man swapon

第二种:

dd  if=/dev/zero of=/mnt/swap1 bs=1M count=512  ----利用dd指令建立一个512M大小的档案。

mkswap /mnt/swap1   ----  通过mkswap指令来格式化此档案

swapon  /mnt/swap1   -----启用此swap

free   ---查看swap是否已经改变

swapon -s  ---查看目前使用的swap装置有哪些

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值