sgdisk 创建分区
mke2fs 格式化文件系统
e2fsck 检查文件系统的正确性
blkid 检查sdcard是什么格式的
mmc1 : card|mmc1 : new|vold : Disk at|sgdisk|blkid|mke2fs|/dev/block/dm-2|e2fsck
0.识别挂载过程
// 1. get uevent from kernel
NetlinkHandler::onEvent /*-----------NetlinkHandler.cpp--------*/
VolumeManager::handleBlockEvent /*-----------VolumeManager.cpp------*/
case NetlinkEvent::Action::kAdd:
Disk ::create(); /*------------disk.cpp---------------*/
Disk :: readMetadata()
Disk :: readPartitions() // sgdisk read partation
ReadMetadataUntrusted(mDevPath, fsType, unused, unused) /*----------Utils.cpp------------*/
readMetadata // blkid -c /dev/null -s TYPE -s UUID -s LABEL /dev/block/mmcblk1p1 (get sdcard type)
createPublicVolume // fat32
void Disk::createPublicVolume(dev_t device) {
auto vol = std::shared_ptr<VolumeBase>(new PublicVolume(device));
if (mJustPartitioned)
{
LOG(DEBUG) << "Device just partitioned; silently formatting";
vol->setSilent(true);
vol->create();
vol->format("auto");
vol->destroy();
vol->setSilent(false);
}
mVolumes.push_back(vol);
vol->setDiskId(getId());
vol->create();
}
createPrivateVolume // ext4
case NetlinkEvent::Action::kChange: //kChange 流程,格式化过程
{
LOG(DEBUG) << "Disk at " << major << ":" << minor << " changed";
disk->readMetadata();
disk->readPartitions();
}
----------
// 2. creat volume (PublicVolume.cpp VolumeBase.cpp)
PublicVolume::create()
VolumeBase::create()
PublicVolume::doCreate();
notifyEvent(ResponseCode::VolumeCreated, StringPrintf("%d \"%s\" \"%s\"", mType, mDiskId.c_str(), mPartGuid.c_str())); **// notify VolumeCreated event to mountservice**
----------
// 3. process VOLUME_CREATED 650 handler from vold (mountservice.java)
MountServiceHandler.onEvent
MountServiceHandler.onEventLocked
case VoldResponseCode.VOLUME_CREATED: // reciver VOLUME_CREATED 650 handler from vold
onVolumeCreatedLocked(vol);
mHandler.obtainMessage(H_VOLUME_MOUNT, vol).sendToTarget(); // send message (H_VOLUME_MOUNT) to mountservice
----------
//4. handle H_VOLUME_MOUNT message (mountservice.java)
MountServiceHandler.handleMessage
case H_VOLUME_MOUNT:
mConnector.execute("volume", "mount", vol.id, vol.mountFlags, vol.mountUserId);
----------
//5 .native do mount (VolumeBase.cpp PublicVolume.cpp vfat.cpp )
VolumeBase::mount()
{
if ((mState != State::kUnmounted) && (mState != State::kUnmountable)) {
LOG(WARNING) << getId() << " mount requires state unmounted or unmountable";
return -EBUSY;
}
setState(State::kChecking); -> notifyEvent(ResponseCode::VolumeStateChanged, StringPrintf("%d", mState)); // set state VolumeStateChanged = 651 kChecking
status_t res = doMount();
/*-----------------------------------------------------------*/
PublicVolume::doMount() // PublicVolume.cpp
exfat::Mount(mDevPath, mRawPath, false, false, false,AID_MEDIA_RW, AID_MEDIA_RW, 0007); // vfat.cpp
/*------------------------------------------------------------*/
if (res == OK)
setState(State::kMounted); // set state notifyEvent kMounted
else
setState(State::kUnmountable); // set state anotifyEvent kUnmountable
}
1.格式化过程
1.mountservic下发格式化命令-擦除所有的分区 (Disk::partitionPublic)
vold : /system/bin/sgdisk
vold : --zap-all
vold : /dev/block/vold/disk:179,64
2.分区表已经被删除需要重新分区
sgdisk : GPT data structures destroyed! You may now partition the disk using fdisk or
sgdisk : other utilities.
3. vold收到kernel的 disk changed uevent消息 VolumeManager::handleBlockEvent 处理 NetlinkEvent::Action::kChange 消息,接下来走格式化的一些流程
mmcblk1 : p1
vold : Disk at 179:64 changed
4.读取分区信息,获取sdcard类型以便创建publicvolume/privateVolume (Disk::readPartitions)
vold : /system/bin/sgdisk
vold : --android-dump
vold : /dev/block/vold/disk:179,64
vold : /dev/block/vold/disk:179,64
Line 11852: 01-07 08:47:54.323 358 364 I sgdisk :
Line 11853: 01-07 08:47:54.323 358 364 I sgdisk : ***************************************************************
Line 11854: 01-07 08:47:54.323 358 364 I sgdisk : Found invalid GPT and valid MBR; converting MBR to GPT format
Line 11855: 01-07 08:47:54.323 358 364 I sgdisk : in memory.
Line 11856: 01-07 08:47:54.323 358 364 I sgdisk : ***************************************************************
Line 11857: 01-07 08:47:54.323 358 364 I sgdisk :
Line 11858: 01-07 08:47:54.323 358 364 I sgdisk :
Line 11859: 01-07 08:47:54.323 358 364 I sgdisk : Warning! Secondary partition table overlaps the last partition by
Line 11860: 01-07 08:47:54.323 358 364 I sgdisk : 33 blocks!
Line 11861: 01-07 08:47:54.323 358 364 I sgdisk : You will need to delete this partition or resize it in another utility.
Line 11868: 01-07 08:47:55.393 0 0 I mmcblk1 : p1
Line 11869: 01-07 08:47:55.393 358 364 I sgdisk : GPT data structures destroyed! You may now partition the disk using fdisk or
Line 11870: 01-07 08:47:55.393 358 364 I sgdisk : other utilities.
Line 11875: 01-07 08:47:55.447 1224 1390 D VoldConnector: RCV <- {200 37 Command succeeded}
Line 11876: 01-07 08:47:55.448 1224 2186 E VoldConnector: NDC Command {37 volume partition disk:179,64 public} took too long (2243ms)
Line 11877: 01-07 08:47:55.451 0 0 I mmcblk1 : p1
Line 11878: 01-07 08:47:55.453 358 362 D vold : Disk at 179:64 changed
Line 11878: 01-07 08:47:55.453 358 362 D vold : Disk at 179:64 changed
Line 11879: 01-07 08:47:55.454 1224 1390 D VoldConnector: RCV <- {641 disk:179,64 15854469120}
Line 11880: 01-07 08:47:55.455 358 362 V vold : /system/bin/sgdisk
Line 11880: 01-07 08:47:55.455 358 362 V vold : /system/bin/sgdisk
Line 11881: 01-07 08:47:55.455 358 362 V vold : --android-dump
Line 11882: 01-07 08:47:55.455 358 362 V vold : /dev/block/vold/disk:179,64
Line 11882: 01-07 08:47:55.455 358 362 V vold : /dev/block/vold/disk:179,64
Line 11883: 01-07 08:47:55.455 1224 1390 D VoldConnector: RCV <- {642 disk:179,64 }
Line 11884: 01-07 08:47:55.456 1224 1390 D VoldConnector: RCV <- {644 disk:179,64 /sys//devices/soc/7864900.sdhci/mmc_host/mmc1/mmc1:0001/block/mmcblk1}
Line 11884: 01-07 08:47:55.456 1224 1390 D VoldConnector: RCV <- {644 disk:179,64 /sys//devices/soc/7864900.sdhci/mmc_host/mmc1/mmc1:0001/block/mmcblk1}
Line 11892: 01-07 08:47:55.505 358 362 V vold : DISK mbr
Line 11893: 01-07 08:47:55.505 358 362 V vold :
Line 11894: 01-07 08:47:55.505 358 362 V vold : PART 1 c
Line 11895: 01-07 08:47:55.505 358 362 V vold :
Line 11896: 01-07 08:47:55.510 358 362 D vold : Device just partitioned; silently formatting
Line 11897: 01-07 08:47:55.511 358 362 E vold : zch=================readMetadata start
Line 11897: 01-07 08:47:55.511 358 362 E vold : zch=================readMetadata start
Line 11898: 01-07 08:47:55.511 358 362 V vold : /system/bin/blkid
Line 11899: 01-07 08:47:55.511 358 362 V vold : -c
Line 11900: 01-07 08:47:55.511 358 362 V vold : /dev/null
Line 11901: 01-07 08:47:55.511 358 362 V vold : -s
Line 11902: 01-07 08:47:55.511 358 362 V vold : TYPE
Line 11903: 01-07 08:47:55.511 358 362 V vold : -s
Line 11904: 01-07 08:47:55.511 358 362 V vold : UUID
Line 11905: 01-07 08:47:55.511 358 362 V vold : -s
Line 11906: 01-07 08:47:55.511 358 362 V vold : LABEL
Line 11907: 01-07 08:47:55.511 358 362 V vold : /dev/block/vold/public:179,65
Line 11907: 01-07 08:47:55.511 358 362 V vold : /dev/block/vold/public:179,65
Line 11908: 01-07 08:47:55.594 358 362 V vold : /dev/block/vold/public:179,65: UUID="F503-1002" TYPE="vfat"
Line 11908: 01-07 08:47:55.594 358 362 V vold : /dev/block/vold/public:179,65: UUID="F503-1002" TYPE="vfat"
Line 11909: 01-07 08:47:55.594 358 362 V vold :
Line 11910: 01-07 08:47:55.597 358 362 E vold : zch=================readMetadata end
Line 11910: 01-07 08:47:55.597 358 362 E vold : zch=================readMetadata end
Line 11911: 01-07 08:47:55.597 358 362 I vold : About to discard 15853420544 on /dev/block/vold/public:179,65
Line 11911: 01-07 08:47:55.597 358 362 I vold : About to discard 15853420544 on /dev/block/vold/public:179,65
Line 11938: 01-07 08:48:00.449 1224 2186 W MountService: Thread Binder:1224_D still waiting for partitionPublic...
Line 11980: 01-07 08:48:05.449 1224 2186 W MountService: Thread Binder:1224_D still waiting for partitionPublic...
Line 12010: 01-07 08:48:10.450 1224 2186 W MountService: Thread Binder:1224_D still waiting for partitionPublic...
Line 12029: 01-07 08:48:15.451 1224 2186 W MountService: Thread Binder:1224_D still waiting for partitionPublic...
Line 12060: 01-07 08:48:20.453 1224 2186 W MountService: Thread Binder:1224_D still waiting for partitionPublic...
Line 12084: 01-07 08:48:25.455 1224 2186 W MountService: Thread Binder:1224_D still waiting for partitionPublic...
Line 12108: 01-07 08:48:29.578 358 362 I vold : Discard success on /dev/block/vold/public:179,65
Line 12108: 01-07 08:48:29.578 358 362 I vold : Discard success on /dev/block/vold/public:179,65
Line 12109: 01-07 08:48:29.579 358 362 V vold : /system/bin/blkid
Line 12110: 01-07 08:48:29.579 358 362 V vold : -c
Line 12111: 01-07 08:48:29.579 358 362 V vold : /dev/null
Line 12112: 01-07 08:48:29.579 358 362 V vold : -s
Line 12113: 01-07 08:48:29.579 358 362 V vold : TYPE
Line 12114: 01-07 08:48:29.579 358 362 V vold : -s
Line 12115: 01-07 08:48:29.579 358 362 V vold : UUID
Line 12116: 01-07 08:48:29.579 358 362 V vold : -s
Line 12117: 01-07 08:48:29.579 358 362 V vold : LABEL
Line 12118: 01-07 08:48:29.579 358 362 V vold : /dev/block/vold/public:179,65
Line 12118: 01-07 08:48:29.579 358 362 V vold : /dev/block/vold/public:179,65
Line 12119: 01-07 08:48:29.655 358 362 E vold : Failed to pclose /system/bin/blkid -c /dev/null -s TYPE -s UUID -s LABEL /dev/block/vold/public:179,65 : Success
Line 12119: 01-07 08:48:29.655 358 362 E vold : Failed to pclose /system/bin/blkid -c /dev/null -s TYPE -s UUID -s LABEL /dev/block/vold/public:179,65 : Success
Line 12120: 01-07 08:48:29.655 358 362 E vold : Failed to pclose errno : 0: Success
Line 12121: 01-07 08:48:29.655 358 362 E vold : PublicVolume doFormat mFsType =
Line 12122: 01-07 08:48:29.655 358 362 V vold : /system/bin/newfs_msdos
Line 12123: 01-07 08:48:29.655 358 362 V vold : -F
Line 12124: 01-07 08:48:29.655 358 362 V vold : 32
Line 12125: 01-07 08:48:29.655 358 362 V vold : -O
Line 12126: 01-07 08:48:29.655 358 362 V vold : android
Line 12127: 01-07 08:48:29.655 358 362 V vold : -c
Line 12128: 01-07 08:48:29.655 358 362 V vold : 64
Line 12129: 01-07 08:48:29.655 358 362 V vold : -A
Line 12130: 01-07 08:48:29.655 358 362 V vold : /dev/block/vold/public:179,65
Line 12130: 01-07 08:48:29.655 358 362 V vold : /dev/block/vold/public:179,65
Line 12131: 01-07 08:48:29.700 358 362 I newfs_msdos: /system/bin/newfs_msdos: warning, /dev/block/vold/public:179,65 is not a character device
Line 12133: 01-07 08:48:29.701 358 362 I newfs_msdos: /dev/block/vold/public:179,65: 30948480 sectors in 483570 FAT32 clusters (32768 bytes/cluster)
Line 12137: 01-07 08:48:30.456 1224 2186 W MountService: Thread Binder:1224_D still waiting for partitionPublic...
Line 12140: 01-07 08:48:31.211 358 362 I Vold : Filesystem formatted OK
Line 12141: 01-07 08:48:31.213 1224 1390 D VoldConnector: RCV <- {650 public:179,65 0 "disk:179,64" ""}
Line 12142: 01-07 08:48:31.214 1224 1390 D VoldConnector: RCV <- {651 public:179,65 0}
Line 12143: 01-07 08:48:31.214 1224 1389 D VoldConnector: SND -> {38 volume mount public:179,65 2 0}
Line 12144: 01-07 08:48:31.214 1224 1390 D VoldConnector: RCV <- {643 disk:179,64}
Line 12145: 01-07 08:48:31.215 358 362 D vold : Disk at 179:64 changed
Line 12145: 01-07 08:48:31.215 358 362 D vold : Disk at 179:64 changed
Line 12146: 01-07 08:48:31.216 358 362 V vold : /system/bin/sgdisk
Line 12146: 01-07 08:48:31.216 358 362 V vold : /system/bin/sgdisk
Line 12147: 01-07 08:48:31.216 358 362 V vold : --android-dump
Line 12148: 01-07 08:48:31.216 358 362 V vold : /dev/block/vold/disk:179,64
Line 12148: 01-07 08:48:31.216 358 362 V vold : /dev/block/vold/disk:179,64
Line 12154: 01-07 08:48:31.216 1224 1390 D VoldConnector: RCV <- {641 disk:179,64 15854469120}
Line 12155: 01-07 08:48:31.217 1224 1390 D VoldConnector: RCV <- {642 disk:179,64 }
Line 12156: 01-07 08:48:31.217 1224 1390 D VoldConnector: RCV <- {644 disk:179,64 /sys//devices/soc/7864900.sdhci/mmc_host/mmc1/mmc1:0001/block/mmcblk1}
Line 12156: 01-07 08:48:31.217 1224 1390 D VoldConnector: RCV <- {644 disk:179,64 /sys//devices/soc/7864900.sdhci/mmc_host/mmc1/mmc1:0001/block/mmcblk1}
Line 12157: 01-07 08:48:31.218 1224 1390 D VoldConnector: RCV <- {651 public:179,65 7}
Line 12158: 01-07 08:48:31.219 1224 1390 D VoldConnector: RCV <- {659 public:179,65}
Line 12182: 01-07 08:48:31.276 358 362 V vold : DISK mbr
Line 12183: 01-07 08:48:31.276 358 362 V vold :
Line 12184: 01-07 08:48:31.276 358 362 V vold : PART 1 c
Line 12185: 01-07 08:48:31.276 358 362 V vold :
Line 12186: 01-07 08:48:31.278 358 364 V vold : /system/bin/blkid
Line 12187: 01-07 08:48:31.278 358 364 V vold : -c
Line 12188: 01-07 08:48:31.278 358 364 V vold : /dev/null
Line 12189: 01-07 08:48:31.278 358 364 V vold : -s
Line 12190: 01-07 08:48:31.278 358 364 V vold : TYPE
Line 12191: 01-07 08:48:31.278 358 364 V vold : -s
Line 12192: 01-07 08:48:31.278 358 364 V vold : UUID
Line 12193: 01-07 08:48:31.278 1224 1390 D VoldConnector: RCV <- {650 public:179,65 0 "disk:179,64" ""}
Line 12194: 01-07 08:48:31.278 358 364 V vold : -s
Line 12195: 01-07 08:48:31.278 358 364 V vold : LABEL
Line 12196: 01-07 08:48:31.278 358 364 V vold : /dev/block/vold/public:179,65
Line 12196: 01-07 08:48:31.278 358 364 V vold : /dev/block/vold/public:179,65
Line 12197: 01-07 08:48:31.280 1224 1390 D VoldConnector: RCV <- {651 public:179,65 0}
Line 12198: 01-07 08:48:31.281 1224 1390 D VoldConnector: RCV <- {643 disk:179,64}
Line 12199: 01-07 08:48:31.281 1224 1390 D VoldConnector: RCV <- {651 public:179,65 1}
Line 12215: 01-07 08:48:31.377 358 364 V vold : /dev/block/vold/public:179,65: UUID="2007-1011" TYPE="vfat"
Line 12215: 01-07 08:48:31.377 358 364 V vold : /dev/block/vold/public:179,65: UUID="2007-1011" TYPE="vfat"
Line 12216: 01-07 08:48:31.377 358 364 V vold :
Line 12217: 01-07 08:48:31.393 1224 1390 D VoldConnector: RCV <- {652 public:179,65 vfat}
Line 12218: 01-07 08:48:31.393 358 364 V vold : /system/bin/fsck_msdos
Line 12219: 01-07 08:48:31.393 358 364 V vold : -p
Line 12220: 01-07 08:48:31.393 358 364 V vold : -f
Line 12221: 01-07 08:48:31.393 358 364 V vold : /dev/block/vold/public:179,65
Line 12221: 01-07 08:48:31.393 358 364 V vold : /dev/block/vold/public:179,65
Line 12222: 01-07 08:48:31.393 1224 1390 D VoldConnector: RCV <- {653 public:179,65 2007-1011}
Line 12223: 01-07 08:48:31.394 1224 1390 D VoldConnector: RCV <- {654 public:179,65 }
Line 12226: 01-07 08:48:31.447 358 364 I fsck_msdos: ** /dev/block/vold/public:179,65
Line 12250: 01-07 08:48:31.808 358 364 I Vold : Filesystem check completed OK
Line 12251: 01-07 08:48:31.808 1224 1390 D VoldConnector: RCV <- {656 public:179,65 /mnt/media_rw/2007-1011}
Line 12252: 01-07 08:48:31.809 1224 1390 D VoldConnector: RCV <- {655 public:179,65 /storage/2007-1011}
Line 12253: 01-07 08:48:31.838 0 0 D SELinux : initialized (dev mmcblk1p1, type vfat), uses genfs_contexts
Line 12254: 01-07 08:48:31.898 358 364 V vold : Waiting for FUSE to spin up...
Line 12257: 01-07 08:48:31.948 358 364 V vold : Waiting for FUSE to spin up...
Line 12263: 01-07 08:48:32.000 1224 1390 D VoldConnector: RCV <- {651 public:179,65 2}
Line 12264: 01-07 08:48:32.001 1224 1390 D VoldConnector: RCV <- {200 38 Command succeeded}
Line 12265: 01-07 08:48:32.001 1224 1389 E VoldConnector: NDC Command {38 volume mount public:179,65 2 0} took too long (787ms)
Line 12266: 01-07 08:48:32.016 1224 1389 D MountService: Volume public:179,65 broadcasting removed to UserHandle{0}
Line 12267: 01-07 08:48:32.020 1224 1389 D VoldConnector: SND -> {39 volume mount public:179,65 2 0}
Line 12273: 01-07 08:48:32.021 358 364 W vold : public:179,65 flags change requires state unmounted or unmountable
Line 12274: 01-07 08:48:32.022 358 364 W vold : public:179,65 user change requires state unmounted or unmountable
Line 12275: 01-07 08:48:32.022 358 364 W vold : public:179,65 mount requires state unmounted or unmountable
Line 12276: 01-07 08:48:32.022 1224 1390 D VoldConnector: RCV <- {400 39 Command failed}
Line 12277: 01-07 08:48:32.024 1224 1389 D MountService: Volume public:179,65 broadcasting checking to UserHandle{0}
Line 12278: 01-07 08:48:32.026 1224 1389 D MountService: Volume public:179,65 broadcasting mounted to UserHandle{0}
1.U盘插入拔出打印
1.1mountservice 完整流程
MountService: Volume public:8,1 broadcasting checking to UserHandle{0} // 插入后检测挂载
MountService: Volume public:8,1 broadcasting mounted to UserHandle{0}
MountService: Volume public:8,1 broadcasting ejecting to UserHandle{0} // 点击弹出umount
MountService: Volume public:8,1 broadcasting unmounted to UserHandle{0}
MountService: Volume public:8,1 broadcasting removed to UserHandle{0} // 拔出U盘
1.2 kernelU盘插入拔出kernel打印
usb 2-1: new SuperSpeed USB device number 2 using xhci_hcd // 插上
30375936 512-byte logical blocks: (15.5 GB/14.4 GiB) // 读取大小
USB disconnect, device number // 拔出
2.U盘插入拔出mount/umount代码流程
2.1监听subsystem为block 的uevent事件
NetlinkHandler::onEvent
VolumeManager::handleBlockEvent
case add:
Disk::create // disk.cpp
disk::readMetadata();
disk::readPartitions();
notifyEvent(ResponseCode::DiskCreated, StringPrintf("%d", mFlags));
case chager:
disk::readMetadata();
disk::readPartitions();
case remove:
Disk::destroy()
destroyAllVolumes();
notifyEvent(ResponseCode::DiskDestroyed);
2.2vold发送广播
Disk::notifyEvent
VolumeManager::Instance()->getBroadcaster()->sendBroadcast
2.3 mountService接收来着vold的广播
MountService.onEvent
MountService.onEventLocked
case VoldResponseCode.VOLUME_STATE_CHANGED: //每一次状态的改变都会调用这个分支
onVolumeStateChangedLocked(vol, oldState, newState); // 状态改变做相应操作
mHandler.obtainMessage(H_VOLUME_BROADCAST, userVol).sendToTarget(); // mountService发广播给mountService
3.mountService接收来着mountService的广播
MountServiceHandler.handleMessage //接收广播
case H_VOLUME_MOUNT: // 挂载
mConnector.execute("volume", "mount", vol.id, vol.mountFlags,vol.mountUserId);
case H_VOLUME_BROADCAST: // 发送广播给用户告知状态
Slog.d(TAG, "Volume " + userVol.getId() + " broadcasting " + envState + " to "+ userVol.getOwner());
mContext.sendBroadcastAsUser(intent, userVol.getOwner());
4.vold sdcard识别挂载细节
4.1 工具的使用
// readMetadata blkid工具读取元数据,区分sdcard类型
blkid -c /dev/null -s TYPE -s UUID -s LABEL /dev/block/mmcblk1p1
/dev/block/mmcblk1p1: UUID="9034-1BF1" TYPE="vfat"
// readPartitions sgdisk读取分区信息
sgdisk --android-dump /dev/block/mmcblk1p1
// partitionPublic 删除所有分区
/system/bin/sgdisk --zap-all /dev/block/vold/disk:179,64
4.2 内外置存储的volume
privateVolume // 内置存储 ext4,mount到 /mnt/expand/xxx
PublicVolume // 外置存储 fat32 mount到 /mnt/media_rw/xxx