Linux文件系统

本文主要介绍分区基本知识, 文件系统常用命令, 如何给一块新硬盘使用fdisk进行分区, 格式化并且自动挂载, 如果将新的分区加入到swap等

一. 分区和文件系统

一块新的硬盘想要使用, 首先要对其进行分区, 然后在对各个分区进行格式化, 格式化也就是写入文件系统

1. 分区类型

一块硬盘可以划分为以下三个分区

  • 主分区: 总共最多只能有四个

  • 扩展分区: 只能有一个, 也算作主分区的一种, 也就是说主分区加扩展分区只能有四个, 但是扩展分区划分逻辑分区后才能使用, 不能对扩展分区进行格式化

  • 逻辑分区: 逻辑分区是在扩展分区基础上划分, 如果是IDE硬盘, 最多支持59个逻辑分区, SCSI硬盘支持11个逻辑分区

  • 分区设备文件名

分区名 设备文件名
主分区1 /dev/sda1(第一块硬盘的第一个主分区)
主分区2 /dev/sda2(第一块硬盘的第二个主分区)
扩展分区 /dev/sda4(第一块硬盘扩展分区)
逻辑分区1 /dev/sda5(第一块硬盘的第一个逻辑分区, 只能从5开始)
逻辑分区2 /dev/sda6(第一块硬盘的第一个逻辑分区)

2. 文件系统

  • ext2: ext文件升级版本, 最大支持16TB的分区和2TB的文件
  • ext3: 支持分区和文件大小不变, 但是最大的区别是带日志功能
  • ext4: ext3升级版本, ext4在性能, 伸缩性, 和可靠性做了大量改进, 最大支持1EB分区和16TB单个文件, 无限数量子目录, 1EB=1024PB=1024*1024TB

二. 文件系统常用命令

1. df, du, fsck, dump2fs

  • df [选项] [挂载点]

    • -a: 显示所有的文件系统信息, 包括特殊文件系统, 如/proc, /sysfs
    • -h: 易读方式显示
    • -T: 显示文件系统类型
    • -m: 以MB显示
    • -k: 以kB显示(默认)
  • du [选项] [目录或文件名]

    • -a: 显示每个子文件的磁盘占用量, 默认只统计子目录的磁盘占用量
    • -h: 易读方式展示
    • -s: 统计总占用量, 而不列出子目录和子文件的占用量
[root@localhost /]# du -sh /etc
26M /etc
  • df和du的区别:

    • df命令时从文件系统考虑的, 不光要考虑文件占用的空间, 还要统计被命令或程序占用的空间(如文件被删除, 但是没有释放, 需要重启)
    • du命令时面向文件的, 只会计算文件或目录占用的空间
  • 文件系统修复命令fsck
    fsck [选项]分区设备文件名

    • -a: 不用显示用户提示
    • -y: 自动修复, 和-a作用一致
  • 显示磁盘状态命令dumpe2fs
    dumpe2fs 分区设备文件名
    dumpe2fs /dev/sda1

[root@localhost /]# dumpe2fs /dev/sda1 | more
dumpe2fs 1.41.12 (17-May-2010)
Filesystem volume name:   
Last mounted on:          /boot
Filesystem UUID:          9f22d879-291d-42b6-89ab-2dda6c5a65d2 
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              128016
Block count:              512000
Reserved block count:     25600
Free blocks:              462374
Free inodes:              127978

2. 挂载命令

  • 查询挂载情况 mount [-l]
  • 依据配置文件/etc/fstab的内容, 自动挂载 mount -a
  • 挂载命令mount
    mount [-t 文件系统][-L 卷标名][-o 特殊选项]设备文件名 挂载点
    • -t 文件系统: 加入文件系统类型类指定挂载的类型, 可以以ext3, ext4, iso9660, vfat等文件系统
    • -L 卷标名: 挂载指定卷标的分区, 而不是安装设备文件名挂载
    • -o 特殊选项: 可以指定挂载的额外选项 多个逗号分隔, 如: mount -o remount,noexec /home, 重新挂载/home分区, 设置/home分区的文件不可执行
  • -o 支持的特殊选项很多, 但只是对分区做设置
参数 说明
remount 重新挂载已经挂载的文件系统
exec/noexec 执行/不执行, 设定是否允许在文件系统中执行可执行文件, 默认exec
rw/ro 读写/制度, 挂载时, 是否具有读写权限, 默认rw

3. 挂载光盘和U盘

  • 挂载光盘
# 创建光盘挂载点
[root@localhost /]# mkdir /media/cdrom

# 将光盘挂载在/media/cdrom挂载点, iso9660可以不填
[root@localhost /]# mount -t iso9660 /dev/sr0 /media/cdrom/
mount: block device /dev/sr0 is write-protected, mounting read-only

# 卸载光盘
[root@localhost /]# umount /media/cdrom/

  • 挂载U盘
    U盘文件格式需要是fat16或者fat32, linux默认不支持NTFS文件系统
    • 执行fdisk -l查看
  Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          64      512000   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              64        2611    20458496   8e  Linux LVM

如果是虚拟机安装 需要切换到终端, 插入u盘, 虚拟机默认会识别u盘
, 如果不切到终端, 插入u盘, 就是windows系统识别
fdisk -l, 查找分区, 可以看出u盘被识别为/dev/sdb4

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb4   *           1        1883    15120256    c  W95 FAT32 (LBA)

挂载u盘

[root@localhost /]# mkdir /media/usb
# 指定挂载文件系统类型
[root@localhost /]# mount -t vfat /dev/sdb4 /media/usb
[root@localhost /]# ls /media/usb 
[root@localhost /]# umount /media/usb               

4. 支持NTFS文件系统

  • 下载NTFS-3G
  • ./configure && make && meke install
  • 安装以后, 也是进入终端, 插入移动硬盘, 让linux识别硬盘
  • 执行fdisk -l查看分区设备
  • 执行 mount -t ntfs-3g 分区设备文件名 挂载点
    mount -t ntfs-3g /dev/sdb1

三. fdisk分区

新插入一块硬盘, 如何给一块新的硬盘分区并且挂载呢?

  • 在虚拟机中增加硬盘, 关机后, 在虚拟机设置中添加一块硬盘
  • 开机后, 查看新增加的硬盘/dev/sdb, fdisk -l
Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

1. 使用fdisk进行分区

  • 执行fdisk /etc/sdb , 会进入fdisk分区交互界面
Command (m for help):
  • fdisk交互指令说明如下:
    • a: 设置可引导标记
    • b: 编辑bsd磁盘标签
    • d: 删除一个分区
    • l: 显示一直文件系统类型, 82为Linux swap分区, 83为Linux分区
    • m: 显示帮助菜单
    • n: 新建分区(重要)
    • p: 显示分区列表
    • t: 改变一个分区的系统ID
    • u: 改变显示记录单位
    • v: 验证分区表
    • w: 退出保存
    • q: 退出不保存
  • 新建主分区, 扩展分区, 逻辑分区
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
# 新建主分区
p

# 选择分区号
Partition number (1-4): 1

# 选择起始柱面
First cylinder (1-1305, default 1): 
Using default value 1
#选择结束柱面
Last cylinder, +cylinders or +size{K,M,G} (1-1305, default 1305): +2G


Command (m for help): p
...
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         262     2104483+  83  Linux


## 新建扩展分区
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
e
Partition number (1-4): 4
First cylinder (263-1305, default 263): 
Using default value 263
Last cylinder, +cylinders or +size{K,M,G} (263-1305, default 1305): +2G

# 可以看到主分区和扩展分区
Command (m for help): p

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         262     2104483+  83  Linux
/dev/sdb4             263         524     2104515    5  Extended

## 在扩展分区上新建逻辑分区, 可以看到l logical逻辑分区选项
Command (m for help): n
Command action
   l   logical (5 or over)
   p   primary partition (1-4)
l
First cylinder (263-524, default 263): 
Using default value 263
Last cylinder, +cylinders or +size{K,M,G} (263-524, default 524): +2G

Command (m for help): p

#可以看到一个主分区, 一个扩展分区和一个逻辑分区
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         262     2104483+  83  Linux
/dev/sdb4             263         524     2104515    5  Extended
/dev/sdb5             263         524     2104483+  83  Linux

# 保存
Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

[root@localhost ~]# fdisk -l
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         262     2104483+  83  Linux
/dev/sdb4             263         524     2104515    5  Extended
/dev/sdb5             263         524     2104483+  83  Linux

如果w保存时, 报错, 提示分区表正在使用, 可以执行partprobe重新载入分区表, 无效的话, 就需要重新启动计算机

2. 格式化分区并挂载

  • 分区后, 需要格式化分区, 写入文件系统, 才能使用, 不写入文件系统, 无法使用

mkfs -t ext4 /dev/sdb1

# 没有格式化, 无法使用dumpe2fs查看
[root@localhost ~]# dumpe2fs /dev/sdb1
dumpe2fs 1.41.12 (17-May-2010)
dumpe2fs: Bad magic number in super-block 当尝试打开 /dev/sdb1 时
找不到有效的文件系统超级块.

[root@localhost ~]# mkdir /disk1
# 无法挂载
[root@localhost ~]# mount /dev/sdb1 /disk1/
mount: you must specify the filesystem type
  • 格式化/dev/sdb1,
[root@localhost ~]# mkfs -t ext4 /dev/sdb1
mke2fs 1.41.12 (17-May-2010)
文件系统标签=
操作系统:Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131648 inodes, 526120 blocks
26306 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=541065216
17 block groups
32768 blocks per group, 32768 fragments per group
7744 inodes per group
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912

正在写入inode表: 完成                            
Creating journal (16384 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

This filesystem will be automatically checked every 29 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[root@localhost ~]# mount /dev/sdb1 /disk1/
  • 将设备文件名/dev/sdb1挂载到/disk1
[root@localhost ~]# mount /dev/sdb1 /disk1/
  • 查看设备挂载情况(df -h 或者 mount)
[root@localhost /]# df -h
Filesystem                    Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root   18G  9.4G  7.2G  57% /
tmpfs                         491M     0  491M   0% /dev/shm
/dev/sda1                     485M   33M  427M   8% /boot
/dev/sdb1                     2.0G   68M  1.9G   4% /disk1
/dev/sdb5                     2.0G   68M  1.9G   4% /disk5
  • 手动挂载每次开机都会丢失, 如何自动挂载呢?

3. 自动挂载

自动挂载依赖于/etc/fstab配置文件, 查看该文件

/dev/mapper/VolGroup-lv_root /                       ext4    defaults        1 1
UUID=9f22d879-291d-42b6-89ab-2dda6c5a65d2 /boot                   ext4    defaults        1 2
/dev/mapper/VolGroup-lv_swap swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0

  • 各字段含义
    • 第一字段: 分区设备文件名或UUID(硬盘通用唯一识别码, 可以通过dumpe2fs命令查看)
    • 第二字段: 挂载点
    • 第三字段: 文件系统名称
    • 第四字段: 挂载参数
    • 第五字段: 指定分区是否被dump备份, 0: 不备份, 1: 每天 2: 不定期, 备份数据保存目录在各自分区挂载点的 lost+found目录
    • 第六字段: 指定分区是否被fsck检测, 0不检测, 数据越小, 优先级越高, 系统在启动时, 会根据该字段确定扫描优先级, 根分区优先级应该是最高, 先扫描根分区, 再扫描boot分区, 自己加入的分区, 优先级也不应该高于根分区1

想要自动挂载, 需要修改该文件, 加入如下内容, 将sdb1和sdb5自动挂载

/dev/sdb1               /disk1                  ext4    defaults        1 2
/dev/sdb5               /disk5                  ext4    defaults        1 2

4. 文件修复

修改该文件一定要小心, 如果写错, 系统开机时可能会直接崩溃,
修改完, 应该先执行mount -a, 依据配置文件/etc/fstab的内容, 自动挂载,
可以在不重启的情况下, 检测fstab文件是否正确**

如果系统出错, 没有启动, 输入root用户名, 进入系统后, 需要执行
mount -o remount,rw /重新挂载根分区, 并将分区设置为读写, 就可以修改/etc/fstab

四. 分配swap分区

  • 首先参照分区方法, 将sdb硬盘再增加一个分区,
    fdisk /dev/sdb
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         262     2104483+  83  Linux
/dev/sdb2             525         656     1060290   83  Linux
/dev/sdb4             263         524     2104515    5  Extended
/dev/sdb5             263         524     2104483+  83  Linux
  • 进入fdisk交互界面, 更改/dev/sdb2分区的ID号, 改为swap 82
# 更改id
Command (m for help): t
# 更改sdb2, 输入2
Partition number (1-5): 2
# 更改为82
Hex code (type L to list codes): 82
Changed system type of partition 2 to 82 (Linux swap / Solaris)

#查看, 已经设置为Linux swap
Command (m for help): p

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         262     2104483+  83  Linux
/dev/sdb2             525         656     1060290   82  Linux swap / Solaris

  • w保存退出时, 会出现
WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
  • 格式化分区为swap格式
    mkswap /dev/sdb2
[root@localhost /]# mkswap /dev/sdb2
/dev/sdb2: 没有那个文件或目录
# 没有生效, 只能重启计算机
# 重启后
[root@localhost ~]# mkswap /dev/sdb2
Setting up swapspace version 1, size = 1060284 KiB
no label, UUID=e8a404e3-3389-471a-95ef-0ee343a2b2cb
  • 加入swap分区 swapon /dev/sdb2
# swap 为2G
[root@localhost ~]# free -m | grep Swap
Swap:         1983          0       1983

# 将/dev/sdb2加入到swap分区
[root@localhost ~]# swapo
swapoff  swapon   
[root@localhost ~]# swapon /dev/sdb2

# 增加了一个G
[root@localhost ~]# free -m | grep Swap
Swap:         3019          0       3019
  • 从swap中取消 swapoff /dev/sdb2
[root@localhost ~]# swapoff /dev/sdb2
[root@localhost ~]# free -m | grep Swap
Swap:         1983          0       1983
  • swap分区开机自动挂载
    修改`/etc/fstab, 加入如下内容, reboot重启计算机
/dev/sdb2               swap                    swap    defaults        0 0

你可能感兴趣的:(Linux文件系统)