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