14. 硬盘挂载

本章节介绍如何在鲁班猫系列板卡上挂载硬盘。

14.1. 查看硬盘

14.1.1. 命令工具

14.1.1.1. lsblk

使用lsblk命令可列出所有可用块设备的信息,显示他们之间的依赖关系。

1
lsblk

如下图,文本的左边列出了所有可用块的信息,文本的最右边是当前硬盘的挂载的位置。

未找到图片05|
  1. 可以看到当前的可用块有5个,分别是sda、sdb、mmcblk0、mmcblk0boot0、mmcblk0boot1。

  2. mmcblk0boot0和mmcblk0boot1是mmcblk0的一些信息,在lsblk中可以看到RO项值为1是只读的,所以不能当成可用块来使用。

  3. 以上sda是一个msata硬盘,不支持热插拔,RM项值为0,大小是16G的,换算到系统里是14.8G,可读可写,只有一个分区就是sda1,被挂载到了/root/test_blk上。

  4. sdb是一个u盘,支持热插拔,RM项值为1,大小32G,换算到系统里是28.7G,可读可写,只有一个分区就是sdb1,没有被挂载。

  5. mmcblk0是板载emmc,不支持热插拔,RM项值为0,大小32G,换算到系统是29.1G,可读可写,有三个分区:mmcblk0p1是uboot以及系统引导相关的分区,大小为4M; mmcblk0p2是boot分区,存放内核,设备树,配置文件等的分区,被挂载到了/boot分区上;mmcblk0p3是根文件的分区,存放根文件系统,被挂载到/(根目录下的)。

14.1.1.2. fdisk

使用lsblk命令可以查看硬盘的一些基本信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#列出硬盘或者分区的基本信息
fdisk [options] -l [<disk>]

#修改硬盘或者分区的信息
fdisk [options] [<disk>]

#例如列出/dev/mmcblk0分区的基本信息
fdisk -l /dev/mmcblk0
#信息输出如下
Disk /dev/mmcblk0: 29.13 GiB, 31272730624 bytes, 61079552 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: D9500000-0000-4945-8000-362C000010D3

Device          Start      End  Sectors  Size Type
/dev/mmcblk0p1  16384    24575     8192    4M unknown
/dev/mmcblk0p2  24576   286719   262144  128M unknown
/dev/mmcblk0p3 286720 61079487 60792768   29G unknown
  • 可以看到/dev/mmcblk0的一些基本信息。

  • fdisk还可以修改硬盘的配置,具体方法不做展开。

14.1.2. 分区编号

14.1.2.1. emmc

emmc在鲁班猫系统里的默认设备是/dev/mmcblk0,在lsblk内显示是不可移动的。

分区号为/dev/mmcblk0p#(#为1,2,3,4,5,6,7)

14.1.2.2. sd卡

sd卡信息和emmc差不多,使用同一个类型的驱动,sd卡在鲁班猫系统里的默认设备是/dev/mmcblk1, 在lsblk内显示是不可移动的,因为sd卡可以作为系统镜像来启动鲁班猫,所以没有将sd卡标志为可移动设备。

分区号为/dev/mmcblk1p#(#为1,2,3,4,5,6,7)

14.1.2.3. U盘

U盘在鲁班猫系统里的默认设备是/dev/sdx(x为a,b,c,d,e…),这需要根据安装设备数量来决定设备号。 在lsblk中会显示该设备是可移动的设备。

分区设备号为/dev/sdx#(x为a,b,c,d,e…)(#为1,2,3,4,5,6,7)

14.1.2.4. sata硬盘

sata硬盘在鲁班猫系统里的默认设备是/dev/sdx(x为代表a,b,c,d,e…),这需要根据安装设备数量来决定设备号。

分区设备号为/dev/sdx#(x为a,b,c,d,e…)(#为1,2,3,4,5,6,7)

14.1.2.5. nvme硬盘

nvme硬盘在鲁班猫系统里的默认设备是/dev/nvme0n1。

分区设备号为/dev/nvme0n1p#(#为1,2,3,4,5,6,7)

14.2. 手动挂载

14.2.1. 挂载硬盘

1
2
3
4
5
6
7
8
#创建要挂载到的文件夹
mkdir /mnt/mydir

#挂载硬盘
mount /dev/xxx /mnt/mydir

#例如
mount /dev/sda1 /mnt/mydir
  • /dev/xxx是硬盘的分区设备。

  • /mnt/mydir是要挂载到的文件夹。

若是exFAT格式的硬盘,则需要按以下操作:

1
2
3
4
5
#安装相关工具
sudo apt-get install exfat-fuse

#挂载硬盘,用-t参数指定格式
mount -t exfat /dev/sda1 /mnt/mydir/

若是NTFS格式的硬盘,则需要按以下操作:

1
2
3
4
5
#安装相关工具
sudo apt-get install ntfs-3g

#挂载硬盘,用-t参数指定格式
mount -t ntfs-3g /dev/sda1 /mnt/mydir/

挂载成功后可以用 lsblk 命令查看:

未找到图片05|

mount命令的功能十分丰富,此处只是简单讲一下mount的基本用法,如有需要可自行查找mount的具体用法。

14.2.2. 卸载硬盘

1
umount /mnt/mydir
  • /mnt/mydir是已挂载的文件夹。

14.3. 自动挂载

14.3.1. fstab自动挂载

使用fstab挂载的设备必须是每次启动都能识别到的设备,如果在某次启动中不能识别到对应的设备,系统将进入紧急模式。

14.3.1.1. 根据设备分区

注解

这种方法适合存储设备单一,硬盘设备号不变的自动挂载。

通过/etc/fstab文件来管理设备挂载。

1
2
3
4
5
6
#修改/etc/fstab文件
vi /etc/fstab

#添加以下内容

/dev/sdx   /mnt/mydir   auto   defaults   0   2
  • /dev/sdx 是要挂载的硬盘分区。

  • /mnt/mydir 是要挂载到的文件夹。

  • auto 要挂载的硬盘分区的文件系统格式,”auto”是自动判断文件按系统格式,除此之外还有”ext4”,”ntfs”等。

  • defaults 配置文件的模式,”defaults”是默认选项,除此之外还有”mode=1777”,”rw,noauto”等。

  • 02 分别是备份和检查顺序。

14.3.1.2. 根据设备UUID

注解

这种方法适合存储设备多且存储设备号会随时改变的情况

UUID是”Universally Unique Identifier”(通用唯一标识符)的缩写,它是一个用于唯一标识计算机系统中各种资源(如磁盘、分区、文件、目录等)的标识符。

UUID是一个128位的数字标识符,通常以16进制表示,目的是在不同的系统和环境中保持唯一性,避免冲突和重复,每个UUID都应该是唯一的,即使在不同的计算机或网络中也是如此。

可通过lsblk和blkid命令查看磁盘的UUID:

1
2
3
4
5
#使用lsblk列出硬盘分区的UUID
lsblk -o NAME,UUID

#使用blkid列出硬盘分区的UUID
blkid

获取硬盘分区的UUID后可修改/etc/fstab来根据UUID挂载设备:

1
2
3
4
5
#修改/etc/fstab文件
vi /etc/fstab

#添加以下内容,UUID根据实际而定
UUID=xxxxx  /mnt/mydir   auto   defaults   0   2

除了UUID,PARTUUID也有着和UUID一样的功能,这里就不过多赘述了。

14.3.2. udev自动挂载

udev是Linux系统中用于动态管理设备文件的工具,通过规则文件实现设备的自动化管理和配置。

1
2
3
4
5
6
7
#创建一个udev的规则
sudo vi /etc/udev/rules.d/10-usb-mount.rules

#在文件中添加以下内容
ACTION=="add", KERNEL=="sd[a-z][0-9]", TAG+="systemd", ENV{SYSTEMD_WANTS}+="usb-mount@%k"
#ACTION=="add", KERNEL=="sd[a-z]", TAG+="systemd", ENV{SYSTEMD_WANTS}+="usb-mount@%k"
ACTION=="add", KERNEL=="mmcblk1p[0-9]*", TAG+="systemd", ENV{SYSTEMD_WANTS}+="usb-mount@%k"
  • 这个规则的意思是当有新的块设备,如/dev/sda1(sd[a-z][0-9])添加到系统时,触发一个systemd服务单元(usb-mount@%k),其中%k代表设备名称。

  • 如果磁盘只有/dev/sdx,如/dev/sda没有带任何数字后缀的,可注释以上第一条匹配sd[a-z][0-9]的规则,取消注释第二条匹配sd[a-z]的规则。

  • KERNEL可修改为其他设备,如nvme0n1p[0-9]*等。

在终端中使用文本编辑器创建一个systemd服务单元文件usb-mount@.service:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#创建服务单元文件
sudo vi /etc/systemd/system/usb-mount@.service

#在文件中添加以下内容
[Unit]
Description=USB Mount Service
BindsTo=dev-%i.device
After=dev-%i.device

[Service]
Type=oneshot
ExecStart=/usr/bin/mount /dev/%I /mnt
#ExecStart=/usr/bin/mount -t exfat /dev/%I /mnt

[Install]
WantedBy=dev-%i.device
  • 这个服务单元的意思是当设备 dev-%i.device 出现后,执行mount命令来挂载设备/dev/%I到/mnt目录下。

  • 也可以修改ExecStart项添加挂载参数,如添加-t exfat。

然后重新加载udev规则,在终端中执行以下命令,

1
2
3
4
5
#重新加载 udev 规则
sudo udevadm control --reload-rules

#重新启动 systemd 服务
sudo systemctl daemon-reload

现在,当插入U盘时,udev将自动识别设备并使用定义的规则挂载设备到/mnt目录下。

14.3.3. udisks2自动挂载

udisks2提供了一个守护进程udisksd,它实现了用于查询和操作存储设备的D-Bus接口,以及一个命令行工具udisksctl,用于查询和使用该守护进程。

鲁班猫部分系统默认安装了udisks2包用于自动挂载,可根据以下命令查看或者安装udisks2软件包:

1
2
3
4
5
6
7
#查看udisks2软件包
dpkg -l udisks2

#安装udisks2软件包
sudo apt update
sudo apt install exfat-fuse ntfs-3g
sudo apt install udisks2

确认系统安装了udisks2软件包情况下,插入U盘然后查看系统硬盘挂载情况:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#插入U盘,lsblk命令查看挂载情况
lsblk
#信息输出如下
NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda            8:0    1 28.8G  0 disk
└─sda1         8:1    1 28.8G  0 part /media/cat/CD78-A15C
mmcblk0      179:0    0 29.3G  0 disk
├─mmcblk0p1  179:1    0    8M  0 part
├─mmcblk0p2  179:2    0  128M  0 part /boot
└─mmcblk0p3  179:3    0 29.2G  0 part /
mmcblk0boot0 179:32   0    4M  1 disk
mmcblk0boot1 179:64   0    4M  1 disk
zram0        254:0    0    0B  0 disk

#查看U盘UUID
blkid /dev/sda1
#信息输出如下
/dev/sda1: UUID="CD78-A15C" BLOCK_SIZE="512" TYPE="vfat"

从以上信息可见,/dev/sda1被挂载到了/media/cat/CD78-A15C,挂载点为/media/用户名/UUID。

udisks2的挂载点仅支持/media/和/run/media/,更多用法请自行研究。

14.3.4. usbmount自动挂载

野火基于开源项目“usbmount”适配了适用鲁班猫系统的usbmount工具,并将工具包制作成了deb包存放到了野火下载源上,可通过apt进行下载。

开源项目地址:https://github.com/rbrito/usbmount

该工具默认支持fat32、vfat ext2 ext3 ext4 hfsplus格式的设备,野火额外添加了exFAT、NTFS格式以及支持nvme硬盘自动挂载支持。

可通过以下命令安装usbmount工具:

1
2
3
4
5
6
7
8
9
#安装工具包
sudo apt update
sudo apt install exfat-fuse ntfs-3g pmount
sudo apt install usbmount

#关闭系统原来可能存在的自动挂载服务
sudo systemctl stop udisks2
sudo systemctl disable udisks2
sudo systemctl mask udisks2

安装完成后插上一个U盘进行测试,如exFAT格式的U盘,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#插入U盘,lsblk命令查看挂载情况
lsblk
#信息输出如下
NAME         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda            8:0    1  28.9G  0 disk
└─sda1         8:1    1  28.8G  0 part /media/usb0
mmcblk0      179:0    0 116.5G  0 disk
├─mmcblk0p1  179:1    0     8M  0 part
├─mmcblk0p2  179:2    0   128M  0 part /boot
└─mmcblk0p3  179:3    0 116.3G  0 part /
mmcblk0boot0 179:32   0     4M  1 disk
mmcblk0boot1 179:64   0     4M  1 disk

从以上信息可见,/dev/sda1被挂载到了/media/usb0。

如果需要修改默认挂载点,需修改/etc/usbmount/usbmount.conf文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#查看配置文件
cat /etc/usbmount/usbmount.conf

#找到以下内容
# Mountpoints: These directories are eligible as mointpoints for
# removable storage devices.  A newly plugged in device is mounted on
# the first directory in this list that exists and on which nothing is
# mounted yet.
MOUNTPOINTS="/media/usb0 /media/usb1 /media/usb2 /media/usb3
            /media/usb4 /media/usb5 /media/usb6 /media/usb7"

默认挂载点为MOUNTPOINTS的定义配置,这些目录有资格作为可移动存储设备的挂载点,当新插入的设备将被挂载到此列表中第一个存在的且尚未挂载任何内容的目录上。

以修改挂载为/mnt目录为例:

1
2
3
4
5
6
7
8
9
#创建挂载目录
sudo mkdir /mnt/usb{0..7}

#打开usbmount.conf配置文件
sudo vi /etc/usbmount/usbmount.conf

#将MOUNTPOINTS挂载目录修改为/mnt目录
MOUNTPOINTS="/mnt/usb0 /mnt/usb1 /mnt/usb2 /mnt/usb3
        /mnt/usb4 /mnt/usb5 /mnt/usb6 /mnt/usb7"

修改完成后重新加载规则:

1
2
#重新加载udev规则
sudo udevadm control --reload-rules

插拔U盘并重新查看挂载情况:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#插拔U盘,lsblk命令查看挂载情况
lsblk
#信息输出如下
NAME         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda            8:0    1  28.9G  0 disk
└─sda1         8:1    1  28.8G  0 part /mnt/usb0
mmcblk0      179:0    0 116.5G  0 disk
├─mmcblk0p1  179:1    0     8M  0 part
├─mmcblk0p2  179:2    0   128M  0 part /boot
└─mmcblk0p3  179:3    0 116.3G  0 part /
mmcblk0boot0 179:32   0     4M  1 disk
mmcblk0boot1 179:64   0     4M  1 disk

从以上信息可见,/dev/sda1被挂载到了/mnt/usb0。