Linux文件系统是异步的,也就是说写一个文件不是立刻保存到介质(硬盘,U盘等)中,而是存到缓冲区内,等积累到一定程度再一起保存到介质中。如果没有umount就非法拔出 U盘,程序是不知道的,fopen,fwrite等函数都依然返回正确,知道操作系统要把写介质的时候,才会提示I/O错误。可是很多数据都会因为这个不及时的错误报告而丢失。事实上,USB驱动程序在U盘插入和拔出时,都对系统配置文件做了修改。例如U盘驱动程序会在插入或拔出时往 /proc/scsi/usb-storage-0/0 里面记上 Attached:Yes or No通过查看这个文件就不难检测U盘是否插入或拔出了。注意:U盘是否插入的状态与是否挂载(mount)无关。
一、现象分析
之前在操作U盘时候,出现不能挂载,应该文件系统出现bug。在xp下面也不能格式化。后来在ubuntu下试试,也是不可以挂载。挂载时候报, /dev/sdf4 bad superblock error。
整个尝试流程:
1.检查ext文件系统的正确性
sudo e2fsck /dev/sdf4
结果如下:
e2fsck 1.41.11 (14-Mar-2010)
e2fsck: 超级块无效, trying backup blocks...
e2fsck: Bad magic number in super-block 当尝试打开 /dev/sdf4 时
The 超级块 could not be read or does not describe a correct ext2
文件系统. If the 设备 is valid and it really contains an ext2
文件系统 (and not swap or ufs or something else), then the 超级块
is corrupt, and you might try running e2fsck with an alternate 超级块:
e2fsck -b 8193 <设备>
2.重设superblock
sudo e2fsck -b 8193 /dev/sdf4
显示信息如下:
e2fsck 1.41.11 (14-Mar-2010)
e2fsck: Bad magic number in super-block 当尝试打开 /dev/sdf4 时
The 超级块 could not be read or does not describe a correct ext2
文件系统. If the 设备 is valid and it really contains an ext2
文件系统 (and not swap or ufs or something else), then the 超级块
is corrupt, and you might try running e2fsck with an alternate 超级块:
e2fsck -b 8193 <设备>
这个命令执行没有效果。
3.检测
sudo e2fsck -f /dev/sdf4
信息:
e2fsck 1.41.11 (14-Mar-2010)
e2fsck: 超级块无效, trying backup blocks...
e2fsck: Bad magic number in super-block 当尝试打开 /dev/sdf4 时
The 超级块 could not be read or does not describe a correct ext2
文件系统. If the 设备 is valid and it really contains an ext2
文件系统 (and not swap or ufs or something else), then the 超级块
is corrupt, and you might try running e2fsck with an alternate 超级块:
e2fsck -b 8193 <设备>
后来想想干脆格式化得了。
4.格式化,我将其格式成vfat文件系统
sudo mkfs -V -t vfat /dev/sdf4
信息:
mkfs (util-linux-ng 2.17.2)
mkfs.vfat /dev/sdf4
mkfs.vfat 3.0.7 (24 Dec 2009
命令执行没有异常
5.检查vfat文件系统
sudo fsck -a -V -t vfat /dev/sdf4
信息如下:
fsck from util-linux-ng 2.17.2
[/sbin/fsck.vfat (1) -- /dev/sdf4] fsck.vfat -a /dev/sdf4
dosfsck 3.0.7, 24 Dec 2009, FAT32, LFN
/dev/sdf4: 0 files, 1/1957125 clusters
此命令执行OK,U盘正常工作了。
二、关于文件系统一些基本点
用下列命令查看前Linux内核提供了对哪些文件系统的支持
cat /proc/filesystems
如下:
nodev sysfs
nodev rootfs
nodev bdev
nodev proc
nodev cgroup
nodev cpuset
nodev tmpfs
nodev devtmpfs
nodev debugfs
nodev securityfs
nodev sockfs
nodev pipefs
nodev anon_inodefs
nodev inotifyfs
nodev devpts
ext3
ext2
ext4
nodev ramfs
nodev hugetlbfs
nodev ecryptfs
nodev fuse
fuseblk
nodev fusectl
nodev mqueue
nodev binfmt_misc
vfat
查看/etc/fstab内容,
#
proc /proc proc nodev,noexec,nosuid 0 0
/dev/sda1 / ext4 errors=remount-ro 0 1
/dev/sda5 none swap sw 0 0
这个文件描述系统中各种文件系统的信息。一般而言,应用程序仅读取这个文件,而不对它进行写操作。对它的维护是系统管理员的工作。在这个文件中,每个文件系统用一行来描述,在每一行中,用空格或TAB符号来分隔各个字段,文件中以#开头的行是注释信息。Fstab文件中的纪录的排序十分重要。因为fsck,mount或umount等程序在做它们的工作时会按此顺序进行。
三、列出一些文件系统操作命令
1.fdisk
fdisk命令用来进行磁盘分区。
使用权限:超级用户。
格式:fdisk [-l] [-b SSZ] [-u] device
主要选项:
-l: 察看指定的设备的分区表状况。
-b SSZ:将指定的分区大小输出到标准输出上,单位为区块。
-u:搭配"-l"参数列表,会用分区数目取代柱面数目,来表示每个分区的起始地址。
device:要这些操作的设备名称。
应用说明:
fdisk是各种Linux发行版本中最常用的分区工具,是被定义为Expert级别的分区工具。它还包括一个二级选单,首先输入命令,然后出现问答式界面,用户通过在这个界面中输入命令参数来操作fdisk。
选单详细介绍:
a:设定硬盘启动区。
b:编辑一个BSD类型分区。
c:编辑一个DOS兼容分区。
d: 删除一个分区。
l: 察看指定的设备的分区表状况。
m:显示Fdisk命令各个参数的说明。
o:创建一个DOS分区。
n:设定新的硬盘分区。
p:打印分区信息。
s:创建一个空Sun分区表。
t:改变硬盘分区类型。
q: 结束分区,不保存操作内容。
v:校验硬盘分区表。
w:结束分区,保存操作内容。
x:进入高级操作模式。
2.mkfs
mkfs命令用来在Linux下建立各种文件系统,也即是格式化命令
使用权限:超级用户。
格式:
mkfs [-V] [-t fstype] [fs-options] device [size]
主要选项:
-V:输出帮助信息。
-t fstype: 指定要建立何种文件系统。如没有任何指定,则使用缺省的文件系统类型(目前是 ext2)。
fs-options:传递给实际的文件系统制作工具的文件系统相关的选项。
size:是指该文件系统用的区块数。
device:既可以是设备名,(如: /dev/hda1, /dev/sdb2) 也可以是文件系统的挂载点,(如: /, /usr, /home)。
应用说明:
mkfs命令本身并不执行建立文件系统的工作,它是在 Linux下各文件系统专用程序(mkfs.fstype)的请问Linux下要获得网络接口的相关信息,像ifconfig,netstat那样
iis7站长之家程序。各文件系统专用程序可以在/sbin、/sbin/fs、/sbin/fs.d等目录中找到。主要包括:mkfs.dos用来创建DOS文件系统。mkfs.reiserfs用来创建reiserfs文件系统。mkfs.jfs用来创建jfs文件系统。mkfs.vfat用来创建vfat文件系统。
出于对Linux各个发行版本的兼容性,对于建立同一Linux文件系统的命令可能有不同命令名称,实际功能是相同的,如mkfs.ext2、mkfs.ext3、mke2fs都是用来创建ext2/ext3文件系统。