如果大家给windows系统装过硬盘的话,应该会对本文内容倍感亲切。

说说windows
让我们从一些问题开始:

  • 当我们给win主机插入一块新的硬盘的时候,我们并不能在”我的电脑”看到”盘符”,而只能到”磁盘管理”或者打开”diskgenius”这些工具才能看到硬盘,为什么呢?
  • 我们装机的时候可以在winpe用工具进行硬盘分区,得到了多个盘符,这又是什么原理呢?
  • 格式化一个盘符的时候,NTFS和FAT32又是什么呢?
    其实硬盘对于电脑来说属于一个”块设备”,”块设备”可以划分为多个”分区”,每个”分区”有一个”盘符”标识,对”分区”做”格式化”就可以在”我的电脑”里看到它了。

接下来,我们将在linux系统中安装一块新的硬盘,让大家对上述打引号的名词有一个清晰的认识。

在linux中操作
插入硬盘后,我们首先要查看”块设备”,确保系统识别了硬盘。
查看块设备

pi@raspberrypi:~ $ lsblk 
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    0  118G  0 disk 
mmcblk0     179:0    0 59.5G  0 disk 
├─mmcblk0p1 179:1    0 43.9M  0 part /boot
└─mmcblk0p2 179:2    0 59.4G  0 part /

lsblk命令可以列出所有系统识别的”块设备”
sda块设备是disk类型,也就是一块硬盘。
块设备首先需要分区,当然你可以把整块硬盘分成1个区也是可以的。

利用fdisk命令对/dev/sda块设备进行分区:

pi@raspberrypi:~ $ sudo fdisk /dev/sda

Welcome to fdisk (util-linux 2.29.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help):

敲入m可以看帮助菜单。

F可以查看硬盘剩余的未分区空间大小:

Command (m for help): F
Unpartitioned space /dev/sda: 118 GiB, 126700469760 bytes, 247461855 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes

Start       End   Sectors  Size
 2048 247463902 247461855  118G

这里可以见/dev/sda还剩余118G。

p可以查看现在有几个分区(新硬盘应该是没有分区的):

Command (m for help): p
Disk /dev/sda: 118 GiB, 126701535232 bytes, 247463936 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: E3B61140-3FE7-410D-8D65-EA59E46FE78F

接下来首先创建一个分区表,采用主流的GPT格式,该命令介绍如下:
g create a new empty GPT partition table

Command (m for help): g
Created a new GPT disklabel (GUID: 839F933F-2CA9-479F-9371-0E436802777F).

然后可以进行分区,命令介绍如下:
n add a new partition

Command (m for help): n 
Partition number (1-128, default 1): 
First sector (2048-247463902, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-247463902, default 247463902): 

Created a new partition 1 of type 'Linux filesystem' and of size 118 GiB.
Partition #1 contains a ext4 signature.

Do you want to remove the signature? [Y]es/[N]o: y

The signature will be removed by a write command.

同一个块设备的每个分区都有唯一编号,默认递增即可。
然后会让你选择分区的起始扇区与结束扇区,默认都是直接占满块设备剩余空间,也正符合我的需要,所以直接敲回车即可。
因为演示的原因,fdisk命令貌似检测到了我原先磁盘做过一次文件系统,所以选择抹除即可。
现在可以查看到分区/dev/sda1,它是/dev/sda这块盘的唯一分区,占据了所有空间:

Command (m for help): p
Disk /dev/sda: 118 GiB, 126701535232 bytes, 247463936 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: 839F933F-2CA9-479F-9371-0E436802777F

Device     Start       End   Sectors  Size Type
/dev/sda1   2048 247463902 247461855  118G Linux filesystem

确认之后,输入w命令保存所有修改:

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

再次lsblk,你将看到sda盘已经有了一个sda1的分区:

pi@raspberrypi:~ $ lsblk 
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    0  118G  0 disk 
└─sda1        8:1    0  118G  0 part 
mmcblk0     179:0    0 59.5G  0 disk 
├─mmcblk0p1 179:1    0 43.9M  0 part /boot
└─mmcblk0p2 179:2    0 59.4G  0 part /

格式化文件系统
分区仍旧是块设备,需要制作文件系统后,才能被操作系统挂载。
在windows上,文件系统就是NTFS或者FAT32,在Linux系统下面有很多选择,它们特性各不相同:

pi@raspberrypi:~ $ mkfs
mkfs         mkfs.bfs     mkfs.cramfs  mkfs.ext2    mkfs.ext3    mkfs.ext4    mkfs.fat     mkfs.minix   mkfs.msdos   mkfs.ntfs    mkfs.vfat

在linux最新版本上,特性比较均衡的就是ext4文件系统了,制作文件系统其实就是”格式化”:

pi@raspberrypi:~ $ sudo mkfs.ext4 /dev/sda1
mke2fs 1.43.4 (31-Jan-2017)
Creating filesystem with 30932731 4k blocks and 7733248 inodes
Filesystem UUID: 69d20b7f-186d-4a14-9615-6c7659a22c29
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000, 7962624, 11239424, 20480000, 23887872

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (131072 blocks): 
done
Writing superblocks and filesystem accounting information:        
done

敲回车即可完成。

挂载目录
现在需要创建一个空目录,然后把”格式化”好的分区挂载上去:

mkdir /home/pi/data

目录权限根据自己需要修改,然后mount挂载即可:

sudo mount /dev/sda1 /home/pi/data/

现在/home/pi/data就可以访问了,也可以查看挂载情况:

pi@raspberrypi:~/data $ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        59G  2.8G   54G   5% /
devtmpfs        459M     0  459M   0% /dev
tmpfs           464M  260K  463M   1% /dev/shm
tmpfs           464M   13M  451M   3% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           464M     0  464M   0% /sys/fs/cgroup
/dev/mmcblk0p1   44M   23M   21M  52% /boot
tmpfs            93M     0   93M   0% /run/user/999
tmpfs            93M     0   93M   0% /run/user/1000
/dev/sda1       116G   61M  110G   1% /home/pi/data

为了开机自动挂载,需要在/etc/fstab文件末尾追加一行配置:

/dev/sda1 /home/pi/data ext4 defaults 0 1

只需要修改前3个参数,其他参数默认即可(有兴趣可以自己查查):

  • /dev/sda1:哪一个分区
  • /home/pi/data:挂载到哪个目录
  • ext4:文件系统类型
    一定要注意,如果fstab配置错误,机器重启就会失败,只能插显示器急救,所以我们在重启前要确保配置正确。

只需要执行sudo mount -a重新挂载所有目录,只要没有报错那么就说明一切正常。