dd로 찍은 시스템을 플래시하려고합니다.


16

오랜 유닉스 사용자이지만 안드로이드 세계에는 비교적 새로운 곳입니다. 읽어.

에피소드 1 : 새로운 백업 (희망)

최근에 Asus MemoPAD (ME103K)를 구입했습니다. 그런 다음 루트 dd가되어 읽기 전용 system파티션 의 이미지를 외부 SD 카드로 가져 왔습니다.

$ su
# dd if=/dev/block/platform/msm_sdcc.1/by-name/system \
         of=/storage/MicroSD/system.img bs=1M
# ls -l /storage/MicroSD/system.img
-rw-r--r-- 1 root root 2147483648 Sep 27 13:15 system.img

크기 (정확히 2GiB)는 약간 의심 스럽습니다. SD 카드의 FAT32 파티션 때문일 수 있습니까?

아니, 이것은 tune2fs -l실제로 2GiB 크기의 유효한 EXT4 이미지였으며 fsck -f전혀 오류없이 통과 한 것으로 밝혀졌습니다 . 그리고 fastboot(태블릿에 연결된 리눅스 머신에서) 다음과 같이 동의했습니다 adb reboot bootloader.

linuxbox# fastboot getvar all
(bootloader)  version-bootloader: 3.03
(bootloader)  version-hardware: rev_c
(bootloader)  variant: LEOPARDCAT 16G
(bootloader)  version-baseband: H00_0.16.F_0521
(bootloader)  serialno: 0a3dXXXX
...
(bootloader)  partition-type:system: ext4
(bootloader)  partition-size:system: 0x0000000080000000

그 크기는 실제로 2GB입니다.

linuxbox# python2 -c 'print 0x0000000080000000'
2147483648

따라서 모든 것이 좋습니다-이미지 백업이 있습니다. 이제 복원을 테스트합니다.

나는 system.img를 태블릿으로 다시 플래시하려고 시도한다-유닉스 세계에서 우리가하는 방탄 백업의 어떤 것 ( 예를 들어, 드라이브의 컨텐츠를 통해 복원)dd if=backup.image of=/dev/sdXXX 으로부터 복구 할 수 있도록 한다.

모든 관련 adbfastboot완벽하게 작업 - 내가 시도 할 수 있도록 ...

linux_box# fastboot devices
0a3dXXXX     fastboot

linux_box# mount /dev/sdcard /mnt/sdcard
linux_box# cp /mnt/sdcard/system.img .
linux_box# fastboot flash system system.img
error: cannot load 'system.img'

흠. android-tools-5.1.1이 오류를 확인하기 위해 소스에서 배포판을 다운로드하여 빌드하고 디버그 정보를 추가하고 디버거를 밟습니다.

linuxbox# gdb --args fastboot flash system system.img
...

네거티브 크기로 인한 오류!

흥미로운 점은 64 비트 컴퓨터에 있더라도 파일 크기를 "부정적"으로 바꾸는 문제가있는 것입니다 (32 비트 세계에서는 내 이미지의 파일 크기 2 ^ 31은 실제로 음으로 간주됩니다) -2147483648.

좋아, 안드로이드에서 큰 이미지 파일을 어떻게 플래시합니까?

인터넷 검색, 검색-이 make_ext4fs도구 를 사용하여 플래시 가능한 이미지를 만듭니다. 사실 그것은 방금 컴파일 한 것의 일부이므로 사용할 수도 있습니다.

linuxbox# mkdir /system
linuxbox# mount -o loop,ro system.img /system
linuxbox# ls -l /system
total 208
drwxr-xr-x 106 root root   8192 Sep 17 22:24 app
drwxr-xr-x   3 root 2000   8192 Sep 26 21:08 bin
-rw-r--r--   1 root root   6847 Sep 12 16:59 build.prop
drwxr-xr-x  19 root root   4096 Sep 26 21:08 etc
drwxr-xr-x   2 root root   4096 Aug 11 22:27 fonts
drwxr-xr-x   4 root root   4096 Sep 12 16:56 framework
drwxr-xr-x  10 root root  16384 Sep 12 16:59 lib
drwxr-xr-x   2 root root   4096 Jan  1  1970 lost+found
drwxr-xr-x   3 root root   4096 Aug 11 22:18 media
drwxr-xr-x  59 root root   4096 Aug 11 22:29 priv-app
-rw-r--r--   1 root root 126951 Aug  1  2008 recovery-from-boot.p
drwxr-xr-x   3 root root   4096 Aug 11 21:02 scripts
drwxr-xr-x   3 root root   4096 Aug 11 21:02 tts
drwxr-xr-x  11 root root   4096 Sep 26 21:08 usr
drwxr-xr-x   8 root 2000   4096 Aug 11 22:29 vendor
drwxr-xr-x   2 root 2000   4096 Sep 26 21:09 xbin

linuxbox# ../extras/source/extras/ext4_utils/make_ext4fs \
      -l 2048M new_system.img /system
Creating filesystem with parameters:
    Size: 2147483648
    Block size: 4096
    Blocks per group: 32768
    Inodes per group: 8192
    Inode size: 256
    Journal blocks: 8192
    Label: 
    Blocks: 524288
    Block groups: 16
    Reserved block group size: 127
Created filesystem with 2666/131072 inodes and 375014/524288 blocks

멋지다 – 그래서 나는 보통 오래된 폴더에서 시스템 이미지를 만들 수있다. 하늘이 한계가 될 것입니다.이 이미지에 원하는 것을 추가 할 수 있습니다.

태워 보자 ...

linuxbox# fastboot flash system new_system.img
erasing 'system'...
OKAY [  0.064s]
sending 'system' (2088960 KB)...
^C

나는 Ctrl-C를 누르기 전에 1 시간을 기다렸다. 빠른 부팅 모드로 다시 부팅 된 태블릿의 전원을 껐다 켜야했습니다.

이것은 좋아 보이지 않습니다.

더 작은 이미지를 만들면 어떻게됩니까? 어쩌면 2GB가 문제가 될 수 있으며이 파티션은 전체 용량으로 사용되지 않습니다-여유 공간이 있습니다.

linuxbox# ../extras/source/extras/ext4_utils/make_ext4fs \
      -l 1536M new_system.img /system

linuxbox#  ./fastboot flash system system.img 
erasing 'system'...
OKAY [  0.065s]
sending 'system' (1572864 KB)...
OKAY [ 51.039s]
writing 'system'...
OKAY [235.080s]
finished. total time: 286.183s

좋습니다, 이것은 매우 유망 해 보입니다 (그리고 5 분 밖에 걸리지 않았습니다). 이제 다시 부팅 할 수 있고 모든 것이 정상이어야한다고 생각합니다.

아니 :-)

여기에 이미지 설명을 입력하십시오

나는만큼 내가 같은 임시 벽돌 장치를 상관하지 않습니다 않는 내가,의 마스터 아니에요 내가 작동 걱정하지 않는다 기계 것으로 (결국 기계를 제어 할 수 ;-)

내가 잘못한 것에 대한 아이디어와 이것을 고치기 위해 무엇을 할 수 있습니까?

미리 감사드립니다.

추신 : 나는 태블릿의 Asus 지원 페이지를 확인했다. 커널의 소스와 OTA (Over-the-air) .zip 파일 만 제공한다. 그것은 루트에서 파일 시스템 수준의 백업을 포함합니다. 즉 system폴더는 이미지가 아닌 폴더로만 존재하며 system.img플래시 할 수는 없습니다. 그래서 실제로 도움이되지 않습니다.

에피소드 2 : 커스텀 부츠의 공격

recovery.imgAsus 의 어떤 종류의 부재에도 불구하고 (왜 제조업체는 fastboot-flashable recovery.img? 혼자.

고맙게도, Asus의 OTA (Over-the-air) 업데이트 파일은 그 안에 포함되어 있습니다 ...

linuxbox# unzip -l /opt/Asus/firmware/UL-K01E-WW-12.16.1.12-user.zip |\
     grep boot.img$
7368704  2011-03-22 11:21   boot.img

... 내 태블릿의 부팅 이미지. 이제 어쩌면-어쩌면-이것으로 뭔가를 할 수 있습니다.

linuxbox$ mkdir rootfs
linuxbox$ cd rootfs
linuxbox$ abootimg -x /path/to/boot.img
linuxbox$ ls -l
bootimg.cfg
initrd.img
zImage

램 디스크 확장 중 ...

linuxbox$ mkdir initrd
linuxbox$ cd initrd
linuxbox$ gzip -cd ../initrd.img | cpio -ivd
...
linuxbox$ vi default.prop

default.prop커널 부팅시 루트로 설정했습니다 :

ro.secure=0
ro.debuggable=1
ro.adb.secure=0
androidboot.selinux=disabled

또한 /system/bin/sh( 공중 Asus .zip 파일에서 )로 복사 했습니다 /sbin/sh. 나는 busybox 와 매우 똑같은 도구를 사용했습니다.

그리고 boot.img를 다시 포장했습니다 ...

busybox$ find . | cpio --create --format='newc' | gzip -9 > ../initrd.custom.gz
busybox$ cd ..
busybox$ abootimg --create ../new_boot_busybox.img \
    -f bootimg.cfg -k zImage -r initrd.custom.gz

abootimg패키지를 bootimg.cfg업데이트 bootsize해야하기 때문에 매개 변수를 변경해야 했기 때문에 실제로 이것을 처음 실행할 때 실제로 실패했습니다 . abootimg필요한 것을보고하므로 충분히 쉽습니다.

이제 맞춤 이미지를 부팅합니다.

linuxbox# fastboot boot new_boot_busybox.img

... 그리고 다음을 목격하십시오 ...

linuxbox# adb logcat
- exec '/system/bin/sh' failed: Permission denied (13) -

linuxbox# adb shell
- exec '/system/bin/sh' failed: Permission denied (13) -

흠 ... 아마 adbd가 루트로 실행되지 않습니까?

linuxbox# adb root
restarting adbd as root

linuxbox# adb shell
- exec '/system/bin/sh' failed: Permission denied (13) -

괜찮습니다. hexedit adbd를 패치하고 / system / bin / sh를 / sbin / sh로 패치합니다 (/ system / bin / sh를 OTA 이미지에서 initrd의 rootfs로 복사했습니다) : Reboot, fastboot ...

linuxbox# adb shell
- exec '/sbin/sh' failed: Permission denied (13) -

꿰매다. 이 일이 무엇이든 할 수 있습니까?

linuxbox# adb pull /proc/partitions
15 KB/s (1272 bytes in 0.079s)

그것은 ... 보자 :

linuxbox# adb pull /proc/mounts
16 KB/s (1358 bytes in 0.079s)

linuxbox# grep system mounts
/dev/block/platform/msm_sdcc.1/by-name/system /system ext4 rw,seclabel,relatime,data=ordered 0 0

그래, / system 마운트되었습니다. 안에 무엇이 있는지 볼 수 있습니까?

linuxbox# adb pull /system
remote object '/system' does not exist

무엇 ... 어쩌면 나는 / proc / kmsg가 무엇을 포함하는지 확인할 수있다 (어떤 "dmesg"가 출력 할 것인지)

linuxbox# adb pull /proc/kmsg
failed to copy '/proc/kmsg' to './kmsg': Operation not permitted

아냐, 그렇게하려면 루트가되어야한다.

linuxbox# adb push /sbin/sh /system/bin/sh
failed to copy '/sbin/sh' to '/system/bin/sh': Permission denied

그리고 그것도.

이것은 꽤 퍼즐로 판명되었습니다 ...


2
여기서하지 않은 유일한 일은 사용자 정의 복구를 플래시 한 다음 파티션에서 nandroid 백업 을 수행하는 것입니다. 그것은 벽돌 같은 상태에서 장치를 복구하는 방탄 방법 중 하나입니다. OTA zip (Over-the-air.zip)은 복구 용 플래시 지퍼입니다. 즉, 복구로 부팅 할 때 플래시되며 다른 패키징 형식을 따르지만 동일한 목표를 달성합니다. 간단히 말해 사용자 지정 복구를 플래시하거나 (또는 ​​하나를 부팅하여 부팅) 스톡 ROM을 플래시 한 다음 원하는만큼 실험하십시오.
Firelord

1
@Firelord : 그것은 fastboot여전히 작동 하지만 (요청에 잘 반응 하지만 ) 복구 이미지를 구울 수 있습니다. (a) ME103K에 대한 CWM 또는 TWRP 복구 이미지를 검색하고 찾지 못했습니다. 당신이 말하는 "일반적인"것이 있습니까? (b) 전원을 끄고 전원 버튼 + 볼륨 작게를 눌러도 복구 이미지가 나타나지 않습니다. 여전히 빠른 부팅 상태가됩니다. 왜 그런지 모릅니다. 사실 나는 (그것을 볼 좀 궁금) 복구 프로세스를 본 적이 없다
ttsiodras

1
Power + Vol Up + Vol Down과 같은 다른 버튼 조합을 사용하여 복구 모드로 부팅하십시오. 스톡 복구 ZIP에 액세스 할 수있는 경우 패스트 부트에서 플래시하거나 직접 부팅 할 수있는 스톡 복구 이미지 파일이있을 수 있습니다 ( fastboot boot <FILE>.img), 전체 ZIP 파일을 플래시하십시오. 또는 웹에서 fastboot를 사용하여 플래시 할 수있는 스톡 ROM 파일이 있는지 확인하십시오.
Firelord

1
@Firelord : 아니요. Asus는 recovery.zip을 제공하지 않습니다. OTA 파일에는 .img-y가 없습니다 ( unzip -l UL-K01E-WW-12.16.1.12-user.zip | grep recovery두 개의 쉘 스크립트 만 표시합니다-살펴볼 것이지만 확실히는 없습니다 recovery.img). 인터넷 검색도 도움이되지 않았습니다.이 태블릿의 복구 이미지가 어디에도 없습니다 ... dd복구 파티션과 공유 에 대한 일종의 영혼을 기다려야 할 것 같 습니까?
ttsiodras

답변:


7

3 회 : 포탄의 귀환

이 문제를 해결할 기회가 있다면 먼저 쉘이 작동하지 않는 이유를 알아야했습니다. adbd자체적으로 응답했기 때문에 태블릿 쪽에서 시작되었지만 /sbin/sh부트 이미지에 배치 한 파일 ( ) 을 호출하기 위해 해킹 한 후에도 쉘을 실행할 수 없었 습니다. 적절한 권한이 있으며 사용하는 shell(id = 2000) 계정 에서 액세스 할 수 있습니다 adbd.

SELinux "케이지"라는 한 가지 설명 만 남았습니다.

그래서 adbd부팅 이미지의 시작 방법 을 확인 했습니다 init.rc.

# adbd is controlled via property triggers in init.<platform>.usb.rc
service adbd /sbin/adbd --root_seclabel=u:r:su:s0
    class core
    socket adbd stream 660 system system
    disabled
    seclabel u:r:adbd:s0

... 그리고 명백한 변화를 시도했습니다.

service adbd /sbin/adbd
    class core
    socket adbd stream 660 system system

나는 다시 포장했고, 나의 강한 만족으로 보았습니다 ...

linuxbox# adb shell
$ 

마침내 "내부"에서 태블릿에 액세스 할 수있었습니다.

비록 - 마운트 / 시스템 점검, 그것은 깜박이는 프로세스가 명확하게되었다 fastboot flash system ...실패했다 - 모두가 좋아라고보고 눈부시게 . 파티션이 처음에 마운트 된 것은 놀라운 일이었습니다.

태블릿이 부팅되지 않는 이유를 설명하고 문제를 해결 한 최종 아이디어를 알려주었습니다.

나는 그것이 / 시스템 파티션의 내 자연 그대로의 사본을 사용 그래서 태블릿 부팅에 필요한 있지만,이 시점에서, 나는 쉘 접근을했다하더라도, 나는 루트 아니었다 - ( 나는에서했던 변화는 default.prop분명히 아수스 커널에 의해 무시됩니다 - 조만간 다시 컴파일해야합니다 ... ) 외부 sdcard를 마운트 할 수 없으며 dd좋은 사본 위에 올려 놓을 수 없습니다 .

그러나 나는 내 자신의 부팅 이미지를 가지고 있었는데 /fstab.qcom내부를 편집하고 이것을 할 수 있음을 의미 했습니다.

태블릿에 / system을 마운트하는 방법을 알려주는 원래 라인

/dev/block/platform/msm_sdcc.1/by-name/system  /system  ext4 ro,barrier=1 wait

내 편집

/dev/block/mmcblk1p2  /system ext4  rw,barrier=1 wait

... 리눅스 박스로 돌아가서 dd태블릿 시스템 파티션을 외부 SD 카드의 두 번째 파티션에 gparted완전히 백업했습니다.이 파티션은 정확히 2GB입니다.

태블릿이 외부 SD 카드로 부팅되었습니다.

편집 : 여정은 계속되었다-나는 결국 내 자신의 커널을 패치하고 컴파일하여 루트가되었다 .


2
나는 에피소드 4로 맹세합니다.이 답변이 게시되지 않은 경우 현상금을 제공했을 것입니다.이 모든 에피소드에서 재미를 위해서. 스스로 문제를 해결 한 것을 확인하는 것이 좋습니다. : D
Firelord

2
@Firelord : 감사합니다. 그 과정에서, 나는 다소 멋진 일을했다고 생각합니다. 태블릿은 내부를 건드리지 않고 부팅했습니다 ... 부팅 이미지는 외부에서 (위 fastboot boot ...)와 /system파티션은 SD 카드에 있으며 원하는대로 조정할 수 있습니다. USB 스틱에서 PC 부팅하기 :-)
ttsiodras

4

문제에 대한 일종의 해결책을 이미 찾은 것 같습니다 (이 페이지에 읽을 텍스트가 많이 있습니다).이 문제는 훨씬 더 간단하게 해결 되었을 수 있습니다.

linuxbox# fastboot getvar all
(bootloader)  version-bootloader: 3.03
(bootloader)  version-hardware: rev_c
(bootloader)  variant: LEOPARDCAT 16G
(bootloader)  version-baseband: H00_0.16.F_0521
(bootloader)  serialno: 0a3dXXXX
...
(bootloader)  partition-type:system: ext4
(bootloader)  partition-size:system: 0x0000000080000000

이 변수들 중에서 태블릿이 변수를 반환 max-download-size했습니까? 그렇다면 깜박임 프로세스에 이러한 큰 이미지에 일부 문제가있을 수 있다는 경고가 표시되었을 수 있습니다. 현재의 빠른 부팅 코드는 max-download-size너무 작은 문제를 해결하기 위해 만들어 졌지만 장치가 처리 할 수있는 것보다 이미지가 작을 때도 동일한 오류가 발생했기 때문에 실제로는 그 점이 무섭습니다.

linux_box# fastboot flash system system.img  
error: cannot load 'system.img'

어쨌든, 어떤 이유로 든, 당신은 플래시 할 수없는 것 같습니다. 당신과 내가 맞고 크기가 대략이라면 (태블릿에는 1GB의 RAM 만 있고 대부분의 장치가 깜박이기 전에 전체 이미지를 RAM으로 읽으려고합니다. )이 -S옵션 을 추가하는 것의 단순한 조정이라고 생각합니다 빠른 부팅을 위해 플래시가 나를 위해 수정했을 수 있습니다.

fastboot -S 512M flash system system.img  

그러나 2GB 이미지를 (1) 채워 넣기가 불가능하고 (2) 장치의 시스템 파티션 크기가 아닌 크기로 강제로 시도한 것 같습니다.

  • 포인트 # 1과 관련하여, 내 경험상, 나는 당신이 그들에게 실패 할 것을 요구하면 불평하기 쉬운 취 약한 안드로이드 빌드 도구에 의존하지 않을 것이고, 그들이 여기 있을지도 모른다.

  • 포인트 # 2에 관해서는, 나는 당신이 그렇게 할 수 있다고 생각하지 않습니다. 다른 시스템 파티션 크기를 사용하려면 추가 단계가 필요합니다.

태블릿 예상하는 스파 스 이미지 파일을 가정 할 때, 나는 명령은 대신 원했고 생각 make_ext4fs -l 1536M new_system.img /system했다 make_ext4fs -l 2048M -s new_system.img /system. 조정 된 명령은 올바른 크기로 팽창하는 이미지를 만들지 만 빈 데이터의 큰 포켓과 같이 과도한 지방을 일시적으로 제거하여 저장합니다. " 스파 스 이미지 파일"(자세한 내용은 앞에서 링크 한 페이지 참조). 이 사이트에서 링크를 반복하기에 충분한 평판을 얻지 못했습니다).

이 오래된 추가 정보 는 프로세스 모음을 이해하는 데 도움 이되는 도구 모음을 위해 작성한 사람 입니다.

건배.


1
대답 해줘서 고마워. 귀하의 질문에 관해서는 (1) 아니오, max-download-의 결과에 아무것도 없었습니다 getvar. (2) -S장래의 번쩍임에 대한 옵션 을 명심하겠습니다 -부팅 한 후에는 (커널을 다시 컴파일하여 루트)되고 dd이전 시스템 파티션을 통해 루트가되었습니다. 다음 테스트를 기다려야합니다 (3) 스파 스 이미지로 시도했지만 동일한 결과를 얻었습니다 (즉 fastboot, 깜박임은 정상이지만 시스템 파티션이 엉망이되었다고보고했습니다).
ttsiodras

1
@ttsiodras 문제 없습니다. 그 과정에서 몇 가지를 배웠습니다. (1) 아, 알겠습니다. 적어도 내가 설치 한 fastboot 빌드를 사용하는 내 장치에서 그 변수가 목록에서 가장 먼저 인쇄 all된다는 것을 의심했습니다 (bvar, getvar에 전달할 수 있음 을 보여 주셔서 감사 합니다-도움이 됨). (2) 알았어. 작동하면 알려주십시오. (3) 으악! 나는 그것을 알아 차리지 못했다. 텍스트가 많습니다. 죄송합니다. 귀하의 게시물에 언급 되었습니까? (내가 제안한 make_ext4fs 명령 -s과 전체 2GiB 길이가 지정 되었습니까?) 태블릿 에서 스파 스 파일을 처리 하지 못할 수 있습니다.
naki

1
(3) 그래, 나는 -smake_ext4fs에 전달 했다-fastboot는 굽기에 대해 'OK'를보고했지만 / system이 엉망이되었습니다. 내 이론은, 당신이 말했듯이, 태블릿의 메모리 (1GB)보다 큰 것은 작동하지 않으며 -S제대로 작동하려면 fastboot 의 옵션이 필요했습니다 (반 고장 상태를 설명합니다-첫 번째 부분 때문에 파티션이 마운트되었습니다) 이미지를 메모리에 맞추고 실제로 구워서 마운트 할 수있게했지만 내부 파일은 섹터의 레코딩 여부에 따라 임의로 손상되었습니다.)
ttsiodras

2

내 Moto GI는 당신처럼 dd를 사용하여 백업을 만들었습니다. 다른 날 시스템 파티션을 복원해야했기 때문에 TWRP를 부팅했습니다 (플래시하지 않았으며 이미지를 RAM으로 부팅했습니다). 그런 다음 TWRP가 실행되는 동안 adb를 사용하여 연결하고 방금 dd로 만든 img를 SD 카드에 넣은 다음 dd를 사용하여 이미지를 시스템 파티션에 썼습니다.

여기에 내가 만든 비디오를 확인하십시오 : https://youtu.be/BHCamV-sHx0?list=PLcUid3OP_4OVI1Rtuwxk1RjABh1PxXXQq


불행히도 그것은 도움이되지 않습니다-시도한 키 조합에 관계없이 태블릿의 복구에 도달 할 수 없습니다 (반대로, MotoG2에서 즉시 얻었습니다-그래서이 태블릿의 복구는 어떻게 든 호스가됩니다). 복구 파티션을 플래시 할 수 있지만 (flashboot가 작동하기 때문에) recovery.imgAsus가 없으며 CWM 또는 TWRP가 없습니다 (ME103K의 경우).
ttsiodras
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.