树莓派挂载移动硬盘

过年这几天鼓捣一下树莓派,结果各种麻烦。。。尤其是在挂载exFat格式的移动硬盘的时候,明明临时挂载是没有问题的,但是一旦做了开机自动挂载的话,就连系统都启动不了了。经过不懈的百度,终于解决了问题,特此记录一下。

创建挂载点

首先要创建挂载点,其实就是创建个文件夹,移动硬盘会挂载到这个文件夹,比如我创建了一个/mnt/servicedisk

1
sudo mkdir /mnt/servicedisk

然后再授权:

1
sudo chmod 777 /mnt/servicedisk

目前了解到linux有两个目录比较适合挂载移动硬盘,一个是「media」,适合挂载外部多媒体驱动,一个是「mnt」,适合挂载外部储存设备。

临时挂载硬盘

为了测试硬盘是否可用,需要先临时挂载一下。

查询硬盘信息

通过下面的命令查询当前的所有硬盘信息:

1
sudo fdisk -l

返回信息如下:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
pi@raspberrypi:~ $ sudo fdisk -l
Disk /dev/ram0: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram1: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram2: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram3: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram4: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram5: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram6: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram7: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram8: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram9: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram10: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram11: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram12: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram13: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram14: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram15: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/mmcblk0: 119.3 GiB, 128094044160 bytes, 250183680 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: dos
Disk identifier: 0x9dddeedf

Device         Boot  Start       End   Sectors  Size Id Type
/dev/mmcblk0p1        8192    532479    524288  256M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      532480 250183679 249651200  119G 83 Linux


Disk /dev/sda: 465.76 GiB, 500107862016 bytes, 976773168 sectors
Disk model: HDD             
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: 2C9DFE05-186E-4911-B369-1CED62B9A27D

Device      Start       End   Sectors   Size Type
/dev/sda1      40    409639    409600   200M EFI System
/dev/sda2  411648 976773119 976361472 465.6G Microsoft basic data

在最下面的Device一栏就是外部链接的存储设备了,我目前只接了一块忆捷的移动硬盘,它自带两个分区:

接下来我就要挂载这个/dev/sda2了。

临时挂载

1
2
3
sudo mount /dev/sda2 /mnt/servicedisk

ls /mnt/servicedisk

如果ls命令没有报错,那么就表示临时挂载成功!

查询挂载情况

可以使用df -h命令查询挂载情况,可以看到/dev/sda2已经成功挂载到了对应的挂载点,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
pi@raspberrypi:~ $ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       118G  1.4G  112G   2% /
devtmpfs        1.7G     0  1.7G   0% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           760M  852K  759M   1% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
/dev/mmcblk0p1  253M   31M  222M  13% /boot
/dev/sda2       466G   11M  466G   1% /mnt/servicedisk
tmpfs           380M     0  380M   0% /run/user/1000

开机自动挂载

查询硬盘身份信息

1
2
$ sudo blkid /dev/sda2
/dev/sda2: LABEL="servicedisk" UUID="6201-451A" BLOCK_SIZE="512" TYPE="exfat" PARTUUID="ae27284a-b254-4bde-8a55-7457c694a22a"

修改系统配置文件

1
sudo nano /etc/fstab

打开后是这样子:

1
2
3
4
5
6
7
PARTUUID=9dddeedf-01  /boot           vfat    defaults          0       2
PARTUUID=9dddeedf-02  /               ext4    defaults,noatime  0       1

# 在最后添加自己的移动硬盘信息
PARTUUID=ae27284a-b254-4bde-8a55-7457c694a22a  /mnt/servicedisk  auto umask=0000  0  0
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

然后control O保存,control x退出。

坑就在这里了,网上很多帖子是用UUID或者用LEBAL,然后后面的格式用exfat或者vfat,我实测下来都失败了,重启之后ssh都连不上了。所以**这里一定要用PARTUUIDauto,后面还要跟umask=0000,四个🥚表示所有用户都有读写运行权限。

测试一下

最后还要测试一下,以免重启之后ssh连不上就悲剧了,只能再重新烧录系统了。(🤦‍♂️我就因为上一步没配置对导致烧录了N遍系统)

1
sudo mount -a

重启

这个就不用说了。

挂载到普通用户

在linux上,移动硬盘会默认挂载到root,而且里面的所有文件都是归属到root的,不支持修改。

这就麻烦了,因为我们日常操作都是以普通用户身份进行的,甚至有些第三方软件禁止以root身份运行,比如我最近在搞的Gitea

查询当前挂载到的用户

1
2
3
4
5
6
$ ls -l

-rwxr-xr-x 1 root root    808 Feb  8 15:48 docker-compose.yml
drwxr-xr-x 5 root root 131072 Feb  8 13:53 gitea
drwxr-xr-x 2 root root 131072 Feb  8 15:48 mysql
drwxr-xr-x 2 root root 131072 Feb  8 15:28 test

查看当前普通用户的身份信息

1
2
3
$id

uid=1000(pi) gid=1000(pi) groups=1000(pi),4(adm),20(dialout),24(cdrom),27(sudo),29(audio),44(video),46(plugdev),60(games),100(users),105(input),107(render),109(netdev),995(docker),997(gpio),998(i2c),999(spi)

可以看到:

临时挂载

首先卸载硬盘

1
sudo umount /dev/sda2

再重新挂载

1
sudo mount /dev/sda2 service -o uid=$id gid=995

然后再次ls -l查询挂载点,就发现已经挂载到普通用户了。

开机自动挂载到目标用户

同理,开机自动挂载就是在之前的基础上添加两个参数:

1
PARTUUID=ae27284a-b254-4bde-8a55-7457c694a22a  /mnt/servicedisk  auto umask=0000,uid=1000,gid=995  0  0

配置完可以重启试一下,在树莓派64位系统上实测是成功的。