Raspberry Pi掛載可移動(dòng)存儲(chǔ)設(shè)備(Linux通用)
關(guān)于在類Unix操作系統(tǒng)中掛載塊存儲(chǔ)設(shè)備,網(wǎng)絡(luò)上也有很多此類教程,文章、視頻演示等各類教學(xué)形式也很精彩。所以在這篇文章中詳細(xì)的理論知識(shí)和實(shí)操結(jié)果演示不再過多的贅述,以Raspberry pi os環(huán)境為樣例,將更多重點(diǎn)放在實(shí)用性命令分享上面,當(dāng)然也會(huì)適當(dāng)?shù)卮致灾v解一些必要的理論知識(shí),另外穿插分享一些我在學(xué)習(xí)過程中的個(gè)人感悟。

可能有人會(huì)說,都2021年竟然還要大費(fèi)周章地教小白掛載U盤、移動(dòng)硬盤等這類可移動(dòng)存儲(chǔ)設(shè)備到類Unix操作系統(tǒng)上,大部分圖形界面下的Linux發(fā)行版目前已實(shí)現(xiàn)自動(dòng)掛載外接存儲(chǔ)設(shè)備,并在桌面上生成可移動(dòng)設(shè)備圖標(biāo),提供訪問入口,就像Windows那樣做到了即插即用,很是方便,包括樹莓派官方操作系統(tǒng)Raspberry pi os的圖形界面下也做到了自動(dòng)掛載(實(shí)測有效,系統(tǒng)會(huì)自動(dòng)將設(shè)備掛載至?/media/<當(dāng)前用戶名>/?路徑下,以隨機(jī)字符串命名的掛載點(diǎn)上)。確實(shí),如果你是一名剛剛接觸類Unix操作系統(tǒng)的萌新,圖形化界面相對(duì)來說會(huì)比較友好,如果是圖形化界面實(shí)現(xiàn)比較優(yōu)秀的Linux發(fā)行版,平常使用基本可以做到不用接觸命令操作。
很遺憾的是,本文用來演示的RaspberryPi運(yùn)行環(huán)境是lite版,無法自動(dòng)完成期望中的掛載操作,相信其他Linux發(fā)行版最簡化版本(對(duì),就是只有一個(gè)命令行黑框屏版本)也應(yīng)該不會(huì)自動(dòng)完成掛載,這也是Linux最真實(shí)的“性格”。說句題外話,我本人是非常喜歡Linux的這種純粹,能夠讓用戶靈活掌控全局的特點(diǎn)。

首先來補(bǔ)充一點(diǎn)必要的基礎(chǔ)理論知識(shí),什么是掛載?為什么需要掛載?總所周知,在Linux系統(tǒng)中一切皆文件,換句話來說,Linux將所有的硬件設(shè)備都當(dāng)做文件來處理,當(dāng)使用光驅(qū)等硬件設(shè)備時(shí),就必須將其掛載到系統(tǒng)中,只有這樣才能被Linux所識(shí)別。Linux采用的是樹形目錄結(jié)構(gòu),且以根目錄(/,你沒有看錯(cuò),這就是根目錄的標(biāo)識(shí)符)為“樹根”,所有文件都放置在這個(gè)樹形目錄結(jié)構(gòu)中。同理,任何硬件設(shè)備也都是文件,因?yàn)樗鼈兏饔凶约旱囊惶?span id="s0sssss00s" class="color-yellow-04">文件系統(tǒng)(文件目錄結(jié)構(gòu)),只有將Linux本身的文件目錄與硬件設(shè)備的文件目錄“合二為一”,硬件設(shè)備才能被使用,這個(gè)過程稱之為“掛載”。
為了驗(yàn)證可移動(dòng)存儲(chǔ)設(shè)備也是以文件的形式存在于Linux中,以及解決在未掛載設(shè)備之前如何查看設(shè)備信息的問題。首先要清楚硬件設(shè)備塊文件是存放在?/dev/?這個(gè)目錄下,實(shí)際上,當(dāng)存儲(chǔ)設(shè)備接入Linux后,系統(tǒng)也確實(shí)會(huì)分配一個(gè)目錄文件,就位于 /dev/ 目錄下,但無法通過這個(gè)文件直接訪問存儲(chǔ)設(shè)備內(nèi)的數(shù)據(jù),只會(huì)提供此設(shè)備的一些基本信息,比如容量等。
首先通過 find /dev/ -type b 命令查找 /dev/ 目錄下所有類型為塊設(shè)備的文件:

如果你對(duì)Raspberry pi os等類Unix環(huán)境比較熟悉的話,可以很輕松地從上圖中識(shí)別出兩個(gè)典型的存儲(chǔ)設(shè)備塊文件 /dev/sda 和 /dev/sdb(事實(shí)證明也是如此,這就是我外接在樹莓派4B上的兩塊可移動(dòng)存儲(chǔ)設(shè)備),其中一塊為移動(dòng)硬盤,另一塊是普通的U盤,在Linux下一視同仁地以塊文件的形式對(duì)待。
這里還有一個(gè)小插曲,樹莓派4B采用5V3A輸入電源,加之官方宣傳4B性能有明顯的提升,所以我就有了在樹莓派上外接兩塊2.5寸機(jī)械硬盤(無額外電源供電)的大膽想法,結(jié)果可想而知。。。查閱資料發(fā)現(xiàn)樹莓派4B的4個(gè)USB接口供電最大電流為1.2A(3.0接口 700mA,2.0接口500mA)?!真是無知者無畏!實(shí)測,外接一塊2.5寸無額外供電機(jī)械硬盤和一塊普通3.0U盤至樹莓派4B能夠長時(shí)間正常工作。

扯遠(yuǎn)了,進(jìn)一步驗(yàn)證 /dev/sda 和 /dev/sdb 這兩個(gè)文件類型為塊設(shè)備文件,使用 file /dev/sd* 命令查看文件類型:

其中,同樣是作為塊設(shè)備文件的 /dev/sda1 和 /dev/sdb1 又是什么硬件設(shè)備呢?這就是存儲(chǔ)設(shè)備上的分區(qū),/dev/sda1 是存儲(chǔ)設(shè)備?/dev/sda 上的分區(qū),/dev/sdb1 是存儲(chǔ)設(shè)備?/dev/sdb 上的分區(qū)(實(shí)際情況也是如此,每塊存儲(chǔ)設(shè)備上僅分配了一塊分區(qū))。關(guān)于在Raspberry pi os等類Unix操作系統(tǒng)中給存儲(chǔ)設(shè)備分區(qū)和創(chuàng)建文件系統(tǒng)的實(shí)用操作,我會(huì)另外使用一篇文章的篇幅敘述。
上述打印結(jié)果可能并沒有很直觀地體現(xiàn)兩者之間的關(guān)系,沒關(guān)系,還有另外一個(gè)更為簡便、直觀、快捷的命令幫助你快速定位外接到樹莓派上的存儲(chǔ)設(shè)備,使用命令 lsblk 可以列出當(dāng)前所有與存儲(chǔ)設(shè)備相關(guān)的信息:

我個(gè)人常常將 lsblk 命令用于設(shè)備掛載之前的檢查,掛載操作結(jié)束后的結(jié)果驗(yàn)證環(huán)節(jié),相比在?fdisk -l?命令輸出的一大串結(jié)果中大海撈針般的查找,更何況還需要提權(quán)操作(sudo),lsblk 輸出結(jié)果真的很直觀、簡潔,便于查找新外接設(shè)備的塊文件名稱,后面掛載設(shè)備需要用到。雖然 fdisk -l <目標(biāo)塊設(shè)備文件路徑> 也能輕松地查看塊設(shè)備信息(單獨(dú)列出),但是別忘了我們的目標(biāo)就是要查找目標(biāo)塊設(shè)備文件路徑,不要本末倒置。哈哈,作為生產(chǎn)工具怎么方便就怎么來嘛!

既然清楚了塊設(shè)備文件路徑,下一步操作就是掛載,首先得在適當(dāng)?shù)奈恢?/span>創(chuàng)建一個(gè)空目錄作為掛載點(diǎn)。并不是根目錄下任何一個(gè)目錄都可以作為掛載點(diǎn),因?yàn)閽燧d操作會(huì)使得被掛載目錄中原有的數(shù)據(jù)文件被隱藏(可以嘗試一下,我初次遇到這種情況的時(shí)候還著干急了一把),因此根目錄以及系統(tǒng)原有目錄都不能作為掛載點(diǎn),否則會(huì)造成系統(tǒng)異常甚至崩潰,掛載點(diǎn)最好是新建的空目錄。一般是在?/media/<當(dāng)前用戶名>/?目錄下創(chuàng)建掛載點(diǎn)(舊標(biāo)準(zhǔn)是在 /mnt/ 目錄下創(chuàng)建掛載點(diǎn)),例如 /media/pi/disk/?就是一個(gè)標(biāo)準(zhǔn)的掛載點(diǎn)。
假定待掛載的存儲(chǔ)設(shè)備分區(qū)文件系統(tǒng)是FAT32格式(大部分U盤的文件系統(tǒng)都是如此,少部分會(huì)使用exFAT,外接硬盤一般會(huì)使用NTFS),使用?sudo?mount -t vfat /dev/<目標(biāo)塊設(shè)備文件名稱> /media/<當(dāng)前用戶名>/<掛載點(diǎn)>/ 命令進(jìn)行掛載,例如 sudo?mount -t vfat /dev/sda1 /media/pi/disk/?,使用sudo命令提權(quán)(我個(gè)人習(xí)慣是盡可能地不在root環(huán)境下執(zhí)行命令,因?yàn)殡S時(shí)使用sudo命令提權(quán),加之有所限制的操作可以很好地防止我犯錯(cuò),有一定的安全感!萬一哪天不小心在root環(huán)境下執(zhí)行了 rm -rf /* 呢?doge)
其中vfat是FAT32在Linux下的類型名稱,-t vfat 指明了待掛載文件系統(tǒng)的類型。需要注意的是,掛載是對(duì)設(shè)備分區(qū)而言,而分區(qū)上的文件系統(tǒng)決定了數(shù)據(jù)的邏輯存儲(chǔ)形式,Linux需要知道設(shè)備上數(shù)據(jù)的邏輯存儲(chǔ)形式,才能正確讀寫數(shù)據(jù)。因此?sudo?mount -t vfat /dev/sda /media/pi/disk/ 是無法訪問設(shè)備數(shù)據(jù)的,看出區(qū)別來了嗎?另外,只有分區(qū)而沒有在分區(qū)上創(chuàng)建相應(yīng)的文件系統(tǒng)也是無法正確讀寫數(shù)據(jù)的!(Windows中分區(qū)和創(chuàng)建文件系統(tǒng)一氣呵成,不存在這個(gè)問題;但是Linux中分區(qū)和創(chuàng)建文件系統(tǒng)是分開進(jìn)行,結(jié)局你懂的)
現(xiàn)在 /dev/sda1 已經(jīng)被掛載在了 /media/pi/disk/ 掛載點(diǎn)上,再次使用 lsblk 命令驗(yàn)證掛載是否成功,重點(diǎn)是輸出結(jié)果中掛載點(diǎn)路徑是否符合預(yù)期:

再試著用?cd /media/pi/disk/?命令查看一下數(shù)據(jù)是否完整,一般情況下會(huì)提示權(quán)限不夠(除非root默認(rèn)mask值是0022),如果不在root環(huán)境下操作,在設(shè)備上的每一次操作都需要提權(quán),這不得麻煩死我!試著改變掛載點(diǎn)所有者和所屬組,使用 sudo chown -R pi:pi /media/pi/disk/ 命令,很遺憾在Raspberry pi os環(huán)境下是無法達(dá)到預(yù)期效果的(其他Linux發(fā)行版未作嘗試),原因是FAT32文件系統(tǒng)的工作原理與ext家族等此類Linux原生文件系統(tǒng)的工作原理相同,在文件權(quán)限的實(shí)現(xiàn)上存在差異。好在天無絕人之路,既然“后天”無法改變,那就從掛載的那一刻規(guī)劃好目標(biāo),使用 sudo mount -t vfat -o uid=pi,gid=pi,dmask=027,fmask=137 /dev/sda1 /media/pi/disk/ 命令。
看上去好長的一行命令,逐步分析,-o選項(xiàng)后面跟著一長串的參數(shù),uid指定所有者,gid指定所屬組,dmask指定目錄權(quán)限掩碼,fmask指定文件權(quán)限掩碼,“先天”確定了掛載點(diǎn)的一些屬性值,結(jié)果也達(dá)到了預(yù)期值,缺點(diǎn)也很明顯,雖然不需要提權(quán)操作,但是使用過程中想要輕易改變掛載點(diǎn)中的文件權(quán)限也不是那么容易,不是很靈活。

有什么好辦法既可以方便地修改權(quán)限,也能很好地適用于Linux環(huán)境下呢?答案是Linux原生文件系統(tǒng),例如ext家族等此類靈活、高效的文件系統(tǒng),以ext2文件系統(tǒng)為例,一個(gè)高效、輕資源消耗的文件系統(tǒng),數(shù)據(jù)傳輸效率不亞于FAT32,適用于移動(dòng)硬盤、U盤等設(shè)備,不同于FAT32受限于無法傳輸單個(gè)大于4GB大小文件,ext家族支持大于4GB的單個(gè)文件傳輸,另外文件命名限制也比FAT32要寬松許多。首先是掛載,老規(guī)矩 sudo mount -t ext2 /dev/sda1 /media/pi/disk/ ,更改掛載點(diǎn)所屬者與所屬組?sudo chown -R pi:pi /media/pi/disk/ ,更改掛載點(diǎn)文件權(quán)限 chmod -R 0750 /media/pi/disk/ ,使用過程中可以隨時(shí)更改權(quán)限或單獨(dú)指定權(quán)限。同理,其他的Linux原生文件系統(tǒng)操作基本類似。實(shí)際上,我個(gè)人掛載在樹莓派上的可移動(dòng)存儲(chǔ)設(shè)備分區(qū)無一例外地使用了ext2或ext4文件系統(tǒng),以獲取在Linux環(huán)境下更好地支持。
“喂,你小子咋不介紹一下exFAT和NTFS文件系統(tǒng)如何掛載到Rasperry pi os等類Unix操作系統(tǒng)上呢?”,大概會(huì)有朋友這么問道。個(gè)人方面的原因如下:
首先使用上述文件系統(tǒng),一般是需要在Linux系統(tǒng)中單獨(dú)安裝工具庫(exfat-fuse exfat-utils?ntfs-3g),使得Linux能夠正常讀寫此類文件系統(tǒng)中的數(shù)據(jù),數(shù)據(jù)傳輸效率會(huì)有所折扣,事實(shí)證明NTFS在Linux下的數(shù)據(jù)傳輸速率遠(yuǎn)不如FAT32,更別提ext家族。如果說是為了彌補(bǔ)FAT32無法傳輸單個(gè)>4GB文件的短板,這不免是一種撿了芝麻,丟了西瓜的行為。
其次我本人不太愿意在自己的樹莓派中安裝過多的工具庫,讓整個(gè)系統(tǒng)趨向于和Windows那樣臃腫,這不符合我使用Linux作為學(xué)習(xí)環(huán)境的初衷,既然從一開始就使用lite系統(tǒng),可想而知我本人是個(gè)極簡主義和實(shí)用主義者。
最后,它們都不開源,我個(gè)人不是很喜歡Windows黑盒,雖然保姆級(jí)別的自動(dòng)化服務(wù)和極為成熟且美觀的圖形化環(huán)境令用戶深陷其中、無法自拔,但是這種永遠(yuǎn)猜不透它內(nèi)心的距離感讓我不是很舒服;另外Windows總是自成一家的設(shè)立一些標(biāo)準(zhǔn),即使是面對(duì)國際計(jì)算機(jī)通用技術(shù)標(biāo)準(zhǔn)也要耍一耍小性子,這種過度標(biāo)新立異的結(jié)果往往是Windows在自娛自樂,作為通用操作系統(tǒng)沒必要太慣著Windows![doge]
“你小子在逗我呢?如果連NTFS和exFAT都不讓我使用,那我怎么在Linux和Windows之間方便的傳輸數(shù)據(jù)呢?”,不是不讓使用,而是建議盡量避免使用,我也知道真正消除對(duì)Windows的依賴也不能一蹴而就(它太香了?。?,但是選擇Linux作為學(xué)習(xí)或者生產(chǎn)工具就需要沉浸式體驗(yàn),盡可能地排除一些放棄繼續(xù)學(xué)習(xí)的干擾因素。這樣才能高效地掌握并提高自身的Linux操作技能??梢粤硗馐褂靡恍┪募鬏敺?wù),例如samba,在局域網(wǎng)中近距離地在Linux和Windows機(jī)器之間傳輸少量數(shù)據(jù),克服文件系統(tǒng)不相通的障礙,幫助你從Windows向Linux過渡,稍加利用可以作為利用樹莓派當(dāng)下載機(jī)的相關(guān)基礎(chǔ)服務(wù),關(guān)于samba服務(wù)的搭建將會(huì)另外開辟一篇文章的篇幅敘述。(又給自己挖坑了)

既然有掛載這一步操作,那就必然有卸載操作,不像在Windows中只要點(diǎn)擊彈出大容量磁盤那么簡單地就可以卸載U盤(甚至可以直接熱插拔U盤),Linux下需要多一步卸載操作,在卸載操作之前,請(qǐng)確保你當(dāng)前的工作目錄不處于掛載點(diǎn)中,或沒有正在對(duì)設(shè)備的讀寫進(jìn)程,否則系統(tǒng)會(huì)提示你當(dāng)前設(shè)備正忙,無法實(shí)現(xiàn)卸載操作,強(qiáng)制拔出設(shè)備可能會(huì)造成數(shù)據(jù)損壞,并且設(shè)備占用的塊文件和掛載點(diǎn),直到在下次系統(tǒng)重啟之前都無法被釋放的情況!
使用命令 sudo umount /dev/<目標(biāo)塊設(shè)備文件名> 或 sudo umount?/media/<當(dāng)前用戶名>/<掛載點(diǎn)>/ 卸載設(shè)備,例如 sudo umount /dev/sda1 或 sudo umount /media/pi/disk/ ,注意,當(dāng)你使用掛載點(diǎn)路徑作為卸載設(shè)備依據(jù)的時(shí)候,請(qǐng)務(wù)必確保是絕對(duì)路徑,相對(duì)路徑無法實(shí)現(xiàn)設(shè)別的正常卸載。

到目前為止,看似基本已完成最初的掛載可移動(dòng)存儲(chǔ)設(shè)備的目標(biāo)了,但仔細(xì)一想,如果我每次都要通過命令行訪問掛載點(diǎn)設(shè)備上的數(shù)據(jù)內(nèi)容,而恰好我的工作目錄大部分時(shí)間都不在 /media/pi/disk/ 目錄下,豈不是都要使用 cd /media/pi/disk/ 這么一長串的命令?豈不是又要麻煩死我?
可以使用軟鏈接工具幫忙創(chuàng)建一個(gè)直達(dá)掛載點(diǎn)目錄的“快捷方式”,輕松訪問設(shè)備數(shù)據(jù),假設(shè)你經(jīng)常處在的工作目錄為當(dāng)前用戶的 /home/<當(dāng)前用戶名>/(家目錄)下,以 /home/pi/ 為例,使用命令 ln -s /media/pi/disk/ ~/disk ,此時(shí)就在pi用戶的家目錄下創(chuàng)建了一個(gè)名為disk的軟鏈接文件,通過 cd ~/disk 命令就能輕松訪問掛載點(diǎn)設(shè)備數(shù)據(jù)內(nèi)容,等效于 cd /media/pi/disk/ 命令。

呼,終于到文章結(jié)尾了,如果你覺得文章中敘述的命令和工具,或是我個(gè)人的學(xué)習(xí)感悟?qū)δ愕膶W(xué)習(xí)和問題解決有幫助的話,那么這篇文章的目標(biāo)也就達(dá)成了。可能大部分朋友更喜歡以視頻講解的形式直觀地分享一些知識(shí),奈何我是個(gè)手殘黨,不太擅長視頻剪輯技術(shù),而這篇文章也將繼續(xù)默默無聞地傳達(dá)著它應(yīng)有的知識(shí),期待著與你這樣的有緣人相遇,感謝你的耐心閱讀!
另外,我本人也是剛接觸樹莓派不久的萌新,對(duì)樹莓派和Linux操作系統(tǒng)的特性理解程度有限,文章中出現(xiàn)的各類疏漏與錯(cuò)誤歡迎在評(píng)論區(qū)批評(píng)指正,互相分享學(xué)習(xí)經(jīng)驗(yàn);也請(qǐng)懂行的大佬們噴輕一些,鼓勵(lì)一下像我這樣的小白樂于分享自己的學(xué)習(xí)經(jīng)驗(yàn),感激不盡!