linux下磁盘的检测磁和使用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

linux下磁盘的检测和使用
一、识别磁盘
在/proc/partitions中存放着磁盘的设备名称,如sda,sdb2等,以sd开头。

(1)、major 主设备号,比如一个U盘有3个分区,主设备名为sda,major为8,
(2、)minor则为分区号
(3、)name即为设备名,连接/dev/sd*设备名,就可以挂载到一个目录。

(4)、blocks表示物理设备逻辑块的大小,下面sdb的blocks值为31719424,确定磁盘为32G 的存储
~ # cat /proc/partitions
major minor #blocks name
240 0 1024 romblock0
31 0 1024 mtdblock0
240 1 3072 romblock1
31 1 3072 mtdblock1
240 2 10240 romblock2
31 2 10240 mtdblock2
240 3 3584 romblock3
31 3 3584 mtdblock3
240 4 2560 romblock4
31 4 2560 mtdblock4
240 5 9216 romblock5
31 5 9216 mtdblock5
240 6 3072 romblock6
31 6 3072 mtdblock6
8 16 31719424 sdb
8 17 31719360 sdb1
8 32 7761920 sdc
8 33 7761761 sdc1
二、磁盘的类型
~ # ls /sys/block/sd* -lah
lrwxrwxrwx 1 root root 0 Nov 8 11:18
/sys/block/sda -> ../devices/platform/hiusb-ehci.0/usb1/1-2/1-2.1/1-
2.1:1.0/host2/target2:0:0/2:0:0:0/block/sda
lrwxrwxrwx 1 root root 0 Nov 8 11:18
/sys/block/sdb -> ../devices/platform/hiusb-ehci.0/usb1/1-2/1-2.2/1-
2.2:1.0/host3/target3:0:0/3:0:0:0/block/sdb
lrwxrwxrwx 1 root root 0 Nov 8 14:54 /sys/block/sdc ->
../devices/platform/hiusb-ehci.0/usb1/1-1/1-1:1.0/host4/target4:0:0/4:0:0:0/block/sdc
代码中通过函数readlink也是可以得到字符串
"../devices/platform/hiusb-ehci.0/usb1/1-2/1-2.2/1-2.2:1.0/host3/target3:0:0/3:0:0:0/block/sdb",通过字符串可以确定磁盘的类型
1-2.1或者1-2.2 SD卡
1-1:1.0或者1-1.1:1.0 U盘
ahci.0 硬盘
这个和操作系统系统和磁盘文件系统有一定关系,根据具体情况分析;
三、挂载磁盘
1、功能描述
mount挂上文件系统,umount执行相反的操作。

2、用法:
#include <sys/mount.h>
int mount(const char *source, const char *target,
const char *filesystemtype, unsigned long mountflags, const void *data);
int umount(const char *target);
int umount2(const char *target, int flags);
3、参数
source:将要挂上的文件系统,通常是一个设备名。

target:文件系统所要挂在的目标目录。

filesystemtype:文件系统的类型,可以是"ext2","msdos","proc","nfs","iso9660" 。

mountflags:指定文件系统的读写访问标志,可能值有以:
MS_BIND:执行bind挂载,使文件或者子目录树在文件系统内的另一个点上可视。

MS_DIRSYNC:同步目录的更新。

MS_MANDLOCK:允许在文件上执行强制锁。

MS_MOVE:移动子目录树。

MS_NOATIME:不要更新文件上的访问时间。

MS_NODEV:不允许访问设备文件。

MS_NODIRATIME:不允许更新目录上的访问时间。

MS_NOEXEC:不允许在挂上的文件系统上执行程序。

MS_NOSUID:执行程序时,不遵照set-user-ID 和set-group-ID位。

MS_RDONL Y:指定文件系统为只读。

MS_REMOUNT:重新加载文件系统。

这允许你改变现存文件系统的mountflag和数据,而无需使用先卸载,再挂上文件系统的方式。

MS_SYNCHRONOUS:同步文件的更新。

MNT_FORCE:强制卸载,即使文件系统处于忙状态。

MNT_EXPIRE:将挂载点标志为过时。

data:文件系统特有的参数。

例如:"codepage=936,iocharset=cp936"。

有些时候磁盘中文识别不了,可以通过改变data,来确定编码格式;
返回说明:
成功执行时,返回0。

失败返回-1,errno被设为以下的某个值
EACCES:权能不足,可能原因是,路径的一部分不可搜索,或者挂载只读的文件系统时,没有指定MS_RDONL Y 标志。

EAGAIN:成功地将不处于忙状态的文件系统标志为过时。

EBUSY:一. 源文件系统已被挂上。

或者不可以以只读的方式重新挂载,因为它还拥有以写方式打开的文件。

二. 目标处于忙状态。

EFAULT:内存空间访问出错。

EINV AL:操作无效,可能是源文件系统超级块无效。

ELOOP :路径解析的过程中存在太多的符号连接。

EMFILE:无需块设备要求的情况下,无用设备表已满。

ENAMETOOLONG:路径名超出可允许的长度。

ENODEV:内核不支持某中文件系统。

ENOENT:路径名部分内容表示的目录不存在。

ENOMEM:核心内存不足。

ENOTBLK:source不是块设备。

ENOTDIR:路径名的部分内容不是目录。

EPERM :调用者权能不足。

ENXIO:块主设备号超出所允许的范围。

4、例子
mount(/dev/sd*, /mnt/sdcard/, "vfat", MS_NOATIME|MS_NODIRATIME, "iocharset=cp936" )。

相关文档
最新文档