Linux_fdisk操作SD卡

捉摸下SD卡使用,总结下学习心得

我使用的是ubuntu11.10,内核3.0,andriod4.0制作了SD卡启动。如有需要自动脚本评论里留邮箱

我就参考了一下几个内容完成,先了解下MBR引导分区的概念

一、 我的 bochs 上的 windows 7 的 disk images 介绍

  在 bochs 上,我为 windows 7 分配了 10g 的磁盘空间, 这 10g 的分空间,bochs 是这样分配的:cylinders = 20805, heads = 16, spt = 63

  cylinders(柱面或道)是 20805,heads(磁头或面)是 16,spt(扇区/柱面 - 每道扇区数)为 63

  那么:磁盘空间为:disk size = cylinders * 63 * heads * 512 = 20805 * 63 * 16 * 512 = 10,737,377,280 bytes = 10g

二、硬盘的 MBR(主引导记录)

  MBR 是位于:0 扇区(逻辑扇区) 即:0 柱面(0-cylinder),0 磁头(0-head),1 扇区(1-sector)

  大小为 512 bytes。

整个 MBR 的结构如下:

 

1、磁盘分区表(Disk Partition Table)

   MBR 里的后 64 个字节里是磁盘的分区表结构,可定义 4 个分区,每个分区 16 bytes,从 0x1be ~ 0x1fe 共 64 bytes。

表1:磁盘分区表1(DPT1)结构

Linux_fdisk操作SD卡_第1张图片

2、下面看看我的 bochs 上安装的 windows 7 分区表

(1)分区1结构

[cpp] view plain copy print ?
  1.    
  2.   
  3. 000001BE  80           
  4.                                  
  5.                                 
  6.   
  7. 000001BF  20            
  8. 000001C0  21            
  9. 000001C1  00            
  10.   
  11. 000001C2  07              
  12.                        00h:未知操作系统   
  13.                        01h:DOS FAT12(16位扇区数)   
  14.                        02h:XENIX   
  15.                        04h:DOS FAT16(16位扇区数)   
  16.                        05h:DOS 扩展分区(DOS 3.3+)   
  17.                        06h:DOS 4.0 (Compaq 3.31), 32位扇区数   
  18.                        07h:HPFS/NTFS  
  19.                        0ah:OS/2  
  20.                        0bh:win95 fat32  
  21.                        0ch:win95 fat32 (LBA)  
  22.                        ... ...  
  23.   
  24. 000001C3  DF            
  25. 000001C4  13            
  26. 000001C5  0C            
  27.   
  28.   
  29. 000001C6  00080000         
  30.   
  31. 000001CA  00200300   
  32.     

可以看出分区1是:

★ boot indicator = 80 表示:该分区是可启动的分区。

★ 起始扇区是:0 - cylinder, 0x20 - heads, 0x21 - sector

  1 byte 的 head 最大可表示:0xFF 个 heads,即:255 个 heads

  6 bits 的 sector 最大表示: 0x3F 个 sector 即:63 个 sectors

  10 bits 的 cylinder 最大表示:0x3FF 个 cylinder 即: 1023 个 cylinders

  每个 cylinder 的扇区为:heads * 63 = 255 * 63 = 16065 sectors

那么:分区1的起始扇区是第几扇分区呢? 它的逻辑分区 L 是:

L = cylinder * 16065 + heads * 63 + sector - 1

 = 0 * 16065 + 0x20 * 63 + 21 - 1

 = 0x20 * 63 + 0x20

 = 2048

 因此,分区1的起始扇区是第 2048 号扇区,即说明,此分区前面有 2048 个扇区被保留(扇区号从 0 开始编号)

★ 分区1 的文件系统是 ntfs 文件系统。

★ 分区1 的结束扇区是: 0xdf - heads, 0x13 - sectors, 0x0c - cylinder

那么,结束扇区是第几号扇区呢?

 

L = cylinder * 16065 + heads * 63 + sectors - 1

 = 0x0c * 16065 + 0xdf * 63 + 0x13 - 1

 = 192780 + 14049 + 18

 = 206848

结束扇区是第 206848 号扇区。

因此:分区的扇区数是:206848 - 2048 = 204800 个扇区

★ 分区1 前的扇区数是: 00080000

由于是 little-endian 排列,它的 size 是 0x00000800 即:2048 个扇区

正好符合前面说的 2048 个扇区。

★ 分区1 的扇区数是: 00200300

同样是 little-endian 排列,它的 size 是 0x00032000 即: 204800 个扇区

正好符合前面说的 204800 个扇区数。

size: sectors * 512 byte = 204800 * 512 = 100MB

由此可见,分区1 共有 100M 的磁盘空间。

2、分区 2 的结构

[cpp] view plain copy print ?
  1. 000001CE  00               
  2.   
  3. 000001CF  DF             
  4. 000001D0  14                 
  5. 000001D1  0C              
  6.   
  7.   
  8. 000001D2  07             
  9.   
  10. 000001D3  FE             
  11. 000001D4  FF             
  12. 000001D5  FF             
  13.   
  14.   
  15. 000001D6  00280300                     
  16.   
  17. 000001DA  00C83C01      

可以看出分区2 是:

★ 该分区是不可启动的分区。

★ 起始扇区是:L = 0x0c * 16065 + 0xdf * 63 + 0x14 - 1 = 206849 号扇区,

正好是分区1的结束扇区的地址,表示下一扇区的开始。

★ 文件系统同样是 ntfs

★ 结束扇区是:L = 0x3ff * 16065 + 0xfe * 63 + 0x3f - 1 = 16450559 号扇区。

★ 分区前扇区数:00280300 = 0x00032800 = 206848 扇区。

★ 分区的扇区数:00c83c01 = 0x013cc800 = 20760576 扇区数

那么,分区2的大小是 ≈ 10g 约等于 10g, 由于分区 1 的大小是 100M bytes,分区2大小约为 10g

这里有一个现象:

  前面说的结束分区是 16450559 号扇区,明显是不对的。这是因为,cylinder 最大只能表示 1023 个(1023*255*63 =16434495)

超过部分没办法表示,这里就以分区扇数为准。

由此可见:
  在 windows 7 的默认分区下,分区1 只是启动分区,分区2 则整个系统的分区。

从 0x00 - 0x162 :这是 MBR 的主体代码区域

从 0x162 - 0x1bd:这是 MBR 用到的数据区域

从 0x1be - 0x1fd: 这是 MBR 的磁盘分区表区域

从 0x1fe - 0x1ff:这是 MBR 的标志 "55AA"

-----------------------------------------------------------------------------------------------------

chs mode是磁盘寻址模式,

c=cyclinder柱面数

h=head磁头数

s=sector扇区数

这是一种传统的硬盘寻址模式,只支持小容量的盘

新的主要是LBA模式(逻辑寻址模式)支持大容量硬盘

#define  CHS_MODE   0
#define  LBA_MODE   !(CHS_MODE)

-----------------------------------------------------------

根据以上引导分区的,MBR的内容,

分两种方式操作:手动格式化SD卡,脚本格式化SD卡

手动方式如下:
在linux下面给sd卡分区,格式化是非常轻松的。
我安装的系统是ubuntu10.04。
sd卡插上之后,自动mount了。
所以,第一步,umount。
$sudo -i
输入自己的密码取得root权限。
# mount
可以看到最后一行的设备号
/dev/mmcblk0 on /media/60C5-3EC0 type vfat (rw,nosuid,nodev,uhelper=udisks,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,flush)
umount这个sd卡
# umount /dev/mmcblk0
下面上场的是fdisk工具。
# fdisk /dev/mmcblk0
fdisk命令都是非常简单的。
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').

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)
先P,看看sd卡的分区现状。
然后d,删除原分区
n,创建分区

Command (m for help): n
Command action
e   extended
p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-62528, default 1): 1

Last cylinder, +cylinders or +size{K,M,G} (1-62528, default 62528):  +1500M

t,指定分区类型,
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): L


0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris       
1  FAT12           39  Plan 9          82  Linux swap / So c1  DRDOS/sec (FAT-
2  XENIX root      3c  PartitionMagic  83  Linux           c4  DRDOS/sec (FAT-
3  XENIX usr       40  Venix 80286     84  OS/2 hidden C:  c6  DRDOS/sec (FAT-
4  FAT16 <32M      41  PPC PReP Boot   85  Linux extended  c7  Syrinx        
5  Extended        42  SFS             86  NTFS volume set da  Non-FS data   
6  FAT16           4d  QNX4.x          87  NTFS volume set db  CP/M / CTOS / .
7  HPFS/NTFS       4e  QNX4.x 2nd part 88  Linux plaintext de  Dell Utility  
8  AIX             4f  QNX4.x 3rd part 8e  Linux LVM       df  BootIt        
9  AIX bootable    50  OnTrack DM      93  Amoeba          e1  DOS access    
a  OS/2 Boot Manag 51  OnTrack DM6 Aux 94  Amoeba BBT      e3  DOS R/O       
b  W95 FAT32       52  CP/M            9f  BSD/OS          e4  SpeedStor     
c  W95 FAT32 (LBA) 53  OnTrack DM6 Aux a0  IBM Thinkpad hi eb  BeOS fs       
e  W95 FAT16 (LBA) 54  OnTrackDM6      a5  FreeBSD         ee  GPT           
f  W95 Ext'd (LBA) 55  EZ-Drive        a6  OpenBSD         ef  EFI (FAT-12/16/
10  OPUS            56  Golden Bow      a7  NeXTSTEP        f0  Linux/PA-RISC b
11  Hidden FAT12    5c  Priam Edisk     a8  Darwin UFS      f1  SpeedStor     
12  Compaq diagnost 61  SpeedStor       a9  NetBSD          f4  SpeedStor     
14  Hidden FAT16 <3 63  GNU HURD or Sys ab  Darwin boot     f2  DOS secondary 
16  Hidden FAT16    64  Novell Netware  af  HFS / HFS+      fb  VMware VMFS   
17  Hidden HPFS/NTF 65  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE
18  AST SmartSleep  70  DiskSecure Mult b8  BSDI swap       fd  Linux raid auto
1b  Hidden W95 FAT3 75  PC/IX           bb  Boot Wizard hid fe  LANstep       
1c  Hidden W95 FAT3 80  Old Minix       be  Solaris boot    ff  BBT           
1e  Hidden W95 FAT1
Hex code (type L to list codes): 6
Changed system type of partition 1 to 6 (FAT16)

这样就分好了第一个分区,并且指定了分区为fat16。
第二个,我试做分区为linux分区

Command (m for help): n

Command action
e   extended
p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (48002-62528, default 48002):
Using default value 48002
Last cylinder, +cylinders or +size{K,M,G} (48002-62528, default 62528):
Using default value 62528

Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): 83


好了,看看成果。

Command (m for help): p

Disk /dev/mmcblk0: 2048 MB, 2048917504 bytes
4 heads, 16 sectors/track, 62528 cylinders
Units = cylinders of 64 * 512 = 32768 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x6f20736b

Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1               1       48001     1536024    6  FAT16
/dev/mmcblk0p2           48002       62528      464864   83  Linux

好了,把分区信息写入磁盘。

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: If you have created or modified any DOS 6.x
partitions, please see the fdisk manual page for additional
information.
Syncing disks.

下面开始格式化。
首先是fat16分区
#mkdosfs  /dev/mmcblk0p1
然后是linux分区
#mkfs.ext3 /dev/mmcblk0p2

还有一种方式自动脚本完成格式花操作,以及分区大小设置,分区重命名,分区不同类型

如有需要评论里留邮箱。



你可能感兴趣的:(Linux_fdisk操作SD卡)