From 8b7af4c0ee245c913ae00dbf052c85156fb1b68e Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Fri, 1 Jun 2018 11:58:54 +0900 Subject: Recovery image is self-contained Now recovery mode is self-contained, which means we don't need to mount system.img to run shell, etc. What is needed in recovery mode is all in the recovery ramdisk image. Since we no longer use /system as the mount point for the system.img, this allows us to have identical filesystem layout as the system.img. Executables and libs are installed to /system/bin and /system/lib. Right now, we only have adbd, sh, toybox in /system/bin but will move static executables from /sbin to /system/bin as soon as they are converted to dynamic executables. system.img is mounted to /mnt/system instead. Bug: 63673171 Test: `adb reboot recovery; adb devices` shows the device ID Test: `adb root && adb shell` and then $ lsof -p `pidof adbd` shows that libm.so, libc.so, etc. are loaded from the /lib directory. Change-Id: I801ebd18f3e0a112db3d9a11e4fbb4e49181652a --- etc/init.rc | 3 ++- fsck_unshare_blocks.cpp | 14 +++----------- recovery.cpp | 8 +++----- 3 files changed, 8 insertions(+), 17 deletions(-) diff --git a/etc/init.rc b/etc/init.rc index 0fc6c4c13..96c37b11c 100644 --- a/etc/init.rc +++ b/etc/init.rc @@ -22,6 +22,7 @@ on init mkdir /data mkdir /cache mkdir /sideload + mkdir /mnt/system mount tmpfs tmpfs /tmp chown root shell /tmp @@ -87,7 +88,7 @@ service charger /charger -r service recovery /sbin/recovery seclabel u:r:recovery:s0 -service adbd /sbin/adbd --root_seclabel=u:r:su:s0 --device_banner=recovery +service adbd /system/bin/adbd --root_seclabel=u:r:su:s0 --device_banner=recovery disabled socket adbd stream 660 system system seclabel u:r:adbd:s0 diff --git a/fsck_unshare_blocks.cpp b/fsck_unshare_blocks.cpp index a100368e7..2e6b5b807 100644 --- a/fsck_unshare_blocks.cpp +++ b/fsck_unshare_blocks.cpp @@ -115,14 +115,6 @@ static bool run_e2fsck(const std::string& partition) { return true; } -static const char* get_system_root() { - if (android::base::GetBoolProperty("ro.build.system_root_image", false)) { - return "/system_root"; - } else { - return "/system"; - } -} - bool do_fsck_unshare_blocks() { // List of partitions we will try to e2fsck -E unshare_blocks. std::vector partitions = { "/odm", "/oem", "/product", "/vendor" }; @@ -130,10 +122,10 @@ bool do_fsck_unshare_blocks() { // Temporarily mount system so we can copy e2fsck_static. bool mounted = false; if (android::base::GetBoolProperty("ro.build.system_root_image", false)) { - mounted = ensure_path_mounted_at("/", "/system_root") != -1; + mounted = ensure_path_mounted_at("/", "/mnt/system") != -1; partitions.push_back("/"); } else { - mounted = ensure_path_mounted("/system") != -1; + mounted = ensure_path_mounted_at("/system", "/mnt/system") != -1; partitions.push_back("/system"); } if (!mounted) { @@ -144,7 +136,7 @@ bool do_fsck_unshare_blocks() { LOG(ERROR) << "Could not copy e2fsck to /tmp."; return false; } - if (umount(get_system_root()) < 0) { + if (umount("/mnt/system") < 0) { PLOG(ERROR) << "umount failed"; return false; } diff --git a/recovery.cpp b/recovery.cpp index 98cbfed2f..fea65ae9e 100644 --- a/recovery.cpp +++ b/recovery.cpp @@ -820,15 +820,13 @@ static Device::BuiltinAction prompt_and_wait(Device* device, int status) { break; } case Device::MOUNT_SYSTEM: - // For a system image built with the root directory (i.e. system_root_image == "true"), we - // mount it to /system_root, and symlink /system to /system_root/system to make adb shell - // work (the symlink is created through the build system). (Bug: 22855115) + // the system partition is mounted at /mnt/system if (android::base::GetBoolProperty("ro.build.system_root_image", false)) { - if (ensure_path_mounted_at("/", "/system_root") != -1) { + if (ensure_path_mounted_at("/", "/mnt/system") != -1) { ui->Print("Mounted /system.\n"); } } else { - if (ensure_path_mounted("/system") != -1) { + if (ensure_path_mounted_at("/system", "/mnt/system") != -1) { ui->Print("Mounted /system.\n"); } } -- cgit v1.2.3