當(dāng)前位置:首頁(yè) > IT技術(shù) > 系統(tǒng)服務(wù) > 正文

Linux應(yīng)用開(kāi)發(fā)【第十五章】存儲(chǔ)設(shè)備應(yīng)用開(kāi)發(fā)
2021-12-13 17:41:25

@[TOC]

15 存儲(chǔ)設(shè)備應(yīng)用開(kāi)發(fā)

15.1 SD/TF卡,U盤使用步驟

15.1.1 SD/TF卡,U盤的硬件接口

Linux應(yīng)用開(kāi)發(fā)【第十五章】存儲(chǔ)設(shè)備應(yīng)用開(kāi)發(fā)

? 如上圖的100ask6ull開(kāi)發(fā)板,⑦為USB口,U盤從這里插入;?為mico sd卡槽,micro sd卡可以直接從這里插入。

? 注:micro sd卡也叫tf卡,它是sd卡類的一種,還有sd卡,mini sd卡等,我們簡(jiǎn)稱這一類都叫sd卡。

15.1.2 確定設(shè)備點(diǎn)

①U盤確定設(shè)備點(diǎn)

? 下圖是未插入U(xiǎn)盤前/dev/目錄下的內(nèi)容

Linux應(yīng)用開(kāi)發(fā)【第十五章】存儲(chǔ)設(shè)備應(yīng)用開(kāi)發(fā)

? 當(dāng)我們插入U(xiǎn)盤后/dev/目錄下的內(nèi)容為下圖

Linux應(yīng)用開(kāi)發(fā)【第十五章】存儲(chǔ)設(shè)備應(yīng)用開(kāi)發(fā)

? 由這兩幅圖,可以清楚看到插入U(xiǎn)盤后,/dev/目錄下多了sda,sda1,很顯然這兩個(gè)東西就是和我們的U盤有關(guān)的。

? 當(dāng)我們插入U(xiǎn)盤linux系統(tǒng)一般都會(huì)提示該設(shè)備節(jié)點(diǎn)是哪個(gè),下圖就是當(dāng)我們插入U(xiǎn)盤后我們串口終端接收的信息,上面提示了有U盤插入,同時(shí)設(shè)備節(jié)點(diǎn)是sda

Linux應(yīng)用開(kāi)發(fā)【第十五章】存儲(chǔ)設(shè)備應(yīng)用開(kāi)發(fā)

? sd表示這是個(gè)scsi,sata硬盤設(shè)備。

? a:表示這是第一塊硬盤,

? 1:這是這塊硬盤的第一個(gè)分區(qū),同時(shí)也是主分區(qū)。

? 根據(jù)以上內(nèi)容,我們應(yīng)該就能看出sda,sda1表示什么意思了。

? sda表示整個(gè)U盤存儲(chǔ)設(shè)備

? sda1表示是sda的第一個(gè)分區(qū)。

②SD卡確定設(shè)備點(diǎn)

? 下圖是未插入SD卡前/dev/目錄下的內(nèi)容

Linux應(yīng)用開(kāi)發(fā)【第十五章】存儲(chǔ)設(shè)備應(yīng)用開(kāi)發(fā)

? 當(dāng)我們插入SD卡后/dev/目錄下的內(nèi)容為下圖

Linux應(yīng)用開(kāi)發(fā)【第十五章】存儲(chǔ)設(shè)備應(yīng)用開(kāi)發(fā)

? 由這兩幅圖,可以清楚看到插入SD卡后,/dev/目錄下多了mmcblk0,mmcblk0p1,很顯然這兩個(gè)東西就是和我們的SD卡有關(guān)的。

? 當(dāng)我們插入sd卡,linux系統(tǒng)一般都會(huì)提示該設(shè)備節(jié)點(diǎn)是哪個(gè),下圖就是當(dāng)我們插入sd卡后我們串口終端接收的信息,上面提示了有sd卡插入,同時(shí)設(shè)備節(jié)點(diǎn)是mmcblk0

Linux應(yīng)用開(kāi)發(fā)【第十五章】存儲(chǔ)設(shè)備應(yīng)用開(kāi)發(fā)

? mmc 應(yīng)該是 sd 的前身,所以sd與mmc 的驅(qū)動(dòng)通用,于是Linux 就把設(shè)備節(jié)點(diǎn)名稱延續(xù)下來(lái)了。

blk表示這是塊設(shè)備,隨后跟的數(shù)字是該設(shè)備的編號(hào)blk0,表示編號(hào)為0的塊設(shè)備,區(qū)分塊設(shè)備用的。

? p表示是分區(qū),p1 表示這是第一個(gè)分區(qū)。

? 根據(jù)以上內(nèi)容,我們應(yīng)該就能看出mmcblk0,mmcblk0p1表示什么意思了。

? mmcblk0表示整個(gè)sd卡設(shè)備

? mmcblk0p1表示這是sd卡設(shè)備的第一個(gè)分區(qū)。

15.1.3 分區(qū)

? 我們使用fdisk工具來(lái)分區(qū),

? 執(zhí)行fdisk /dev/mmcblk0后,輸入m(進(jìn)入菜單功能選項(xiàng))進(jìn)入 fdisk 畫面:

Linux應(yīng)用開(kāi)發(fā)【第十五章】存儲(chǔ)設(shè)備應(yīng)用開(kāi)發(fā)

? 常用的是:d l m p q t w命令

? 我們嘗試?yán)檬S嗫臻g增加一個(gè)分區(qū)

? 此時(shí)按下w 就可以將分區(qū)信息存儲(chǔ)到分區(qū)表中,并離開(kāi) fdisk;如果你決定這樣的操作不對(duì),也可以直接按下 q 取消剛剛的fdisk工具的所有動(dòng)作,并退出fdisk。

15.1.4 格式化并掛載

? 上一小節(jié),我們新建立了一個(gè)分區(qū),我們的第二個(gè)分區(qū)為 /dev/mmcblk0p2 ,分區(qū)類型為 Linux ,此時(shí)我們可以mkfs.ext3 /dev/mmcblk0p2對(duì)其進(jìn)行格式化

Linux應(yīng)用開(kāi)發(fā)【第十五章】存儲(chǔ)設(shè)備應(yīng)用開(kāi)發(fā)

? 此時(shí)我們可以用mount命令掛載該分區(qū)到我們想要的目錄

mount -t ext3 /dev/mmcblk0p2 /mnt/

? 通過(guò)df –Th命令查看是否掛載成功。

Linux應(yīng)用開(kāi)發(fā)【第十五章】存儲(chǔ)設(shè)備應(yīng)用開(kāi)發(fā)

? 當(dāng)然我們也可以掛載mmcblk0p1這個(gè)分區(qū),也是先指定某種文件系統(tǒng)格式化該分區(qū),然后再用mount命令指定掛載的格式的同時(shí)掛載,最后df –Th命令查看是否掛載成功。

? U盤的分區(qū),格式化,掛載等操作和sd卡一致,只是將/dev/mmcblk0 變成了/dev/sda1。

15.1.5 介紹分區(qū)表

Linux應(yīng)用開(kāi)發(fā)【第十五章】存儲(chǔ)設(shè)備應(yīng)用開(kāi)發(fā)

? 上圖是利用fdisk 里的p功能字,打印分區(qū)表功能顯示的。

? Device:表示這是哪一個(gè)分區(qū),這里表示是mmcblk0的的一個(gè)分區(qū);

? Boot:表示啟動(dòng)引導(dǎo)標(biāo)志;

? StartCHS:分區(qū)開(kāi)始的柱面、磁頭、扇區(qū);

? EndCHS:分區(qū)結(jié)束的柱面、磁頭、扇區(qū);

? StartLBA:邏輯塊地址起始位置;

? EndLBA: 邏輯塊地址結(jié)束位置;

? Sectors: 扇區(qū)數(shù)量;

? Size:分區(qū)大小。

? Id與Type:成對(duì)出現(xiàn),id表示文件系統(tǒng)類型編號(hào),type表示文件系統(tǒng)類型標(biāo)記

? 注:這里的Id與Type其實(shí)只是做個(gè)標(biāo)記,并沒(méi)有實(shí)際變成我們想要的文件系統(tǒng)格式,因此如果需要掛載時(shí),還需要用mkfs相關(guān)命令的格式化為對(duì)應(yīng)文件系統(tǒng)格式后再掛載。

15.2 自動(dòng)掛載U盤

15.2.1 udev規(guī)則

? udev是Linux(linux2.6內(nèi)核之后)默認(rèn)的設(shè)備管理工具。udev 以守護(hù)進(jìn)程的形式運(yùn)行,通過(guò)偵聽(tīng)內(nèi)核發(fā)出來(lái)的 uevent 來(lái)管理 /dev目錄下的設(shè)備文件。通過(guò)udev編寫對(duì)應(yīng)規(guī)則,實(shí)現(xiàn)設(shè)備節(jié)點(diǎn)變化時(shí)做出規(guī)定的動(dòng)作,例如本節(jié)所說(shuō)的熱拔插實(shí)驗(yàn)、

? udev常用的規(guī)則我們了解下。

? 1)規(guī)則文件中以 "#" 開(kāi)頭的行以及空行將被忽略;

 2)規(guī)則文件必須以 .rules 作為后綴名,否則將被忽略;

 3)規(guī)則文件分別位于: 系統(tǒng)規(guī)則目錄(/usr/lib/udev/rules.d)、 運(yùn)行時(shí)規(guī)則目錄(/run/udev/rules.d)、 本機(jī)規(guī)則目錄(/etc/udev/rules.d),/etc/ 的優(yōu)先級(jí)最高、 /run/ 的優(yōu)先級(jí)居中、 /usr/lib/ 的優(yōu)先級(jí)最低,也就是說(shuō)我們可以在本機(jī)規(guī)則目錄(/etc/udev/rules.d)下添加新的規(guī)則,它優(yōu)先級(jí)最高,如果存有低優(yōu)先級(jí)的同類規(guī)則,也會(huì)被高優(yōu)先級(jí)的新規(guī)則替換掉,規(guī)則文件開(kāi)頭的數(shù)字越小它的執(zhí)行順序越靠前。

 4)"鍵"有兩種類型:匹配與賦值。 如果某條規(guī)則的所有匹配鍵的值都匹配成功,那么就表示此條規(guī)則匹配成功, 也就是此條規(guī)則中的所有賦值鍵都會(huì)被賦予指定的值。

? 匹配類:

? ①“==”等于;

? ②“!=”不等于;

? ③“ACTION”匹配事件的動(dòng)作,例如"add"表示插入一個(gè)設(shè)備;

? ④“KERNEL”匹配設(shè)備的內(nèi)核名稱,如sda;

? ⑤“SUBSYSTEM” 所屬的子系統(tǒng)。例如"sound"或"net"等。

? 賦值類:

? ①“=”,為鍵賦予指定的值;

? ②“LABEL”設(shè)置一個(gè)可用作 GOTO 跳轉(zhuǎn)目標(biāo)的標(biāo)簽;

? ③“GOTO” 跳轉(zhuǎn)到下一個(gè)匹配的 LABEL 標(biāo)簽所在的規(guī)則;

? ④“RUN”{類型}對(duì)于每一個(gè)設(shè)備事件來(lái)說(shuō),在處理完規(guī)則之后,都可以再接著執(zhí)行一個(gè)程序列表(默認(rèn)為空)。 不同的"類型"含義如下:"program"一個(gè)外部程序, 如果是相對(duì)路徑, 那么視為相對(duì)于 /usr/lib/udev 目錄。 否則必須使用絕對(duì)路徑。如果未明確指定"類型", 那么這是默認(rèn)值。"builtin"與 program 類似,但是僅用于表示內(nèi)置的程序。程序名與其參數(shù)之間用空格分隔。 如果參數(shù)中含有空格,那么必須使用單引號(hào)(')界定。僅可使用運(yùn)行時(shí)間非常短的前臺(tái)程序, 切勿設(shè)置任何后臺(tái)守護(hù)進(jìn)程或者長(zhǎng)時(shí)間運(yùn)行的程序

?

? 如需更加詳細(xì)關(guān)于udev內(nèi)容可以參考這兩篇文章《udev 中文手冊(cè) [金步國(guó)]》,《Writing udev rules.html》文章鏈接已保存在本章對(duì)應(yīng)目錄下。

15.2.2 正則表達(dá)式

? 在udev的設(shè)備匹配上用到正則表達(dá)式,我們大致了解下,如需更加詳細(xì)的內(nèi)容可以參考這篇文章《正則表達(dá)式30分鐘入門教程》,文章鏈接已保存在本章對(duì)應(yīng)目錄下。

①在電腦上查找文件,如果需要找‘.c’文件,我們通常會(huì)用‘*.c’就可以查找全部的‘.c’文件,如下圖

Linux應(yīng)用開(kāi)發(fā)【第十五章】存儲(chǔ)設(shè)備應(yīng)用開(kāi)發(fā)

這里使用的 * 就是通配符,表示任意字符。

②如果我們想要更加精確的表達(dá)的話就無(wú)能為力了,因此引入了正則表達(dá)式。

·:表示任意字符(換行符除外);

*:表示重復(fù)0次或更多次;

+:表示重復(fù)1次或更多次;

?:表示重復(fù)0次或1次;

[~]:表示這里面的字符里的某一個(gè),例如[abc]表示abc中的其中一個(gè),[1-9]表示1至9的其中一個(gè)。

? 例如leds?[1-3],其中s?表示s出現(xiàn)0次或者1次,[1-3]?表示1至3的某一個(gè),出現(xiàn)0次或1次,根據(jù)以上信息匹配的結(jié)果就是leds,led1,led2,led3。我們通過(guò)一個(gè)語(yǔ)句就匹配了4個(gè)設(shè)備,多么簡(jiǎn)練。

15.2.3 自動(dòng)掛載U盤

①創(chuàng)建用于掛載U盤的目錄

mkdir /mnt/usb –p

②在/etc/udev/rules.d目錄下添加用于檢測(cè)U盤插入規(guī)則(add),終端下執(zhí)行以下命令創(chuàng)建第一個(gè)U盤插入規(guī)則。

vim /etc/udev/rules.d/11-add-usb.rules 

在11-add-usb.rules中添加如下內(nèi)容:

ACTION!="add",GOTO="END"
KERNEL=="sda[0-9]",RUN+="/etc/mount-usb.sh %k"
LABEL="END"

? 上面的內(nèi)容意思是:如果不是add添加事件,那么就跳到END標(biāo)簽處結(jié)束,如果是add事件那么執(zhí)行以下規(guī)則,如果添加的設(shè)備是sda0至sda9中任意一個(gè),那么就執(zhí)行RUN后面的內(nèi)容,此處是一個(gè)腳本,一個(gè)掛載U盤的腳本,它還帶有個(gè)參數(shù)%k,表示kernel的值。

? 然后在/etc/目錄下創(chuàng)建mount-usb.sh腳本

? 在mount-usb.sh中添加如下內(nèi)容:

#!/bin/sh
mount  -t vfat /dev/$1 /mnt/usb
sync

? 上面的內(nèi)容意思是:#!/bin/sh表示是腳本文件,按腳本文件解析,mount -t vfat /dev/$1 /mnt/usb表示按vfat格式將/dev/$1掛載到/mnt/usb目錄下,其中這里的$1就是之前規(guī)則里傳入進(jìn)來(lái)的%k,也就是kernel值。Sync表示同步U盤數(shù)據(jù)。

? 最后記得給腳本文件添加執(zhí)行權(quán)限。

chmod +x /etc/mount-usb.sh

③在/etc/udev/rules.d目錄下添加用于檢測(cè)U盤移出規(guī)則(remove),終端下執(zhí)行以下命令創(chuàng)建第U盤移出規(guī)則。

vim /etc/udev/rules.d/11-remove-usb.rules

在11-remove-usb.rules中添加如下內(nèi)容:

ACTION!="remove",GOTO="END"
KERNEL=="sda[0-9]",RUN+="/etc/umount-usb.sh %k"
LABEL="END"

上面的內(nèi)容意思是:如果不是remove添加事件,那么就跳到END標(biāo)簽處結(jié)束,如果是remove事件那么執(zhí)行以下規(guī)則,如果移出的設(shè)備是sda0至sda9中任意一個(gè),那么就執(zhí)行RUN后面的內(nèi)容,此處是一個(gè)腳本,一個(gè)卸載U盤的腳本,它還帶有個(gè)參數(shù)%k,表示kernel的值。

? 然后在/etc/目錄下創(chuàng)建umount-usb.sh腳本

? 在umount-usb.sh中添加如下內(nèi)容:

#!/bin/sh
sync
umount /mnt/usb

? 上面的內(nèi)容意思是:#!/bin/sh表示是腳本文件,按腳本文件解析,先同步U盤數(shù)據(jù),然后再卸載,其中這里的$1就是之前規(guī)則里傳入進(jìn)來(lái)的%k,也就是kernel值。

? 最后記得給腳本文件添加執(zhí)行權(quán)限。

chmod +x /etc/umount-usb.sh

④設(shè)置好規(guī)則后,當(dāng)我們插入U(xiǎn)盤,執(zhí)行df –Th就會(huì)顯示如下圖

Linux應(yīng)用開(kāi)發(fā)【第十五章】存儲(chǔ)設(shè)備應(yīng)用開(kāi)發(fā)

 表明/dev/sda1已經(jīng)成功掛載在/mnt/usb目錄下了。

? 注1: vfat格式也就是fat32格式,使用vfat格式是由于windows操作系統(tǒng)與linux操作系統(tǒng)都支持,這樣U盤就可以在windows操作系統(tǒng)與linux操作系統(tǒng)之間作為交換文件的介質(zhì)。

? 注2:Linux 系統(tǒng)中欲寫入U(xiǎn)盤等存儲(chǔ)介質(zhì)內(nèi)時(shí),有的時(shí)候?yàn)榱诵势鹨?jiàn),會(huì)寫到 filesystem buffer 中,這個(gè) buffer 是一塊記憶體空間,如果欲真正的寫入U(xiǎn)盤等存儲(chǔ)介質(zhì)內(nèi)需要執(zhí)行sync 指令,它會(huì)將存于 buffer 中的數(shù)據(jù)強(qiáng)制寫入U(xiǎn)盤等存儲(chǔ)介質(zhì)內(nèi),這也是為什么腳本里在要加入sync的原因。

15.3 掛載后就是一般的讀寫文件

? 成功掛載后,我們就可以在掛載目錄下進(jìn)行創(chuàng)建,修改等文件操作,就等同于操作U盤上的文件。

Linux應(yīng)用開(kāi)發(fā)【第十五章】存儲(chǔ)設(shè)備應(yīng)用開(kāi)發(fā)

  如上圖,我們?cè)诮K端使用以下命令創(chuàng)建兩個(gè)文本文件。
touch /mnt/usb/111.txt
touch /mnt/usb/222.txt

? 然后再拔出U盤,插到電腦中查看是否存在111.tx與222.txt

Linux應(yīng)用開(kāi)發(fā)【第十五章】存儲(chǔ)設(shè)備應(yīng)用開(kāi)發(fā)

? 我們可用在上面添加些內(nèi)容,然后再插入開(kāi)發(fā)板,查看電腦上修改的內(nèi)容在開(kāi)發(fā)板上是否顯示。在111.txt中添加abc,在222.txt中添加100ask,保存,彈出U盤,插入開(kāi)發(fā)板。 通過(guò)cat命令查看內(nèi)容,如下圖

Linux應(yīng)用開(kāi)發(fā)【第十五章】存儲(chǔ)設(shè)備應(yīng)用開(kāi)發(fā)

? 顯示的內(nèi)容正確,以后我們就可以通過(guò)U盤把電腦的東西往開(kāi)發(fā)板上搬了。

本文摘自 :https://blog.51cto.com/w

開(kāi)通會(huì)員,享受整站包年服務(wù)立即開(kāi)通 >