9、磁盘及文件系统

磁盘及文件系统

硬盘的物理构成:

    扇区(sector)、磁道(track)、磁头、柱面(cylinder)

分区:就是记录每一个分区的起始柱面和结束柱面。分区信息存放在0柱面0磁头1扇区上:MBR 主引导记录(446字节)+DPT磁盘分区表(64字节)+结束标志(2个字节)

      硬盘的主引导记录(MBR)是不属于任何一个操作系统的,它先于所有的操作系统而被调入内存,并发挥作用,然后才将控制权交给主分区(活动分区)内的

  操作系统,并用主分区信息表来管理硬盘。

文件系统是操作系统用于明确存储设备(常见的是磁盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。

    block :数据存储的最小单元

    inode:索引节点,全局唯一编号,除了记录文件的属性外,同时还具有指针功能,指向文件内容放置的快

        (里面保存的是文件的权限,所有者,所属主等基本信息)

1、文件的拥有者与用户组(owner/group)

2、文件的访问模式(read/write/excute)

3、文件的类型(type)

4、文件建立或状态改变的时间(ctime)、最近一次的读取时间(atime)、最近修改时间(mtime)

5、文件的大小

6、定义文件属性的标志(flag),如setUID...

7、文件真正内容的指针(pointer)

创建目录:分配一个inode和至少一个block

          inode记录该目录的相关属性,并指向分配到的那个快;

  block记录在这个目录下的相关文件(或目录)的关联性

创建文件:分配至少一个inode与相对于该文件大小的快数量

          inode不记录文件名,而是记录文件的相关属性,文件名记录在目录所属的block区域

例如:读取/etc/crontab的流程如下:

    1、操作系统根据根目录(/)的相关数据可获取/etc目录所在的inode,并读取/etc这个目录所有相关属性

2、根据/etc的inode的数据,可以获取/etc目录下所有文件的关联数据是放置在哪一个block中,并前往该block读取文件的关联性内容

3、由上步骤的block中,可以知道crontab文件的inode所在地,并前往该inode

4、由上步骤的inode中,可以获取crontab文件的所有属性,并前往由inode所指向的block区域,获取crontab文件内容

块组:block group 对用户是不可见的,子逻辑区域,有个超级标示区

文件系统构成:(dumpe2fs 可以查看)

    superblock(超级块):记录整个文件系统相关信息

    1、block与inode的总量

2、未使用和已使用的inode/block数量

3、文件系统的载入时间、最近一次写入数据的时间、最近一次检验磁盘(fsck)的时间等文件系统的相关信息

4、有效位的值,已载入为0,未载入为1

group description(组描述):记录此block由何处开始记录

    block bitmap(快位图):此处记录block是否使用

inode bitmap(inode位图):此处记录inode是否使用

inode table(inode表):为每个inode的数据存放区

data block(数据块):为每个block的数据存放区


metadata  bitmap (块位图)dentry 目录项

创建文件:先在目录下创建一个条目,把名字和iNode对应上,回到源数据,指定块位置

删除文件:删除条目里面的名字和iNode对应关系,将对应的iNode标记为0

          通过inode号码来删除文件:find ./ -inum 400935 -exec rm -rf {} \;  

          extundelete: linux下高效数据恢复工具 http://extundelete.sourceforge.net/  安装时需要的依赖包 e2fsprogs-lib e2fsprogs-devel

复制文件:不同的inode和block

剪切文件:同一个分区,inode号和磁盘块位置都没有变,只是把条目里面的名字改变了一下

链接:硬链接和软链接(符号链接),多个文件指向同一个iNode,硬链接;符号连接,指向的是源文件的路径,而不是文件块

ln (link) [-s -v]  源文件  链接

硬链接:在某个目录下的block中增加一个文件关联数据,不会用到inode与磁盘空间

        只能对文件进行创建,为了避免循环引用

        不能跨文件系统,可以在不同目录下

创建硬链接可以增加文件被连接的次数

符号链接:建立一个独立的文件,这个文件会让数据的读取指向它连接的文件内容

        可以对目录创建

可以跨文件系统

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

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

-b 删除,覆盖以前建立的链接

-d 允许超级用户制作目录的硬链接

-f 强制执行

-i 交互模式,文件存在则提示用户是否覆盖

-n 把符号链接视为一般目录

-s 软链接(符号链接)

-v 显示详细的处理过程

du    查看文件大小  [-s -h ] 

-s 只分别计算命令列中每个参数所占的总用量

-h 做单位转换

df  查看硬盘使用情况

-i  查看inode的使用情况

-P 不换行显示

-h  做单位转换

设备文件:

b:块设备文件,以块为单位,随机访问

c: 以字符为单位,是线性设备,访问时有先后顺序

例:ls -l /dev

主设备号(标示设备类型,major number)   

次设备号(标示同一类型的不同设备,minor number)

创建设备文件:mknod  -m name type major ninor

硬盘的设备文件名:

IDE ATA  :hd

SATA  SCSI USB :sd

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

IDE:    第一个IDE口,控制器,主 从hda  hdb

第二个IDE口,主从  hdc hdd

fdisk 查看当前系统识别的硬盘和分区的情况

fdisk -l [/dev/to/smoe_device_file]

还可用来管理分区

fdisk /dev/sda

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

n:创建一个新的分区

d:删除一个分区

w:保存并退出

q:不保存退出

t:修改分区类型(文件系统类型)

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

cat /proc/partitions  查看分区

partprobe  [/dev/sda]  通知操作系统分区表的变化

partx -a [/dev/sda]    告诉内核磁盘分区是否存在及其编号

cat /proc/filesystem  查看文件系统类型

高级格式化:mkfs -t ext4

mkfs -t msdos /dev/hdb3

mkfs.ext2 、mkfs.ext3 、mke2fs

-b:分区时设定每个数据区块占用空间大小,目前支持1024, 2048 以及4096 bytes每个块。

-i:设定inode大小

-N:设定inode数量,有时使用默认的inode数不够用,所以要自定设定inode数量。

-c:在格式化前先检测一下磁盘是否有问题,加上这个选项后会非常慢

-L:预设该分区的标签label

-j:建立ext3格式的分区,如果使用mkfs.ext3 就不用加这个选项了

查看磁盘超级块的信息:

    tune2fs -l /dev/sda[n]  调整ext2/ext3/ext4文件系统参数

    dumpe2fs -h /dev/sda[n]  显示ext2/ext3/ext4文件系统信息

二.swap

swap分区:主要是用来内存过载使用,可以和内存上暂停进程的页面保存在swap分区中,再次启用时再分配页面,pageoutswap分区:主要是用来内存过载使用,可以和内存上暂停进程的页面保存在swap分区中,再次启用时再分配页面,pageout pagein ,swap out swap in ,发现有频繁的换进和换出的时候就需要加内存。

1.虚拟内存:

虚拟地址:线性地址;

页面的换进和换出,允许了内存的过载使用

计存器1纳秒,缓存10纳秒,内存10毫秒,磁盘秒

free 查看物理内存和交换空间使用情况

-m

buffers 缓冲  cached 缓存

fdisk命令中,调整分区类型为82;

创建交换分区:

格式化:# mkswap /dev/sda8,先调整分区类型为82,fdisk,

-L LABEL

swapon /dev/sda8,启用该交换空间

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

swapoff /dev/sda8

回环设备

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

创建一个镜像文件,120G,当作一个硬件设备来使用

dd命令:

if=数据来源

of=数据存储目标

bs=1

count=2

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

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

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

可用来备份和恢复mbr

dd if=/dev/zero of=/var/swapfile  bs=1M count=1024

seek 跳过多大的空间

mkswap 格式化为swap分区

    1、通过fdisk创建swap分区或者使用dd命令创建一个虚拟内存的文件

  dd if=/dev/zero of=/tmp/swap bs=1M count=1024

2、mkswap进行swap分区格式化

3、swapon 激活swap分区

  swapoff 关闭swap分区

mount:挂载命令

    命令格式:mount [-t vfstype] [-o options] device dir

-a 挂载fstab中提到的所有文件系统

-o remount 重新挂载已挂载的文件系统

-o loop:用来把一个文件当成硬盘分区挂接上系统

    -o ro:采用只读方式挂接设备

    -o rw:采用读写方式挂接设备

挂接光盘镜像文件

1、从光盘制作光盘镜像文件。将光盘放入光驱,执行下面的命令。

        #cp /dev/cdrom /home/sunky/mydisk.iso 或

        #dd if=/dev/cdrom of=/home/sunky/mydisk.iso

2、挂载光盘镜像文件

    #mount -o loop -t iso9660 /home/sunky/mydisk.iso /mnt/vcdrom

三.自动挂载

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

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

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

/dev/sda5 /mnt/test ext4 defaults 0 0

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

/etc/fstab文件  实现开机自动挂载

    设备  挂载点  文件系统类型  挂载参数  是否执行备份命令dump  是否启动使用fsck扫描磁盘

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

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

-k:

-m:针对目录,也就是挂载点,一般和-k 一起使用

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

wodim --devices 查看设备名(没有挂载的光盘)

练习:

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

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

# mkdir /var/swaptemp

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

# mkswap LABLE=SWAP-FILE /var/swaptemp/swapfile

/etc/fstab

/var/swaptemp/swapfile  swap swap defaults 0 0

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

/etc/fstab

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

Linux: 查看VFS结构图

VFS:virtual filesystem  ,interface:system call

当前,除了Linux标准的文件系统Ext2/Ext3/Ext4外,还有很多种文件系统,比如reiserfs, xfs, Windows的vfat NTFS,

网络文件系统nfs 以及flash 文件系统jffs2, yaffs/yaffs2 ubifs。

linux通过叫做VFS的中间层对这些文件系统提供了完美的支持。

VFS存在的意义

        1. 向上,对应用层提供一个标准的文件操作接口;

        2. 对下,对文件系统提供一个标准的接口,以便其他操作系统的文件系统可以方便的移植到Linux上;

        3. VFS内部则通过一系列高效的管理机制,比如inode cache, dentry cache 以及文件系统的预读等技术,

    使得底层文件系统不需沉溺到复杂的内核操作,即可获得高性能;

        4. 此外VFS把一些复杂的操作尽量抽象到VFS内部,使得底层文件系统实现更简单

        VFS 是一种软件机制,也许称它为 Linux 的文件系统管理者更确切点,与它相关的数据结构只存在于物理内存当中。

所以在每次系统初始化期间,Linux 都首先要在内存当中构造一棵 VFS 的目录树(在 Linux 的源代码里称之为 namespace),

实际上便是在内存中建立相应的数据结构。

VFS: virtual filesystem  中间层

每个分区都是一个单独的文件系统

物理和逻辑之间的关系

你可能感兴趣的:(9、磁盘及文件系统)