14. 硬盘挂载#
本章节介绍如何在鲁班猫系列板卡上挂载硬盘。
14.1. 查看硬盘#
14.1.1. 命令工具#
14.1.1.1. lsblk#
使用lsblk命令可列出所有可用块设备的信息,显示他们之间的依赖关系。
1lsblk
如下图,文本的左边列出了所有可用块的信息,文本的最右边是当前硬盘的挂载的位置。
可以看到当前的可用块有5个,分别是sda、sdb、mmcblk0、mmcblk0boot0、mmcblk0boot1。
mmcblk0boot0和mmcblk0boot1是mmcblk0的一些信息,在lsblk中可以看到RO项值为1是只读的,所以不能当成可用块来使用。
以上sda是一个msata硬盘,不支持热插拔,RM项值为0,大小是16G的,换算到系统里是14.8G,可读可写,只有一个分区就是sda1,被挂载到了/root/test_blk上。
sdb是一个u盘,支持热插拔,RM项值为1,大小32G,换算到系统里是28.7G,可读可写,只有一个分区就是sdb1,没有被挂载。
mmcblk0是板载emmc,不支持热插拔,RM项值为0,大小32G,换算到系统是29.1G,可读可写,有三个分区:mmcblk0p1是uboot以及系统引导相关的分区,大小为4M; mmcblk0p2是boot分区,存放内核,设备树,配置文件等的分区,被挂载到了/boot分区上;mmcblk0p3是根文件的分区,存放根文件系统,被挂载到/(根目录下的)。
14.1.1.2. fdisk#
使用lsblk命令可以查看硬盘的一些基本信息
1#列出硬盘或者分区的基本信息
2fdisk [options] -l [<disk>]
3
4#修改硬盘或者分区的信息
5fdisk [options] [<disk>]
6
7#例如列出/dev/mmcblk0分区的基本信息
8fdisk -l /dev/mmcblk0
9#信息输出如下
10Disk /dev/mmcblk0: 29.13 GiB, 31272730624 bytes, 61079552 sectors
11Units: sectors of 1 * 512 = 512 bytes
12Sector size (logical/physical): 512 bytes / 512 bytes
13I/O size (minimum/optimal): 512 bytes / 512 bytes
14Disklabel type: gpt
15Disk identifier: D9500000-0000-4945-8000-362C000010D3
16
17Device Start End Sectors Size Type
18/dev/mmcblk0p1 16384 24575 8192 4M unknown
19/dev/mmcblk0p2 24576 286719 262144 128M unknown
20/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#创建要挂载到的文件夹
2mkdir /mnt/mydir
3
4#挂载硬盘
5mount /dev/xxx /mnt/mydir
6
7#例如
8mount /dev/sda1 /mnt/mydir
/dev/xxx是硬盘的分区设备。
/mnt/mydir是要挂载到的文件夹。
若是exFAT格式的硬盘,则需要按以下操作:
1#安装相关工具
2sudo apt-get install exfat-fuse
3
4#挂载硬盘,用-t参数指定格式
5mount -t exfat /dev/sda1 /mnt/mydir/
若是NTFS格式的硬盘,则需要按以下操作:
1#安装相关工具
2sudo apt-get install ntfs-3g
3
4#挂载硬盘,用-t参数指定格式
5mount -t ntfs-3g /dev/sda1 /mnt/mydir/
挂载成功后可以用 lsblk 命令查看:
mount命令的功能十分丰富,此处只是简单讲一下mount的基本用法,如有需要可自行查找mount的具体用法。
14.2.2. 卸载硬盘#
1umount /mnt/mydir
/mnt/mydir是已挂载的文件夹。
14.3. 自动挂载#
14.3.1. fstab自动挂载#
使用fstab挂载的设备必须是每次启动都能识别到的设备,如果在某次启动中不能识别到对应的设备,系统将进入紧急模式。
14.3.1.1. 根据设备分区#
备注
这种方法适合存储设备单一,硬盘设备号不变的自动挂载。
通过/etc/fstab文件来管理设备挂载。
1#修改/etc/fstab文件
2vi /etc/fstab
3
4#添加以下内容
5
6/dev/sdx /mnt/mydir auto defaults 0 2
/dev/sdx 是要挂载的硬盘分区。
/mnt/mydir 是要挂载到的文件夹。
auto 要挂载的硬盘分区的文件系统格式,"auto"是自动判断文件按系统格式,除此之外还有"ext4","ntfs"等。
defaults 配置文件的模式,"defaults"是默认选项,除此之外还有"mode=1777","rw,noauto"等。
0 和 2 分别是备份和检查顺序。
14.3.1.2. 根据设备UUID#
备注
这种方法适合存储设备多且存储设备号会随时改变的情况
UUID是"Universally Unique Identifier"(通用唯一标识符)的缩写,它是一个用于唯一标识计算机系统中各种资源(如磁盘、分区、文件、目录等)的标识符。
UUID是一个128位的数字标识符,通常以16进制表示,目的是在不同的系统和环境中保持唯一性,避免冲突和重复,每个UUID都应该是唯一的,即使在不同的计算机或网络中也是如此。
可通过lsblk和blkid命令查看磁盘的UUID:
1#使用lsblk列出硬盘分区的UUID
2lsblk -o NAME,UUID
3
4#使用blkid列出硬盘分区的UUID
5blkid
获取硬盘分区的UUID后可修改/etc/fstab来根据UUID挂载设备:
1#修改/etc/fstab文件
2vi /etc/fstab
3
4#添加以下内容,UUID根据实际而定
5UUID=xxxxx /mnt/mydir auto defaults 0 2
除了UUID,PARTUUID也有着和UUID一样的功能,这里就不过多赘述了。
14.3.2. udev自动挂载#
udev是Linux系统中用于动态管理设备文件的工具,通过规则文件实现设备的自动化管理和配置。
1#创建一个udev的规则
2sudo vi /etc/udev/rules.d/10-usb-mount.rules
3
4#在文件中添加以下内容
5ACTION=="add", KERNEL=="sd[a-z][0-9]", TAG+="systemd", ENV{SYSTEMD_WANTS}+="usb-mount@%k"
6#ACTION=="add", KERNEL=="sd[a-z]", TAG+="systemd", ENV{SYSTEMD_WANTS}+="usb-mount@%k"
7ACTION=="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#创建服务单元文件
2sudo vi /etc/systemd/system/usb-mount@.service
3
4#在文件中添加以下内容
5[Unit]
6Description=USB Mount Service
7BindsTo=dev-%i.device
8After=dev-%i.device
9
10[Service]
11Type=oneshot
12ExecStart=/usr/bin/mount /dev/%I /mnt
13#ExecStart=/usr/bin/mount -t exfat /dev/%I /mnt
14
15[Install]
16WantedBy=dev-%i.device
这个服务单元的意思是当设备 dev-%i.device 出现后,执行mount命令来挂载设备/dev/%I到/mnt目录下。
也可以修改ExecStart项添加挂载参数,如添加-t exfat。
然后重新加载udev规则,在终端中执行以下命令,
1#重新加载 udev 规则
2sudo udevadm control --reload-rules
3
4#重新启动 systemd 服务
5sudo systemctl daemon-reload
现在,当插入U盘时,udev将自动识别设备并使用定义的规则挂载设备到/mnt目录下。
14.3.3. udisks2自动挂载#
udisks2提供了一个守护进程udisksd,它实现了用于查询和操作存储设备的D-Bus接口,以及一个命令行工具udisksctl,用于查询和使用该守护进程。
鲁班猫部分系统默认安装了udisks2包用于自动挂载,可根据以下命令查看或者安装udisks2软件包:
1#查看udisks2软件包
2dpkg -l udisks2
3
4#安装udisks2软件包
5sudo apt update
6sudo apt install exfat-fuse ntfs-3g
7sudo apt install udisks2
确认系统安装了udisks2软件包情况下,插入U盘然后查看系统硬盘挂载情况:
1#插入U盘,lsblk命令查看挂载情况
2lsblk
3#信息输出如下
4NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
5sda 8:0 1 28.8G 0 disk
6└─sda1 8:1 1 28.8G 0 part /media/cat/CD78-A15C
7mmcblk0 179:0 0 29.3G 0 disk
8├─mmcblk0p1 179:1 0 8M 0 part
9├─mmcblk0p2 179:2 0 128M 0 part /boot
10└─mmcblk0p3 179:3 0 29.2G 0 part /
11mmcblk0boot0 179:32 0 4M 1 disk
12mmcblk0boot1 179:64 0 4M 1 disk
13zram0 254:0 0 0B 0 disk
14
15#查看U盘UUID
16blkid /dev/sda1
17#信息输出如下
18/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#安装工具包
2sudo apt update
3sudo apt install exfat-fuse ntfs-3g pmount
4sudo apt install usbmount
5
6#关闭系统原来可能存在的自动挂载服务
7sudo systemctl stop udisks2
8sudo systemctl disable udisks2
9sudo systemctl mask udisks2
安装完成后插上一个U盘进行测试,如exFAT格式的U盘,
1#插入U盘,lsblk命令查看挂载情况
2lsblk
3#信息输出如下
4NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
5sda 8:0 1 28.9G 0 disk
6└─sda1 8:1 1 28.8G 0 part /media/usb0
7mmcblk0 179:0 0 116.5G 0 disk
8├─mmcblk0p1 179:1 0 8M 0 part
9├─mmcblk0p2 179:2 0 128M 0 part /boot
10└─mmcblk0p3 179:3 0 116.3G 0 part /
11mmcblk0boot0 179:32 0 4M 1 disk
12mmcblk0boot1 179:64 0 4M 1 disk
从以上信息可见,/dev/sda1被挂载到了/media/usb0。
如果需要修改默认挂载点,需修改/etc/usbmount/usbmount.conf文件:
1#查看配置文件
2cat /etc/usbmount/usbmount.conf
3
4#找到以下内容
5# Mountpoints: These directories are eligible as mointpoints for
6# removable storage devices. A newly plugged in device is mounted on
7# the first directory in this list that exists and on which nothing is
8# mounted yet.
9MOUNTPOINTS="/media/usb0 /media/usb1 /media/usb2 /media/usb3
10 /media/usb4 /media/usb5 /media/usb6 /media/usb7"
默认挂载点为MOUNTPOINTS的定义配置,这些目录有资格作为可移动存储设备的挂载点,当新插入的设备将被挂载到此列表中第一个存在的且尚未挂载任何内容的目录上。
以修改挂载为/mnt目录为例:
1#创建挂载目录
2sudo mkdir /mnt/usb{0..7}
3
4#打开usbmount.conf配置文件
5sudo vi /etc/usbmount/usbmount.conf
6
7#将MOUNTPOINTS挂载目录修改为/mnt目录
8MOUNTPOINTS="/mnt/usb0 /mnt/usb1 /mnt/usb2 /mnt/usb3
9 /mnt/usb4 /mnt/usb5 /mnt/usb6 /mnt/usb7"
修改完成后重新加载规则:
1#重新加载udev规则
2sudo udevadm control --reload-rules
插拔U盘并重新查看挂载情况:
1#插拔U盘,lsblk命令查看挂载情况
2lsblk
3#信息输出如下
4NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
5sda 8:0 1 28.9G 0 disk
6└─sda1 8:1 1 28.8G 0 part /mnt/usb0
7mmcblk0 179:0 0 116.5G 0 disk
8├─mmcblk0p1 179:1 0 8M 0 part
9├─mmcblk0p2 179:2 0 128M 0 part /boot
10└─mmcblk0p3 179:3 0 116.3G 0 part /
11mmcblk0boot0 179:32 0 4M 1 disk
12mmcblk0boot1 179:64 0 4M 1 disk
从以上信息可见,/dev/sda1被挂载到了/mnt/usb0。