Linux基础知识总结之磁盘管理

我们知道当我们买来一块硬盘时,必须要对他进行分区和格式化才可以
Linux基础知识总结之磁盘管理_第1张图片
MBR(主引导扇区) :位于磁盘的第一个扇区,即0号扇区,主要由引导程序、分区表、结束标志三部分构成,总共占512字节。
1.引导程序:占MBR扇区前446字节。计算机在上电完成BIOS自检后,执行此引导程序,引导程序首先会在分区表中查找活动分区,若存在活动分区,则根据活动分区的偏移量找到该活动分区上的引导扇区的地址,并将该引导扇区加载到内存中,同时检查该引导扇区的有效性,然后根据该引导扇区的规则去引导操作系统
2.分区表占64字节
标记一个分区就要消耗16字节,所以一块磁盘最多4个分区
每个分区项通过位置偏移、分区大小来唯一确定一个主分区或者扩展分区, 定位各个分区,访问用户数据。
每个分区项包括引导标识、起始和结束位置的CHS参数、分区类型、开始扇区、分区大小等
3.结束标志:占扇区最后2字节。每次执行系统引导代码时都会检查MBR主引导扇区最后2字节是否是"55 AA",若是,则继续执行后续的程序,否则,则认为这是一个无效的MBR引导扇区,停止引导系统。

我们单独来看一个分区

从左向右依次为 boot sector 。super block。inode。block。
block:存储数据的地方。对系统进行格式化后,block会被分成许多block块,每个块默认4k(可改)。一个文件可以占用多个块。注意:就算文件1k,也独自占用一个快。
inode: 包含好多inode,每一个inode也有编号。存放文件的属性信息(可以说,一个inode就代表了一个文件,inode结构体保存了文件的大小,创建时间,文件的块大小等各种参数)以及此文件被存放在了哪一些block块中
每记录一个文件,消耗128B。
super block :记录block inode 信息:用了多少block inode 等以及剩了多少。
boot sector :引导扇区(引导程序)
×××系统找文件时:先到inode中找文件在那些块里,然后再到指定block块中找。

如果一个分区太大 ,就会把一个分区分成好多block group
然后原来的一个分区结构就变成了 boot sector ,block group,block group…
**

我们看单独的一个block group

从左往右依次为 : super block ,文件系统描述,block快位图,inode位图,inode表,block;
super block:记录多少block被使用 多少没被使用。
文件系统描述:记录这个block group是从哪一个block开始,哪一个block结束的。
block 快位图 : 记录具体哪些block被使用,哪些block没被使用。
inode位图:记录哪些inode被使用,哪些没被使用。
inode表:每写入一个文件,都保存这个文件的属性,占哪些block,以及文件所属组等。

对于文件的存储

刚才说到,记录一个文件 inode消耗128B。 其中每指向一个block块inode消耗4B,128/4=32 。所以每一个inode最多指向32个block块。 又因为每个块存放4k,所以一个文件最大128K。
但现实生活中一个文件很大,远远超过了128K,这是怎么实现的那?
***原来在inode区 ,从上往下分成了直接区,间接区,二级间接区,三级间接区。***
直接区:这里inode指向的block块 是真正存储文件的,所以这里的每个inode最多指向32个块,最多存128K的文件
间接区:比如这里inode还是指向32个块,但其中指向的每一个块中存放的并不是文件,而是像inode一样指向其他块。
一个块4k,其中每指向一个快消耗4B。所以一个由inode直接指向的块又指向了1024个块(真正存信息)。可以算出实际的存储空间了。
二级间接区 三级间接区一样的原理

写入文件时 :
步骤一:首先到inode位图里面找哪一个inode没有被使用,然后在inode中把这个文件的属性信息写入。
步骤二:查找block位图,查看哪个block没有被使用,然后写入信息到块中
步骤三:更新block快位图和inode位图, 最后更新superblock;

日志
其中执行每一步的时候,均被记录到了日志中。
如果没执行完就关机,下次开机的时候,查看日志,把下面的步骤做完。

常用命令

Linux磁盘管理好坏直接关系到整个系统的性能问题。
Linux磁盘管理常用三个命令为df、du和fdisk

df:列出文件系统的整体磁盘使用量
du:检查磁盘空间使用量
fdisk:用于磁盘分区

df

df命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息,
注意:必须是已经挂载的
语法:

df  [参数] [目录或文件名]

常用参数:

-h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
-T :显示文件系统类型, 连同该 partition 的 filesystem 名称 (例如 ext3) 也列出;
-a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;
-k :以 KBytes 的容量显示各文件系统;
-m :以 MBytes 的容量显示各文件系统;

sss@sss-PC:~$ df
文件系统           1K-块     已用      可用 已用% 挂载点
udev             8057924        0   8057924    0% /dev
tmpfs            1617276     1784   1615492    1% /run
/dev/nvme0n1p5  92365480 13709536  73921020   16% /
tmpfs            8086364   288456   7797908    4% /dev/shm
tmpfs               5120        4      5116    1% /run/lock
tmpfs            8086364        0   8086364    0% /sys/fs/cgroup
/dev/nvme0n1p1    262144    59276    202868   23% /boot/efi
tmpfs            1617272       36   1617236    1% /run/user/1000
/dev/nvme0n1p6    467656   134740    297940   32% /media/sss/16d8a5a7-8368-4cda-aedd-dcc360273a06
/dev/nvme0n1p4 715781116 24491956 691289160    4% /media/sss/Data
/dev/nvme0n1p3 104857596 56458040  48399556   54% /media/sss/Windows-SSD
/dev/nvme0n1p8  42440492  3167896  37086972    8% /media/sss/ff90f1d3-680b-43ae-8486-81e6af926cbb

以容易读的方式

sss@sss-PC:~$ df -h
文件系统        容量  已用  可用 已用% 挂载点
udev            7.7G     0  7.7G    0% /dev
tmpfs           1.6G  1.8M  1.6G    1% /run
/dev/nvme0n1p5   89G   14G   71G   16% /
tmpfs           7.8G  282M  7.5G    4% /dev/shm
tmpfs           5.0M  4.0K  5.0M    1% /run/lock
tmpfs           7.8G     0  7.8G    0% /sys/fs/cgroup
/dev/nvme0n1p1  256M   58M  199M   23% /boot/efi
tmpfs           1.6G   36K  1.6G    1% /run/user/1000
/dev/nvme0n1p6  457M  132M  291M   32% /media/sss/16d8a5a7-8368-4cda-aedd-dcc360273a06
/dev/nvme0n1p4  683G   24G  660G    4% /media/sss/Data
/dev/nvme0n1p3  100G   54G   47G   54% /media/sss/Windows-SSD
/dev/nvme0n1p8   41G  3.1G   36G    8% /media/sss/ff90f1d3-680b-43ae-8486-81e6af926cbb

将系统内的所有特殊文件格式及名称都列出来:



sss@sss-PC:~$ df -aT
文件系统       类型                1K-块     已用      可用 已用% 挂载点
sysfs          sysfs                   0        0         0     - /sys
proc           proc                    0        0         0     - /proc
udev           devtmpfs          8057924        0   8057924    0% /dev
devpts         devpts                  0        0         0     - /dev/pts
tmpfs          tmpfs             1617276     1784   1615492    1% /run
/dev/nvme0n1p5 ext4             92365480 13709512  73921044   16% /
securityfs     securityfs              0        0         0     - /sys/kernel/security
tmpfs          tmpfs             8086364   288380   7797984    4% /dev/shm
tmpfs          tmpfs                5120        4      5116    1% /run/lock
tmpfs          tmpfs             8086364        0   8086364    0% /sys/fs/cgroup
cgroup         cgroup                  0        0         0     - /sys/fs/cgroup/systemd
pstore         pstore                  0        0         0     - /sys/fs/pstore
efivarfs       efivarfs                0        0         0     - /sys/firmware/efi/efivars
cgroup         cgroup                  0        0         0     - /sys/fs/cgroup/perf_event
cgroup         cgroup                  0        0         0     - /sys/fs/cgroup/hugetlb
cgroup         cgroup                  0        0         0     - /sys/fs/cgroup/net_cls,net_prio
cgroup         cgroup                  0        0         0     - /sys/fs/cgroup/cpu,cpuacct
cgroup         cgroup                  0        0         0     - /sys/fs/cgroup/devices
cgroup         cgroup                  0        0         0     - /sys/fs/cgroup/cpuset
cgroup         cgroup                  0        0         0     - /sys/fs/cgroup/pids
cgroup         cgroup                  0        0         0     - /sys/fs/cgroup/blkio
cgroup         cgroup                  0        0         0     - /sys/fs/cgroup/memory
cgroup         cgroup                  0        0         0     - /sys/fs/cgroup/freezer
cgroup         cgroup                  0        0         0     - /sys/fs/cgroup/rdma
systemd-1      -                       -        -         -     - /proc/sys/fs/binfmt_misc
mqueue         mqueue                  0        0         0     - /dev/mqueue
debugfs        debugfs                 0        0         0     - /sys/kernel/debug
hugetlbfs      hugetlbfs               0        0         0     - /dev/hugepages
binfmt_misc    binfmt_misc             0        0         0     - /proc/sys/fs/binfmt_misc
configfs       configfs                0        0         0     - /sys/kernel/config
fusectl        fusectl                 0        0         0     - /sys/fs/fuse/connections
/dev/nvme0n1p1 vfat               262144    59276    202868   23% /boot/efi
tmpfs          tmpfs             1617272       36   1617236    1% /run/user/1000
gvfsd-fuse     fuse.gvfsd-fuse         0        0         0     - /run/user/1000/gvfs
/dev/nvme0n1p6 ext4               467656   134740    297940   32% /media/sss/16d8a5a7-8368-4cda-aedd-dcc360273a06
/dev/nvme0n1p4 fuseblk         715781116 24491956 691289160    4% /media/sss/Data
/dev/nvme0n1p3 fuseblk         104857596 56458040  48399556   54% /media/sss/Windows-SSD
/dev/nvme0n1p8 ext4             42440492  3167896  37086972    8% /media/sss/ff90f1d3-680b-43ae-8486-81e6af926cbb

将 /etc 底下的可用的磁盘容量以易读的容量格式显示

sss@sss-PC:~$ df -h /etc
文件系统        容量  已用  可用 已用% 挂载点
/dev/nvme0n1p5   89G   14G   71G   16% /

fdisk

fdisk 是 Linux 的磁盘分区表操作工具。

fdisk [-l] 装置名称

-l :输出后面接的装置所有的分区内容。若仅有 fdisk -l 时, 则系统将会把整个系统内能够搜寻到的装置的分区均列出来。

fdisk -l
列出所有分区信息(注意:不是root时,应用sudo命令)

sss@sss-PC:~$ sudo fdisk -l
Disk /dev/nvme0n1: 953.9 GiB, 1024209543168 bytes, 2000409264 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: gpt
Disk identifier: F2F573BF-8901-4FCD-BC51-4DF1EB774616

Device              Start        End    Sectors   Size Type
/dev/nvme0n1p1       2048     534527     532480   260M EFI System
/dev/nvme0n1p2     534528     567295      32768    16M Microsoft reserved
/dev/nvme0n1p3     567296  210282495  209715200   100G Microsoft basic data
/dev/nvme0n1p4  210282496 1641844735 1431562240 682.6G Microsoft basic data
/dev/nvme0n1p5 1641844736 1830586367  188741632    90G Microsoft basic data
/dev/nvme0n1p6 1830588416 1831587839     999424   488M Linux filesystem
/dev/nvme0n1p7 1831587840 1911588863   80001024  38.2G Linux filesystem
/dev/nvme0n1p8 1911588864 1998360575   86771712  41.4G Linux filesystem
/dev/nvme0n1p9 1998360576 2000408575    2048000  1000M Windows recovery environment

fdisk分区
找出你系统中的根目录所在磁盘,并查阅该硬盘内的相关信息:

[root@www ~]# df /            <==注意:重点在找出磁盘文件名而已
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/hdc2              9920624   3823168   5585388  41% /
[root@www ~]# fdisk /dev/hdc  <==仔细看,不要加上数字喔!
The number of cylinders for this disk is set to 5005.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)
  Command (m for help):     <==等待你的输入!

输入 m 后,就会看到底下这些命令介绍:

Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition            <==删除一个partition
   l   list known partition types
   m   print this menu
   n   add a new partition           <==新增一个partition
   o   create a new empty DOS partition table
   p   print the partition table     <==在屏幕上显示分割表
   q   quit without saving changes   <==不储存离开fdisk程序
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit  <==将刚刚的动作写入分割表
   x   extra functionality (experts only)

离开 fdisk 时按下 q,那么所有的动作都不会生效!相反的, 按下w就是动作生效的意思:
(谨慎操作,之前博主学习的时候就因为这个命令导致系统崩溃,只能重装系统,不过也挺简单)

Command (m for help): p  <== 这里可以输出目前磁盘的状态

Disk /dev/hdc: 41.1 GB, 41174138880 bytes        <==这个磁盘的文件名与容量
255 heads, 63 sectors/track, 5005 cylinders      <==磁头、扇区与磁柱大小
Units = cylinders of 16065 * 512 = 8225280 bytes <==每个磁柱的大小

   Device Boot      Start         End      Blocks   Id  System
/dev/hdc1   *           1          13      104391   83  Linux
/dev/hdc2              14        1288    10241437+  83  Linux
/dev/hdc3            1289        1925     5116702+  83  Linux
/dev/hdc4            1926        5005    24740100    5  Extended
/dev/hdc5            1926        2052     1020096   82  Linux swap / Solaris
# 装置文件名 启动区否 开始磁柱    结束磁柱  1K大小容量 磁盘分区槽内的系统

Command (m for help): q

注意:分区之后要更新分区表

命令:

partprobe  /dev/hdc

单独partprobe:更新全部分区表;

格式化

之前提到 产生一个新分区是不能直接使用的,要对她进行格式化

格式化命令:

mkfs [-t 文件系统格式] 装置文件名

-t :可以接文件系统格式,例如 ext3, ext2, vfat 等(系统有支持才会生效)

例1
查看 mkfs 支持的文件格式

root@www ~]# mkfs[tab][tab]
mkfs         mkfs.cramfs  mkfs.ext2    mkfs.ext3    mkfs.msdos   mkfs.vfat

例2
将分区 /dev/hdc6(可指定你自己的分区) 格式化为 ext3 文件系统:

[root@www ~]# mkfs -t ext3 /dev/hdc6
mke2fs 1.39 (29-May-2006)
Filesystem label=                <==这里指的是分割槽的名称(label)
OS type: Linux
Block size=4096 (log=2)          <==block 的大小配置为 4K 
Fragment size=4096 (log=2)
251392 inodes, 502023 blocks     <==由此配置决定的inode/block数量
25101 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=515899392
16 block groups
32768 blocks per group, 32768 fragments per group
15712 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912

Writing inode tables: done
Creating journal (8192 blocks): done <==有日志记录
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 34 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
# 这样就创建起来我们所需要的 Ext3 文件系统了!简单明了!

磁盘挂载与卸除

Linux 的磁盘挂载使用 mount 命令,卸载使用 umount 命令。

mount命令格式:

mount [-t 文件系统] [-L Label名] [-o 额外选项] [-n]  装置文件名  挂载点

实例 1
用默认的方式,将刚刚创建的 /dev/hdc6 挂载到 /mnt/hdc6 上面!

[root@www ~]# mkdir /mnt/hdc6
[root@www ~]# mount /dev/hdc6 /mnt/hdc6
[root@www ~]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
.....中间省略.....
/dev/hdc6              1976312     42072   1833836   3% /mnt/hdc6

磁盘卸载命令 umount 语法:

umount [-fn] 装置文件名或挂载点

选项与参数:

-f :强制卸除!可用在类似网络文件系统 (NFS) 无法读取到的情况下;
-n :不升级 /etc/mtab 情况下卸除。
卸载/dev/hdc6
实例2

[root@www ~]# umount /dev/hdc6   

你可能感兴趣的:(Linux基础知识总结之磁盘管理)