@[TOC]
15 存儲設備應用開發(fā)
15.1 SD/TF卡,U盤使用步驟
15.1.1 SD/TF卡,U盤的硬件接口
? 如上圖的100ask6ull開發(fā)板,⑦為USB口,U盤從這里插入;?為mico sd卡槽,micro sd卡可以直接從這里插入。
? 注:micro sd卡也叫tf卡,它是sd卡類的一種,還有sd卡,mini sd卡等,我們簡稱這一類都叫sd卡。
15.1.2 確定設備點
①U盤確定設備點
? 下圖是未插入U盤前/dev/目錄下的內(nèi)容
? 當我們插入U盤后/dev/目錄下的內(nèi)容為下圖
? 由這兩幅圖,可以清楚看到插入U盤后,/dev/目錄下多了sda,sda1,很顯然這兩個東西就是和我們的U盤有關的。
? 當我們插入U盤linux系統(tǒng)一般都會提示該設備節(jié)點是哪個,下圖就是當我們插入U盤后我們串口終端接收的信息,上面提示了有U盤插入,同時設備節(jié)點是sda
? sd表示這是個scsi,sata硬盤設備。
? a:表示這是第一塊硬盤,
? 1:這是這塊硬盤的第一個分區(qū),同時也是主分區(qū)。
? 根據(jù)以上內(nèi)容,我們應該就能看出sda,sda1表示什么意思了。
? sda表示整個U盤存儲設備
? sda1表示是sda的第一個分區(qū)。
②SD卡確定設備點
? 下圖是未插入SD卡前/dev/目錄下的內(nèi)容
? 當我們插入SD卡后/dev/目錄下的內(nèi)容為下圖
? 由這兩幅圖,可以清楚看到插入SD卡后,/dev/目錄下多了mmcblk0,mmcblk0p1,很顯然這兩個東西就是和我們的SD卡有關的。
? 當我們插入sd卡,linux系統(tǒng)一般都會提示該設備節(jié)點是哪個,下圖就是當我們插入sd卡后我們串口終端接收的信息,上面提示了有sd卡插入,同時設備節(jié)點是mmcblk0
? mmc 應該是 sd 的前身,所以sd與mmc 的驅(qū)動通用,于是Linux 就把設備節(jié)點名稱延續(xù)下來了。
blk表示這是塊設備,隨后跟的數(shù)字是該設備的編號blk0,表示編號為0的塊設備,區(qū)分塊設備用的。
? p表示是分區(qū),p1 表示這是第一個分區(qū)。
? 根據(jù)以上內(nèi)容,我們應該就能看出mmcblk0,mmcblk0p1表示什么意思了。
? mmcblk0表示整個sd卡設備
? mmcblk0p1表示這是sd卡設備的第一個分區(qū)。
15.1.3 分區(qū)
? 我們使用fdisk工具來分區(qū),
? 執(zhí)行fdisk /dev/mmcblk0后,輸入m(進入菜單功能選項)進入 fdisk 畫面:
? 常用的是:d l m p q t w命令
? 我們嘗試利用剩余空間增加一個分區(qū)
? 此時按下w 就可以將分區(qū)信息存儲到分區(qū)表中,并離開 fdisk;如果你決定這樣的操作不對,也可以直接按下 q 取消剛剛的fdisk工具的所有動作,并退出fdisk。
15.1.4 格式化并掛載
? 上一小節(jié),我們新建立了一個分區(qū),我們的第二個分區(qū)為 /dev/mmcblk0p2 ,分區(qū)類型為 Linux ,此時我們可以mkfs.ext3 /dev/mmcblk0p2對其進行格式化
? 此時我們可以用mount命令掛載該分區(qū)到我們想要的目錄
mount -t ext3 /dev/mmcblk0p2 /mnt/
? 通過df –Th命令查看是否掛載成功。
? 當然我們也可以掛載mmcblk0p1這個分區(qū),也是先指定某種文件系統(tǒng)格式化該分區(qū),然后再用mount命令指定掛載的格式的同時掛載,最后df –Th命令查看是否掛載成功。
? U盤的分區(qū),格式化,掛載等操作和sd卡一致,只是將/dev/mmcblk0 變成了/dev/sda1。
15.1.5 介紹分區(qū)表
? 上圖是利用fdisk 里的p功能字,打印分區(qū)表功能顯示的。
? Device:表示這是哪一個分區(qū),這里表示是mmcblk0的的一個分區(qū);
? Boot:表示啟動引導標志;
? StartCHS:分區(qū)開始的柱面、磁頭、扇區(qū);
? EndCHS:分區(qū)結(jié)束的柱面、磁頭、扇區(qū);
? StartLBA:邏輯塊地址起始位置;
? EndLBA: 邏輯塊地址結(jié)束位置;
? Sectors: 扇區(qū)數(shù)量;
? Size:分區(qū)大小。
? Id與Type:成對出現(xiàn),id表示文件系統(tǒng)類型編號,type表示文件系統(tǒng)類型標記
? 注:這里的Id與Type其實只是做個標記,并沒有實際變成我們想要的文件系統(tǒng)格式,因此如果需要掛載時,還需要用mkfs相關命令的格式化為對應文件系統(tǒng)格式后再掛載。
15.2 自動掛載U盤
15.2.1 udev規(guī)則
? udev是Linux(linux2.6內(nèi)核之后)默認的設備管理工具。udev 以守護進程的形式運行,通過偵聽內(nèi)核發(fā)出來的 uevent 來管理 /dev目錄下的設備文件。通過udev編寫對應規(guī)則,實現(xiàn)設備節(jié)點變化時做出規(guī)定的動作,例如本節(jié)所說的熱拔插實驗、
? udev常用的規(guī)則我們了解下。
? 1)規(guī)則文件中以 "#" 開頭的行以及空行將被忽略;
2)規(guī)則文件必須以 .rules 作為后綴名,否則將被忽略;
3)規(guī)則文件分別位于: 系統(tǒng)規(guī)則目錄(/usr/lib/udev/rules.d)、 運行時規(guī)則目錄(/run/udev/rules.d)、 本機規(guī)則目錄(/etc/udev/rules.d),/etc/ 的優(yōu)先級最高、 /run/ 的優(yōu)先級居中、 /usr/lib/ 的優(yōu)先級最低,也就是說我們可以在本機規(guī)則目錄(/etc/udev/rules.d)下添加新的規(guī)則,它優(yōu)先級最高,如果存有低優(yōu)先級的同類規(guī)則,也會被高優(yōu)先級的新規(guī)則替換掉,規(guī)則文件開頭的數(shù)字越小它的執(zhí)行順序越靠前。
4)"鍵"有兩種類型:匹配與賦值。 如果某條規(guī)則的所有匹配鍵的值都匹配成功,那么就表示此條規(guī)則匹配成功, 也就是此條規(guī)則中的所有賦值鍵都會被賦予指定的值。
? 匹配類:
? ①“==”等于;
? ②“!=”不等于;
? ③“ACTION”匹配事件的動作,例如"add"表示插入一個設備;
? ④“KERNEL”匹配設備的內(nèi)核名稱,如sda;
? ⑤“SUBSYSTEM” 所屬的子系統(tǒng)。例如"sound"或"net"等。
? 賦值類:
? ①“=”,為鍵賦予指定的值;
? ②“LABEL”設置一個可用作 GOTO 跳轉(zhuǎn)目標的標簽;
? ③“GOTO” 跳轉(zhuǎn)到下一個匹配的 LABEL 標簽所在的規(guī)則;
? ④“RUN”{類型}對于每一個設備事件來說,在處理完規(guī)則之后,都可以再接著執(zhí)行一個程序列表(默認為空)。 不同的"類型"含義如下:"program"一個外部程序, 如果是相對路徑, 那么視為相對于 /usr/lib/udev 目錄。 否則必須使用絕對路徑。如果未明確指定"類型", 那么這是默認值。"builtin"與 program 類似,但是僅用于表示內(nèi)置的程序。程序名與其參數(shù)之間用空格分隔。 如果參數(shù)中含有空格,那么必須使用單引號(')界定。僅可使用運行時間非常短的前臺程序, 切勿設置任何后臺守護進程或者長時間運行的程序
?
? 如需更加詳細關于udev內(nèi)容可以參考這兩篇文章《udev 中文手冊 [金步國]》,《Writing udev rules.html》文章鏈接已保存在本章對應目錄下。
15.2.2 正則表達式
? 在udev的設備匹配上用到正則表達式,我們大致了解下,如需更加詳細的內(nèi)容可以參考這篇文章《正則表達式30分鐘入門教程》,文章鏈接已保存在本章對應目錄下。
①在電腦上查找文件,如果需要找‘.c’文件,我們通常會用‘*.c’就可以查找全部的‘.c’文件,如下圖
這里使用的 * 就是通配符,表示任意字符。
②如果我們想要更加精確的表達的話就無能為力了,因此引入了正則表達式。
·:表示任意字符(換行符除外);
*:表示重復0次或更多次;
+:表示重復1次或更多次;
?:表示重復0次或1次;
[~]:表示這里面的字符里的某一個,例如[abc]表示abc中的其中一個,[1-9]表示1至9的其中一個。
? 例如leds?[1-3],其中s?表示s出現(xiàn)0次或者1次,[1-3]?表示1至3的某一個,出現(xiàn)0次或1次,根據(jù)以上信息匹配的結(jié)果就是leds,led1,led2,led3。我們通過一個語句就匹配了4個設備,多么簡練。
15.2.3 自動掛載U盤
①創(chuàng)建用于掛載U盤的目錄
mkdir /mnt/usb –p
②在/etc/udev/rules.d目錄下添加用于檢測U盤插入規(guī)則(add),終端下執(zhí)行以下命令創(chuàng)建第一個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標簽處結(jié)束,如果是add事件那么執(zhí)行以下規(guī)則,如果添加的設備是sda0至sda9中任意一個,那么就執(zhí)行RUN后面的內(nèi)容,此處是一個腳本,一個掛載U盤的腳本,它還帶有個參數(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ī)則里傳入進來的%k,也就是kernel值。Sync表示同步U盤數(shù)據(jù)。
? 最后記得給腳本文件添加執(zhí)行權(quán)限。
chmod +x /etc/mount-usb.sh
③在/etc/udev/rules.d目錄下添加用于檢測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標簽處結(jié)束,如果是remove事件那么執(zhí)行以下規(guī)則,如果移出的設備是sda0至sda9中任意一個,那么就執(zhí)行RUN后面的內(nèi)容,此處是一個腳本,一個卸載U盤的腳本,它還帶有個參數(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ī)則里傳入進來的%k,也就是kernel值。
? 最后記得給腳本文件添加執(zhí)行權(quán)限。
chmod +x /etc/umount-usb.sh
④設置好規(guī)則后,當我們插入U盤,執(zhí)行df –Th就會顯示如下圖
表明/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盤等存儲介質(zhì)內(nèi)時,有的時候為了效率起見,會寫到 filesystem buffer 中,這個 buffer 是一塊記憶體空間,如果欲真正的寫入U盤等存儲介質(zhì)內(nèi)需要執(zhí)行sync 指令,它會將存于 buffer 中的數(shù)據(jù)強制寫入U盤等存儲介質(zhì)內(nèi),這也是為什么腳本里在要加入sync的原因。
15.3 掛載后就是一般的讀寫文件
? 成功掛載后,我們就可以在掛載目錄下進行創(chuàng)建,修改等文件操作,就等同于操作U盤上的文件。
如上圖,我們在終端使用以下命令創(chuàng)建兩個文本文件。
touch /mnt/usb/111.txt
touch /mnt/usb/222.txt
? 然后再拔出U盤,插到電腦中查看是否存在111.tx與222.txt
? 我們可用在上面添加些內(nèi)容,然后再插入開發(fā)板,查看電腦上修改的內(nèi)容在開發(fā)板上是否顯示。在111.txt中添加abc,在222.txt中添加100ask,保存,彈出U盤,插入開發(fā)板。 通過cat命令查看內(nèi)容,如下圖
? 顯示的內(nèi)容正確,以后我們就可以通過U盤把電腦的東西往開發(fā)板上搬了。
本文摘自 :https://blog.51cto.com/w