@[TOC]
15 存儲(chǔ)設(shè)備應(yīng)用開(kāi)發(fā)
15.1 SD/TF卡,U盤使用步驟
15.1.1 SD/TF卡,U盤的硬件接口
? 如上圖的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)容
? 當(dāng)我們插入U(xiǎn)盤后/dev/目錄下的內(nèi)容為下圖
? 由這兩幅圖,可以清楚看到插入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
? 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)容
? 當(dāng)我們插入SD卡后/dev/目錄下的內(nèi)容為下圖
? 由這兩幅圖,可以清楚看到插入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
? 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 畫面:
? 常用的是: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)行格式化
? 此時(shí)我們可以用mount命令掛載該分區(qū)到我們想要的目錄
mount -t ext3 /dev/mmcblk0p2 /mnt/
? 通過(guò)df –Th命令查看是否掛載成功。
? 當(dāng)然我們也可以掛載mmcblk0p1這個(gè)分區(qū),也是先指定某種文件系統(tǒng)格式化該分區(qū),然后再用mount命令指定掛載的格式的同時(shí)掛載,最后df –Th命令查看是否掛載成功。
? U盤的分區(qū),格式化,掛載等操作和sd卡一致,只是將/dev/mmcblk0 變成了/dev/sda1。
15.1.5 介紹分區(qū)表
? 上圖是利用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’文件,如下圖
這里使用的 * 就是通配符,表示任意字符。
②如果我們想要更加精確的表達(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ì)顯示如下圖
表明/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盤上的文件。
如上圖,我們?cè)诮K端使用以下命令創(chuàng)建兩個(gè)文本文件。
touch /mnt/usb/111.txt
touch /mnt/usb/222.txt
? 然后再拔出U盤,插到電腦中查看是否存在111.tx與222.txt
? 我們可用在上面添加些內(nèi)容,然后再插入開(kāi)發(fā)板,查看電腦上修改的內(nèi)容在開(kāi)發(fā)板上是否顯示。在111.txt中添加abc,在222.txt中添加100ask,保存,彈出U盤,插入開(kāi)發(fā)板。 通過(guò)cat命令查看內(nèi)容,如下圖
? 顯示的內(nèi)容正確,以后我們就可以通過(guò)U盤把電腦的東西往開(kāi)發(fā)板上搬了。
本文摘自 :https://blog.51cto.com/w