欢迎光临散文网 会员登陆 & 注册

Raspberry Pi挂载可移动存储设备(Linux通用)

2021-02-02 00:25 作者:28283844972_bili  | 我要投稿

关于在类Unix操作系统中挂载块存储设备,网络上也有很多此类教程,文章、视频演示等各类教学形式也很精彩。所以在这篇文章中详细的理论知识和实操结果演示不再过多的赘述,以Raspberry pi os环境为样例,将更多重点放在实用性命令分享上面,当然也会适当地粗略讲解一些必要的理论知识,另外穿插分享一些我在学习过程中的个人感悟

可能有人会说,都2021年竟然还要大费周章地教小白挂载U盘、移动硬盘等这类可移动存储设备到类Unix操作系统上,大部分图形界面下的Linux发行版目前已实现自动挂载外接存储设备,并在桌面上生成可移动设备图标,提供访问入口,就像Windows那样做到了即插即用,很是方便,包括树莓派官方操作系统Raspberry pi os的图形界面下也做到了自动挂载(实测有效,系统会自动将设备挂载至 /media/<当前用户名>/ 路径下,以随机字符串命名的挂载点上)。确实,如果你是一名刚刚接触类Unix操作系统的萌新,图形化界面相对来说会比较友好,如果是图形化界面实现比较优秀的Linux发行版,平常使用基本可以做到不用接触命令操作。

很遗憾的是,本文用来演示的RaspberryPi运行环境是lite版,无法自动完成期望中的挂载操作,相信其他Linux发行版最简化版本(对,就是只有一个命令行黑框屏版本)也应该不会自动完成挂载,这也是Linux最真实的“性格”。说句题外话,我本人是非常喜欢Linux的这种纯粹,能够让用户灵活掌控全局的特点。

首先来补充一点必要的基础理论知识,什么是挂载?为什么需要挂载?总所周知,在Linux系统中一切皆文件,换句话来说,Linux将所有的硬件设备都当做文件来处理,当使用光驱等硬件设备时,就必须将其挂载到系统中,只有这样才能被Linux所识别。Linux采用的是树形目录结构,且以根目录(/,你没有看错,这就是根目录的标识符)为“树根”,所有文件都放置在这个树形目录结构中。同理,任何硬件设备也都是文件,因为它们各有自己的一套文件系统(文件目录结构),只有将Linux本身的文件目录与硬件设备的文件目录“合二为一,硬件设备才能被使用,这个过程称之为“挂载”。

为了验证可移动存储设备也是以文件的形式存在于Linux中,以及解决在未挂载设备之前如何查看设备信息的问题。首先要清楚硬件设备块文件是存放在 /dev/ 这个目录下,实际上,当存储设备接入Linux后,系统也确实会分配一个目录文件,就位于 /dev/ 目录下,但无法通过这个文件直接访问存储设备内的数据,只会提供此设备的一些基本信息,比如容量等。

首先通过 find /dev/ -type b 命令查找 /dev/ 目录下所有类型为块设备的文件:

实际的块文件数量要比上图中的文件要多,这里仅列出部分查找结果

如果你对Raspberry pi os等类Unix环境比较熟悉的话,可以很轻松地从上图中识别出两个典型的存储设备块文件 /dev/sda/dev/sdb(事实证明也是如此,这就是我外接在树莓派4B上的两块可移动存储设备),其中一块为移动硬盘,另一块是普通的U盘,在Linux下一视同仁地以块文件的形式对待。

这里还有一个小插曲,树莓派4B采用5V3A输入电源,加之官方宣传4B性能有明显的提升,所以我就有了在树莓派上外接两块2.5寸机械硬盘(无额外电源供电)的大胆想法,结果可想而知。。。查阅资料发现树莓派4B的4个USB接口供电最大电流为1.2A(3.0接口 700mA,2.0接口500mA)?!真是无知者无畏!实测,外接一块2.5寸无额外供电机械硬盘和一块普通3.0U盘至树莓派4B能够长时间正常工作。

https://www.raspberrypi.org/documentation/faqs/#pi-power

扯远了,进一步验证 /dev/sda/dev/sdb 这两个文件类型为块设备文件,使用 file /dev/sd* 命令查看文件类型:

硬件设备在Linux上面往往被识别为块设备文件

其中,同样是作为块设备文件的 /dev/sda1/dev/sdb1 又是什么硬件设备呢?这就是存储设备上的分区,/dev/sda1 是存储设备 /dev/sda 上的分区,/dev/sdb1 是存储设备 /dev/sdb 上的分区(实际情况也是如此,每块存储设备上仅分配了一块分区)。关于在Raspberry pi os等类Unix操作系统中给存储设备分区和创建文件系统的实用操作,我会另外使用一篇文章的篇幅叙述。

上述打印结果可能并没有很直观地体现两者之间的关系,没关系,还有另外一个更为简便、直观、快捷的命令帮助你快速定位外接到树莓派上的存储设备,使用命令 lsblk 可以列出当前所有与存储设备相关的信息:

很直观不是吗?设备及其分区之间的关系一目了然

我个人常常将 lsblk 命令用于设备挂载之前的检查挂载操作结束后的结果验证环节,相比在 fdisk -l 命令输出的一大串结果中大海捞针般的查找,更何况还需要提权操作(sudo),lsblk 输出结果真的很直观、简洁,便于查找新外接设备的块文件名称,后面挂载设备需要用到。虽然 fdisk -l <目标块设备文件路径> 也能轻松地查看块设备信息(单独列出),但是别忘了我们的目标就是要查找目标块设备文件路径,不要本末倒置。哈哈,作为生产工具怎么方便就怎么来嘛!

既然清楚了块设备文件路径,下一步操作就是挂载,首先得在适当的位置创建一个空目录作为挂载点。并不是根目录下任何一个目录都可以作为挂载点,因为挂载操作会使得被挂载目录中原有的数据文件被隐藏(可以尝试一下,我初次遇到这种情况的时候还着干急了一把),因此根目录以及系统原有目录都不能作为挂载点,否则会造成系统异常甚至崩溃,挂载点最好是新建的空目录。一般是在 /media/<当前用户名>/ 目录下创建挂载点(旧标准是在 /mnt/ 目录下创建挂载点),例如 /media/pi/disk/ 就是一个标准的挂载点。

假定待挂载的存储设备分区文件系统是FAT32格式(大部分U盘的文件系统都是如此,少部分会使用exFAT,外接硬盘一般会使用NTFS),使用 sudo mount -t vfat /dev/<目标块设备文件名称> /media/<当前用户名>/<挂载点>/ 命令进行挂载,例如 sudo mount -t vfat /dev/sda1 /media/pi/disk/ ,使用sudo命令提权(我个人习惯是尽可能地不在root环境下执行命令,因为随时使用sudo命令提权,加之有所限制的操作可以很好地防止我犯错,有一定的安全感!万一哪天不小心在root环境下执行了 rm -rf /* 呢?doge)

其中vfat是FAT32在Linux下的类型名称,-t vfat 指明了待挂载文件系统的类型。需要注意的是,挂载是对设备分区而言,而分区上的文件系统决定了数据的逻辑存储形式,Linux需要知道设备上数据的逻辑存储形式,才能正确读写数据。因此 sudo mount -t vfat /dev/sda /media/pi/disk/ 是无法访问设备数据的,看出区别来了吗?另外,只有分区而没有在分区上创建相应的文件系统也是无法正确读写数据的!(Windows中分区和创建文件系统一气呵成,不存在这个问题;但是Linux中分区和创建文件系统是分开进行,结局你懂的)

现在 /dev/sda1 已经被挂载在了 /media/pi/disk/ 挂载点上,再次使用 lsblk 命令验证挂载是否成功,重点是输出结果中挂载点路径是否符合预期:

我个人挂载操作时的错误示范,挂载点不规范,作为反面教材

着用 cd /media/pi/disk/ 命令查看一下数据是否完整,一般情况下会提示权限不够(除非root默认mask值是0022),如果不在root环境下操作,在设备上的每一次操作都需要提权,这不得麻烦死我!试着改变挂载点所有者和所属组,使用 sudo chown -R pi:pi /media/pi/disk/ 命令,很遗憾在Raspberry pi os环境下是无法达到预期效果的(其他Linux发行版未作尝试),原因是FAT32文件系统的工作原理与ext家族等此类Linux原生文件系统的工作原理相同,在文件权限的实现上存在差异。好在天无绝人之路,既然“后天”无法改变,那就从挂载的那一刻规划好目标,使用 sudo mount -t vfat -o uid=pi,gid=pi,dmask=027,fmask=137 /dev/sda1 /media/pi/disk/ 命令。

看上去好长的一行命令,逐步分析,-o选项后面跟着一长串的参数,uid指定所有者,gid指定所属组,dmask指定目录权限掩码,fmask指定文件权限掩码,“先天”确定了挂载点的一些属性值,结果也达到了预期值,缺点也很明显,虽然不需要提权操作,但是使用过程中想要轻易改变挂载点中的文件权限也不是那么容易,不是很灵活。

有什么好办法既可以方便地修改权限,也能很好地适用于Linux环境下呢?答案是Linux原生文件系统,例如ext家族等此类灵活、高效的文件系统,以ext2文件系统为例,一个高效、轻资源消耗的文件系统,数据传输效率不亚于FAT32,适用于移动硬盘、U盘等设备,不同于FAT32受限于无法传输单个大于4GB大小文件,ext家族支持大于4GB的单个文件传输,另外文件命名限制也比FAT32要宽松许多。首先是挂载,老规矩 sudo mount -t ext2 /dev/sda1 /media/pi/disk/ ,更改挂载点所属者与所属组 sudo chown -R pi:pi /media/pi/disk/ ,更改挂载点文件权限 chmod -R 0750 /media/pi/disk/ ,使用过程中可以随时更改权限或单独指定权限。同理,其他的Linux原生文件系统操作基本类似。实际上,我个人挂载在树莓派上的可移动存储设备分区无一例外地使用了ext2ext4文件系统,以获取在Linux环境下更好地支持。

“喂,你小子咋不介绍一下exFATNTFS文件系统如何挂载到Rasperry pi os等类Unix操作系统上呢?”,大概会有朋友这么问道。个人方面的原因如下:

  1. 首先使用上述文件系统,一般是需要在Linux系统中单独安装工具库(exfat-fuse exfat-utils ntfs-3g),使得Linux能够正常读写此类文件系统中的数据,数据传输效率会有所折扣,事实证明NTFS在Linux下的数据传输速率远不如FAT32,更别提ext家族。如果说是为了弥补FAT32无法传输单个>4GB文件的短板,这不免是一种捡了芝麻,丢了西瓜的行为。

  2. 其次我本人不太愿意在自己的树莓派中安装过多的工具库,让整个系统趋向于和Windows那样臃肿,这不符合我使用Linux作为学习环境的初衷,既然从一开始就使用lite系统,可想而知我本人是个极简主义和实用主义者。

  3. 最后,它们都不开源,我个人不是很喜欢Windows黑盒,虽然保姆级别的自动化服务和极为成熟且美观的图形化环境令用户深陷其中、无法自拔,但是这种永远猜不透它内心的距离感让我不是很舒服;另外Windows总是自成一家的设立一些标准,即使是面对国际计算机通用技术标准也要耍一耍小性子,这种过度标新立异的结果往往是Windows在自娱自乐,作为通用操作系统没必要太惯着Windows![doge]

“你小子在逗我呢?如果连NTFS和exFAT都不让我使用,那我怎么在Linux和Windows之间方便的传输数据呢?”,不是不让使用,而是建议尽量避免使用,我也知道真正消除对Windows的依赖也不能一蹴而就(它太香了!),但是选择Linux作为学习或者生产工具就需要沉浸式体验,尽可能地排除一些放弃继续学习的干扰因素。这样才能高效地掌握并提高自身的Linux操作技能。可以另外使用一些文件传输服务,例如samba,在局域网中近距离地在Linux和Windows机器之间传输少量数据,克服文件系统不相通的障碍,帮助你从Windows向Linux过渡,稍加利用可以作为利用树莓派当下载机的相关基础服务,关于samba服务的搭建将会另外开辟一篇文章的篇幅叙述。(又给自己挖坑了)

既然有挂载这一步操作,那就必然有卸载操作,不像在Windows中只要点击弹出大容量磁盘那么简单地就可以卸载U盘(甚至可以直接热插拔U盘),Linux下需要多一步卸载操作,在卸载操作之前,请确保你当前的工作目录不处于挂载点中,或没有正在对设备的读写进程,否则系统会提示你当前设备正忙,无法实现卸载操作,强制拔出设备可能会造成数据损坏,并且设备占用的块文件和挂载点,直到在下次系统重启之前都无法被释放的情况!

使用命令 sudo umount /dev/<目标块设备文件名> 或 sudo umount /media/<当前用户名>/<挂载点>/ 卸载设备,例如 sudo umount /dev/sda1 或 sudo umount /media/pi/disk/ ,注意,当你使用挂载点路径作为卸载设备依据的时候,请务必确保是绝对路径,相对路径无法实现设别的正常卸载。

到目前为止,看似基本已完成最初的挂载可移动存储设备的目标了,但仔细一想,如果我每次都要通过命令行访问挂载点设备上的数据内容,而恰好我的工作目录大部分时间都不在 /media/pi/disk/ 目录下,岂不是都要使用 cd /media/pi/disk/ 这么一长串的命令?岂不是又要麻烦死我?

可以使用软链接工具帮忙创建一个直达挂载点目录的“快捷方式”,轻松访问设备数据,假设你经常处在的工作目录为当前用户的 /home/<当前用户名>/(家目录)下,以 /home/pi/ 为例,使用命令 ln -s /media/pi/disk/ ~/disk ,此时就在pi用户的家目录下创建了一个名为disk的软链接文件,通过 cd ~/disk 命令就能轻松访问挂载点设备数据内容,等效于 cd /media/pi/disk/ 命令。

呼,终于到文章结尾了,如果你觉得文章中叙述的命令和工具,或是我个人的学习感悟对你的学习和问题解决有帮助的话,那么这篇文章的目标也就达成了。可能大部分朋友更喜欢以视频讲解的形式直观地分享一些知识,奈何我是个手残党,不太擅长视频剪辑技术,而这篇文章也将继续默默无闻地传达着它应有的知识,期待着与你这样的有缘人相遇,感谢你的耐心阅读!

另外,我本人也是刚接触树莓派不久的萌新,对树莓派和Linux操作系统的特性理解程度有限,文章中出现的各类疏漏与错误欢迎在评论区批评指正,互相分享学习经验;也请懂行的大佬们喷轻一些,鼓励一下像我这样的小白乐于分享自己的学习经验,感激不尽!



Raspberry Pi挂载可移动存储设备(Linux通用)的评论 (共 条)

分享到微博请遵守国家法律