磁盤操作是塊設備的必備操作,需要認真掌握。
一、硬盤
1.硬盤文件
默認串口硬盤的設備文件為sda(第一塊硬盤)、sdb(第二塊硬盤)....
默認並口硬盤的設備文件為hda(第一塊硬盤)、hdb(第二塊硬盤)....
2.物理分區和邏輯分區
- 每塊硬盤最多有四個主分區(包括真正的分區和擴展分區),編號1~4;
- 從5開始為邏輯分區;
- 每個分區能分配獨立的文件系統
如下圖,主分區容量=sda1+sda2(擴展分區);
擴展分區容量=邏輯分區總容量=sda5,當然本例只有一個邏輯分區,還可以有sda6/7/8/9.....
$ sudo fdisk -l /dev/sda Disk /dev/sda: 100 GiB, 107374182400 bytes, 209715200 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x801a0f4d 設備 啟動 Start 末尾 扇區 Size Id 類型 /dev/sda1 * 2048 205522943 205520896 98G 83 Linux /dev/sda2 205524990 209713151 4188162 2G 5 擴展 /dev/sda5 205524992 209713151 4188160 2G 82 Linux 交換 / Solaris
3.用fdisk分區
fdisk /dev/sda 就可以對硬盤進行分區,按照提示操作即可。
4.格式化文件系統mkfs
分區以后,還需要格式化相關的文件系統,例如ext3/4等,格式化分揀系統實質上是向flash里寫入該文件系統需要的數據,用於文件系統管理磁盤。
例如:mkfs.ext3 /dev/sda1
5.磁盤檢查 fsck
用來檢查和維護不一致的文件系統。若系統掉電或磁盤發生問題,可利用fsck命令對文件系統進行檢查。
例如 fsck.ext4 -p /dev/sda1
6.掛載mount
mount /dev/sda1 /mnt/sda1
7.查看已掛載的磁盤分區和文件系統 df
可用df命令查看已經掛載的文件系統。
8.自動掛載/etc/fstab
每次手動mount非常麻煩,linux提供配置文件的方式,自動掛載磁盤
以手上的嵌入式板子上的fstab為例說說明
zynq> cat /etc/fstab devpts /dev/pts devpts gid=5,mode=620 0 0 none /proc proc defaults 0 0 none /sys sysfs defaults 0 0 none /tmp tmpfs defaults 0 0 /dev/mtdblock0 /mnt/sdisk1 jffs2 defaults 0 0 /dev/mtdblock1 /mnt/sdisk2 jffs2 defaults 0 0
第一列 device
第二列 mount point
第三列 filesystem
第四列 perameters:
1. default,一般用default即可,具體可以參考“鳥哥的linux私房菜”
第五列 dump, 能否被dump備份命令作用
第六列 fsck,是否以fsck校驗扇區,0不校驗,1和2都校驗,1較早而2較晚校驗
二、嵌入式flash
已ZYNQ嵌入式單板為例。
1.設備文件
嵌入式ZYNQ單板上,spi接口外界flash芯片,在dts中配置分區,linux啟動以后,自動生成如下文件:
/dev/mtd0, /dev/mtd1, /dev/mtdblock0, /dev/mtdblock1.
2.格式化文件系統flash_eraseall -j
$ flash_eraseall -j /dev/mtd0
$ flash_eraseall -j /dev/mtd1
格式化成jiffs2格式。
3.掛載mount
$ mount -t jffs2 /dev/mtdblock0 /mnt/sdisk1
$ mount -t jffs2 /dev/mtdblock1 /mnt/sdisk2
4.自動掛載/etc/fstab
見硬盤自動掛載部分。
5.裝置啟動時自動判斷文件系統,並修復
對於未格式化過或者不是jiffs2格式的flash,可用程序自動判斷並進行格式化。
大體思路:df看是否掛載了,沒有掛載就格式化。
id = Exec_sys_cmd_result(cmd, "df -h |grep /mnt/sdisk1 |wc -l"); if(id == 0) { printf("/mnt/sdisk1 mount failed, format the spi 1 flash now....\n"); printf(" Maybe we should wait for a few minutes....\n"); Exec_sys_cmd(cmd, "flash_eraseall -j /dev/mtd0"); } else printf("/mnt/sdisk1 mount successful!\n");