最近因为工作原因需要在设备上外接移动硬盘,故将最近学习的内容总结一下,提高记忆。
1、移动硬盘的设备节点
以我的设备为例," ls /dev "可以ka看到如下三个和sata相关的节点 sda、sda1、sda2
其中sda节点是硬盘的总节点,sda1和sda2则表示硬盘有两个分区
如果硬盘只有一个分区,那么" ls /dev "可以看到 sda 和 sda1节点;如果设备插入了多个硬盘,那么再插入的设备节点会变成 sdb,分区会变成 sdb1, sdb2 等等,如果我们想删除硬盘现有分区,新建分区和格式化,就需要对 /dev/sda 节点做操作
2、硬盘的分区——fdisk
fdisk命令可以操作磁盘分区表,是linux下对硬盘修改分区、格式化,等最为经常使用的工具。
下面列举fdisk最常用的几种方式
- fdisk -l 列出linux系统下所有磁盘的分区信息
- fdisk -l /dev/sda 单列出linux系统下某个节点的分区信息
# fdisk -l /dev/sda
Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders, total 976773168 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
Disk identifier: 0x76cb407f
Device Boot Start End Blocks Id System
/dev/sda1 2048 104859647 52428800 c W95 FAT32 (LBA)
/dev/sda2 104859648 976773167 435956760 c W95 FAT32 (LBA)
如图可以看到硬盘 /dev/sda 的分区信息
块设备名称为/dev/sda, 大小为500.1G(这个数字不是特别精确),500107862016bytes这是转换成字节后的大小
即:500107862016/1024/1024/1024 =465.7G(显示出的大小)
255 heads, 63 sectors/track, 60801 cylinders
255 heads:表示磁头数为255
63 sectors/track:表示每磁道上有63个扇区
60801 cylinders:表示共有60801 个柱面,柱面是分区的最小单位
Units = cylinders of 16065 * 512 = 8225280 bytes
16065=255*63 因为每一个磁头都是在同一个柱面的,63表示每个磁道上的扇区数量,这两个数的乘积表示一个柱面上的扇区数量;所以16065*512表示一个柱面的大小是8225280字节
Sector size (logical/physical): 512 bytes / 512 bytes
表示一个扇区的大小是512字节
总结:所以一个磁盘的大小=一个柱面大小*柱面的总数=磁头数量*每个磁道上的扇区数*一个扇区大小*柱面总数
即:磁盘大小=8225280*60801=500105249280bytes=465.7GB=255*63*512*16065
块设备 /dev/sda 有sda1和sda2两个分区,两个分区都是FAT32文件系统
sda1 的大小是50G, 文件系统类型是 FAT32 , blocks = 5244800, blocks/1024/1024=50 ,由此可以看出 blocks 的大小是K。
# fdisk /dev/sda
Command (m for help): m
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
Command (m for help): p
Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders, total 976773168 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
Disk identifier: 0x76cb407f
Device Boot Start End Blocks Id System
/dev/sda1 2048 104859647 52428800 c W95 FAT32 (LBA)
/dev/sda2 104859648 976773167 435956760 c W95 FAT32 (LBA)
Command (m for help):
“fdisk /dev/sda” 即可对硬盘进行操作,输入 m 即可获取help信息。
我们经常使用的 d:删除一个分区 n:添加一个分区 p:列出当前磁盘的分区表 t:改变分区类型 l:列出分区类型
q:不保存退出 w:把分区表写入硬盘并退出
必须动手把上述命令实际操作一遍,就会明白其使用方式,实际产品中我们经常将这些操作写成脚本供程序调用
#!/bin/sh
#Detect the numbers of parameters
#实际运行的例子 -> “/usr/bin/partition_sata /dev/sda 80” 将硬盘/dev/sda 第一个分区格式化为80%的空间
if [ $# -lt 2 ]; then
cat <<EOF
Usage: $0 sata device node percent
Example: $0 /dev/sdb 30
EOF
exit
fi
SATA=$1
FIRST_PERCENT=$2
dd if=/dev/zero of=$SATA bs=1024 count=1024
SIZE=`fdisk -l $SATA | grep Disk | awk '{print $5}'`
SIZEG_UNIT=`expr $SIZE / 100`
SIZEK=`expr $SIZEG_UNIT / 1024`
SIZEM=`expr $SIZEK / 1024`
FIRST_SIZE=`expr $SIZEM \* $FIRST_PERCENT`
echo the size is $FIRST_SIZE
fdisk $SATA << EOF
d
5
d
4
d
3
d
2
d
n
p
1
+${FIRST_SIZE}M
n
p
t
1
c
t
2
c
wq
EOF
echo "[Making filesystems...]"
mkfs.vfat -F 32 -n 1 "$SATA"1
mkfs.vfat -F 32 -n 2 "$SATA"2
上述脚本自动将硬盘格式化为两个分区,并可以指定第一分区的大小,第二分区大小是硬盘剩余空间的大小
3、硬盘的格式化——文件系统
itarge@itarge-normal:~$ mkfs
mkfs mkfs.btrfs mkfs.exfat mkfs.ext3 mkfs.ext4dev mkfs.jffs2 mkfs.msdos mkfs.ubifs
mkfs.bfs mkfs.cramfs mkfs.ext2 mkfs.ext4 mkfs.fat mkfs.minix mkfs.ntfs mkfs.vfat
通常我们使用 " mkfs.xxx " 来将硬盘的不同分区格式化成不同的文件系统
注意:fdisk 通过 ‘ - t ’ 选择分区类型,决定了最后用什么命令格式化,例如脚本中选择分区类型为 c (FAT32),则就用 “mkfs.vfat” 命令格式化,如果用其他命令格式化可能会格式化不成功。
4、硬盘的挂载/卸载——mount/umount
将硬盘分区,格式化后,将硬盘挂载到设备指定的目录,这样程序就能对其进行访问。
# mount -t vfat -w -o iocharset=cp936,codepage=936,errors=continue, /dev/sda1 /mnt/sata/sda1
将块设备 /dev/sda1 挂载到 /mnt/sata/sda1 目录下, -t 指定了挂载的文件系统, -o 的参数指定了硬盘的字符编码集,避免中文乱码。
注意:挂载错误"wrong fs type, bad option, bad superblock"可能是系统不支持此参数,或者文件系统,需要安装响应的文件。
fsck - y /dev/sda1 可以对挂载前的分区进行修复和检查。
# df -h
Filesystem Size Used Available Use% Mounted on
/dev/root 31.8M 31.8M 0 100% /
devtmpfs 271.6M 0 271.6M 0% /dev
tmpfs 287.6M 0 287.6M 0% /dev/shm
tmpfs 287.6M 368.0K 287.3M 0% /tmp
/dev/mtdblock11 107.0M 13.8M 93.2M 13% /mnt/nand
tmpfs 287.6M 16.0K 287.6M 0% /var
/dev/ubi0_0 54.4M 24.0K 54.4M 0% /opt/dvr_rdk/ti816x/firmware_nand
tmpfs 300.0M 0 300.0M 0% /mnt/ramdisk
tmpfs 64.0M 0 64.0M 0% /mnt/stream
/dev/sda1 50.0G 48.0K 50.0G 0% /mnt/sata/sda1
/dev/sda2 415.6G 16.0K 415.6G 0% /mnt/sata/sda2
使用 " df - h "命令可以看出两个分区的大小和挂载的路径
# umount /mnt/sata/sda1
# umount /mnt/sata/sda2
将硬盘卸载后,可以重新对硬盘进行格式化,分区
硬盘卸载不成功的可能:1、有进程正在对硬盘进行读写 2、有终端正在访问硬盘目录
此时可以通过 fuser -m /dev/sata/sda1 查找到正在访问此进程的id, kill 掉即可
参考资料:
https://blog.csdn.net/jackyu651/article/details/53070607/
https://blog.csdn.net/nahancy/article/details/52201121
https://blog.csdn.net/lengyue1084/article/details/51477872