zoukankan      html  css  js  c++  java
  • 一起来学linux:磁盘与文件系统:

    对于文件系统来说,windows上最长用的就是FAT32和NTFS。在Linux上时候用的是Ext2。在linux中,文件权限与文件属性这两部分会被存储在不同的块,权限与权限放置到inode中,实际数据放置到data block当中。另外还有一个超级块(superblock)会记录整个文件系统的整体信息。包括inode与block的总量,使用量,剩余量以及文件系统的格式与相关信息等。
    Super block: 记录此文件系统的整体信息,包括inode/block的总量,使用量,剩余量以及文件系统的格式与相关信息
    inode: 记录文件的属性,一个文件占用一个inode, 同时记录此文件的数据所在的block号码
    block: 实际记录文件的内容,如果文件太大,会占用多个block
    三者之间的关系可以参考下图:

    由于很多时候系统的文件太大,因此将所有的indoeblock放在一起就不容易管理。Ext2文件系统在格式化的时候是会划分多个块组。每个块组都有独立的indoe/block/super block系统,就好比我们在上学的时候,一个年级会被分成不同的班级。每个班都有各自的班主任。

    结构如下图;

    文件系统的最前面是一个启动扇区(boot sector) 这个启动扇区可以安装引导装载程序。这样在安装多系统的情况下,比如linuxwindows双系统的时候就能够将不同的引导装载程序安装到个别的文件系统最前端。这样才能够制作出多重引导的环境。

    Data blocks: 这是用来放置数据的地方。支持的block大小有1KB,2KB,4KB三种。block大小和文件系统的对应关系如下:

    block大小:单一文件限制:最大文件系统总容量

    1KB16GB2TB

    2KB256GB8TB

    4KB2TB16TB

    block的大小与数量在格式化万就不能再修改了。除非重新格式。每个block内最大只能放置一个文件的数据。如果文件大小大于block大小,则会占据多个block. 反之,如果文件大小小于block大小,则该block的剩余空间就不能再被使用了。

    比如,文件系统设置的block大小为4kb, 文件系统有10000个小文件。每个文件的大小都小于50字节。那么算算磁盘会浪费多少容量:

    每个block会浪费4096-50=4046字节。所有文件容量为50×10000=488KB。但此时浪费的容量为4046×10000=38M。不到1M的文件系统导致将近40M的空间浪费。因此在读文件系统格式的时候需要考虑实际的使用情况来设置block大小,否则会导致大量的浪费。


    inodetableinode表格)

    每个indoe记录如下信息:

    1 文件的访问模式

    2 文件的所有者与组

    3 文件大小,创建或者改变的时间,最近一次的读取时间,最近修改的时间

    4 定义文件特性的标志(flag),如SetUID

    5 文件的真正指向

    每个inode的大小都固定为128bytes。 每个文件占用一个indoe。系统在读取文件时需要先找到inode,并分析inode所记录的权限与用户是否符合。若符合才能开始实际读取block的内容


    superblock(超级块)

    每个超级块记录如下信息:

    1 blockinode的总量

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

    3 blockinode的大小

    4 文件系统的挂载时间,最近一次写入数据的时间,最近一次校验磁盘时间等文件信息


    前面介绍了文件系统的概念,下面来看下如何查询这些文件信息

    1 首先查找根目录的磁盘信息,使用df命令查到根路径/ 存在与/dev/sda1

    root@zhf-linux:/home/zhf# df

    Filesystem 1K-blocks Used Available Use% Mounted on

    udev 1010832 0 1010832 0% /dev

    tmpfs 205944 6816 199128 4% /run

    /dev/sda1 238171776 11450900 214599328 6% /

    tmpfs 1029712 15864 1013848 2% /dev/shm

    tmpfs 5120 4 5116 1% /run/lock

    tmpfs 1029712 0 1029712 0% /sys/fs/cgroup

    cgmfs 100 0 100 0% /run/cgmanager/fs

    tmpfs 205944 64 205880 1% /run/user/1000


    2 通过dumpe2fs -h /dev/sda1查看超级块的信息。结果如下,可以看到blocksize, inodeblock的数量以及各种时间记录。

    Filesystem volume name: <none>

    Last mounted on: /

    Filesystem UUID: 32bb6dca-412b-4853-95fe-8f3c4ea6a303

    Filesystem magic number: 0xEF53

    Filesystem revision #: 1 (dynamic)

    Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize

    Filesystem flags: signed_directory_hash

    Default mount options: user_xattr acl

    Filesystem state: clean

    Errors behavior: Continue

    Filesystem OS type: Linux

    Inode count: 15138816

    Block count: 60525824

    Reserved block count: 3026291

    Free blocks: 56683445

    Free inodes: 14741489

    First block: 0

    Block size: 4096

    Fragment size: 4096

    Reserved GDT blocks: 1009

    Blocks per group: 32768

    Fragments per group: 32768

    Inodes per group: 8192

    Inode blocks per group: 512

    Flex block group size: 16

    Filesystem created: Thu Nov 26 04:59:07 2015

    Last mount time: Sat Nov 18 14:36:46 2017

    Last write time: Sat Nov 18 14:36:35 2017

    Mount count: 134

    Maximum mount count: -1

    Last checked: Thu Nov 26 04:59:07 2015

    Check interval: 0 (<none>)

    Lifetime writes: 62 GB

    Reserved blocks uid: 0 (user root)

    Reserved blocks gid: 0 (group root)

    First inode: 11

    Inode size: 256

    Required extra isize: 28

    Desired extra isize: 28

    Journal inode: 8

    First orphan inode: 12195349

    Default directory hash: half_md4

    Directory Hash Seed: 970db111-3cce-4073-baa7-d65162c82032

    Journal backup: inode blocks

    Journal features: journal_incompat_revoke

    Journal size: 128M

    Journal length: 32768

    Journal sequence: 0x00030c62

    Journal start: 16937


    那么实际文件的inode数又该如何查询呢。这就需要用到ls -li命令。位于最左端的就是文件的inode号码。

    root@zhf-linux:/home/zhf# ls -li /home/zhf/zhf

    total 280704

    6038783 -rw-r--r--+ 1 root root 10 Sep 18 21:55 acl_test1

    7866278 drwxr-xr-x 3 root root 4096 Nov 8 10:35 c_prj

    6037303 -rw-r--r-- 1 root zhf 37 May 24 2016 crontest.cron

    6031954 -rw-r--r-- 1 zhf zhf 7733727 Nov 7 2016 Django-1.10.3.tar.gz



    linux文件系统的操作:

    磁盘的整体数据都在superblock中,但是每个各别文件的容量则在inode当中记载的。那么在命令行上如何查看呢。这就需要用到dfdu的命令。

    df: 列出文件系统的整体磁盘使用量

    du:评估文件系统的磁盘使用量


    df -h可以很直观的看到每个分区的容量的大小

    Filesystem Size Used Avail Use% Mounted on

    udev 988M 0 988M 0% /dev

    tmpfs 202M 6.7M 195M 4% /run

    /dev/sda1 228G 11G 205G 5% /

    tmpfs 1006M 176K 1006M 1% /dev/shm

    tmpfs 5.0M 4.0K 5.0M 1% /run/lock

    tmpfs 1006M 0 1006M 0% /sys/fs/cgroup

    cgmfs 100K 0 100K 0% /run/cgmanager/fs

    tmpfs 202M 56K 202M 1% /run/user/1000


    将目前各个分区当中可用的inode数量列出

    root@zhf-linux:/home/zhf# df -ih

    Filesystem Inodes IUsed IFree IUse% Mounted on

    udev 206K 511 205K 1% /dev

    tmpfs 215K 811 214K 1% /run

    /dev/sda1 15M 388K 15M 3% /

    tmpfs 215K 6 215K 1% /dev/shm

    tmpfs 215K 6 215K 1% /run/lock

    tmpfs 215K 18 215K 1% /sys/fs/cgroup

    cgmfs 215K 14 215K 1% /run/cgmanager/fs

    tmpfs 215K 32 215K 1% /run/user/1000


    如果要看单独的文件目录的大小,则可以用du命令:

    -a: 列出所有的文件与目录容量,

    -h: 以人们较易读的容量格式(G/M)显示

    -s: 列出总量而已

    -k:KB列出容量显示

    -m:MB列出容量显示


    root@zhf-linux:/home/zhf# du -ah /home/zhf/zhf/python_prj

    4.0K /home/zhf/zhf/python_prj/auto_manintance/chapter7.py

    4.0K /home/zhf/zhf/python_prj/auto_manintance/test.yml

    4.0K /home/zhf/zhf/python_prj/auto_manintance/test2.yml

    4.0K /home/zhf/zhf/python_prj/auto_manintance/chapter5.py

    4.0K /home/zhf/zhf/python_prj/auto_manintance/test.js

    4.0K /home/zhf/zhf/python_prj/auto_manintance/test1.yml

    8.0K /home/zhf/zhf/python_prj/auto_manintance/test.svg

    2.6M /home/zhf/zhf/python_prj/auto_manintance/log.log


    连接文件:

    windows下,我们一般会在桌面放置很多软件的快捷方式来避免在硬盘中去查找。在linux中,也有类似的功能那就是连接文件。连接方式有两种硬连接和软连接

    硬连接:通过文件系统的inode连接来产生新文件名,而不是新文件。前面介绍了每个文件都有一个inode,要读取该文件,必须要找到正确的inode号码才能读取。也就是说文件名只与目录有关,但是文件内容则和innode有关。所以硬连接就是将多个文件名对应到同一个inode号码。


    将一个python的文件链接到桌面上

    root@zhf-linux:/home/zhf/zhf/python_prj/auto_manintance# ln chapter1.py /home/zhf/Desktop/chapter1_ln.py

    在桌面上能看到连接的文件

    通过ll -i命令可以看到两个文件的inode号码是一样的。而且权限也是一模一样的。 但是第二个字段从1变成了2,表明有2个文件连接到这个inode号码。

    root@zhf-linux:/home/zhf/zhf/python_prj/auto_manintance# ll -i chapter1.py /home/zhf/Desktop/chapter1_ln.py

    6161412 -rw-r--r-- 2 root root 1154 Jul 30 14:22 chapter1.py

    6161412 -rw-r--r-- 2 root root 1154 Jul 30 14:22 /home/zhf/Desktop/chapter1_ln.py


    那么硬连接的好处是什么呢:最大的好处就是安全。如果你将任何一个文件名删除,其实inodeblock都是存在的。你还可以通过另外一个文件名来读取正确的文件数据,此外,不论使用哪个文件进行编辑。最终的结果都会写入到相同的inodeblock当中去。因此都可以进行数据的修改。而且使用硬连接设置连接文件的时候,磁盘的空间与inode的数目不会改变。


    符号连接:

    符号连接就是在创建一个独立的文件,而这个文件会让数据的读取指向它连接的那个文件的文件名。由于只是利用文件来作为指向的操作,所以当源文件被删除之后,符号连接的文件也会打开不了。


    还是采用ln命令,添加-s就代表是符号连接

    root@zhf-linux:/home/zhf/zhf/python_prj/auto_manintance# ln -s chapter3.py chapter3_ln.py


    可以看到inode号码不一样。

    root@zhf-linux:/home/zhf/zhf/python_prj/auto_manintance# ll -i chapter3.py chapter3_ln.py

    6166844 lrwxrwxrwx 1 root root 11 Nov 19 14:02 chapter3_ln.py -> chapter3.py

    6163034 -rw-r--r-- 1 root root 256 Aug 20 21:55 chapter3.py



    磁盘的分区:

    磁盘分区需要用到fdisk命令。前面我们通过df 查出了我们的磁盘名称为/dev/sda. 那么我们就用fdisk /dev/sda进入去看下如何操作

    进入后系统界面如下:在这个界面下都是通过命令行来操作。

    root@zhf-linux:/home/zhf/zhf# fdisk /dev/sda


    Welcome to fdisk (util-linux 2.27.1).

    Changes will remain in memory only, until you decide to write them.

    Be careful before using the write command.



    Command (m for help): m

    输入m后可以得到所有的命令界面。所以不用去刻意的去记命令。


    Help:


    DOS (MBR)

    a toggle a bootable flag

    b edit nested BSD disklabel

    c toggle the dos compatibility flag


    Generic

    d delete a partition

    F list free unpartitioned space

    l list known partition types

    n add a new partition

    p print the partition table

    t change a partition type

    v verify the partition table

    i print information about a partition


    Misc

    m print this menu

    u change display/entry units

    x extra functionality (experts only)


    Script

    I load disk layout from sfdisk script file

    O dump disk layout to sfdisk script file


    Save & Exit

    w write table to disk and exit

    q quit without saving changes


    Create a new label

    g create a new empty GPT partition table

    G create a new empty SGI (IRIX) partition table

    o create a new empty DOS partition table

    s create a new empty Sun partition table


    输入p打印,可以看到下面的所有分区。分别是/dev/sda1/dev/sda2, /dev/sda5 3个分区

    Command (m for help): p

    Disk /dev/sda: 232.9 GiB, 250059350016 bytes, 488397168 sectors

    Units: sectors of 1 * 512 = 512 bytes

    Sector size (logical/physical): 512 bytes / 512 bytes

    I/O size (minimum/optimal): 512 bytes / 512 bytes

    Disklabel type: dos

    Disk identifier: 0x0008f9b1


    Device Boot Start End Sectors Size Id Type

    /dev/sda1 * 2048 484208639 484206592 230.9G 83 Linux

    /dev/sda2 484210686 488396799 4186114 2G 5 Extended

    /dev/sda5 484210688 488396799 4186112 2G 82 Linux swap / Solaris

     

     

     

    那么下面来看下如何新增分区。输入n添加分区。但是出现no free sectors avaiable. 原因在于/dev/sda5被分配做了swap分区,删除掉sda5就可以新添加

     


     

    Command (m for help): n

     

    All space for primary partitions is in use.

     

    Adding logical partition 6

     

    No free sectors available.

     


     

    删除掉sda5后再输入n就可以添加成功了。

     

    Command (m for help): d

     

    Partition number (1,2,5, default 5): 5

     


     

    Partition 5 has been deleted.

     


     

    Command (m for help): p

     

    Disk /dev/sda: 232.9 GiB, 250059350016 bytes, 488397168 sectors

     

    Units: sectors of 1 * 512 = 512 bytes

     

    Sector size (logical/physical): 512 bytes / 512 bytes

     

    I/O size (minimum/optimal): 512 bytes / 512 bytes

     

    Disklabel type: dos

     

    Disk identifier: 0x0008f9b1

     


     

    Device Boot Start End Sectors Size Id Type

     

    /dev/sda1 * 2048 484208639 484206592 230.9G 83 Linux

     

    /dev/sda2 484210686 488396799 4186114 2G 5 Extended

     


     

    添加分区后通过mkfs就可以对分区进行格式化并且设置挂载点了

     

  • 相关阅读:
    表空间及组成表空间的物理文件
    MVCC
    innodb结构解析工具---innodb_ruby
    慢查询日志 与 general_log
    思考mysql内核之初级系列
    mysql内核源代码深度解析 缓冲池 buffer pool 整体概述
    change buffer
    python 学习笔记 copy
    xargs
    给tcpdump加点颜色看看
  • 原文地址:https://www.cnblogs.com/zhanghongfeng/p/7859737.html
Copyright © 2011-2022 走看看