Anh chàng UNIX lâu năm ở đây, nhưng tương đối mới với thế giới Android. Đọc tiếp.
EPISODE 1: Sao lưu mới (tôi hy vọng)
Gần đây tôi đã mua một chiếc Asus MemPAD (ME103K); Sau đó tôi đã trở thành root và lấy một dd
hình ảnh của system
phân vùng chỉ đọc vào thẻ SD bên ngoài:
$ 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
Kích thước (chính xác là 2GiB) hơi đáng ngờ - có thể đó là do phân vùng FAT32 trên thẻ SD?
Không, không phải - tune2fs -l
tiết lộ rằng đây thực sự là một hình ảnh EXT4 hợp lệ, có kích thước chính xác ở mức 2GiB, fsck -f
không có lỗi nào cả. Và fastboot
(từ máy linux được gắn vào máy tính bảng) đồng tình, sau một 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
Kích thước đó, thực sự là 2GB:
linuxbox# python2 -c 'print 0x0000000080000000'
2147483648
Vì vậy, tất cả đều tốt - tôi có một bản sao lưu của hình ảnh. Bây giờ để kiểm tra khôi phục nó.
Tôi cố gắng flash system.img trở lại máy tính bảng - để đảm bảo tôi có thể khôi phục từ mọi thứ, loại sao lưu chống đạn mà chúng tôi thực hiện trong thế giới Unix ( ví dụ: khôi phục nội dung của ổ đĩa thông quadd if=backup.image of=/dev/sdXXX
).
Mọi thứ liên quan adb
và fastboot
hoạt động hoàn hảo - vì vậy tôi cố gắng ...
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'
Hừm. Tôi tải xuống và xây dựng bản android-tools-5.1.1
phân phối của mình từ các nguồn, thêm thông tin gỡ lỗi - và bước vào trình gỡ lỗi, để thấy lỗi này:
linuxbox# gdb --args fastboot flash system system.img
...
Thú vị - mặc dù tôi đang ở trong một máy 64 bit, nhưng rõ ràng có những vấn đề biến kích thước tệp thành "âm tính" (trong thế giới 32 bit, kích thước tệp của hình ảnh của tôi, 2 ^ 31, thực sự được coi là âm tính - chính xác là , -2147483648
.
OK, tốt - làm thế nào để họ flash các tệp hình ảnh lớn trong Android?
Googling, tìm kiếm - hóa ra họ sử dụng make_ext4fs
công cụ này , tạo ra hình ảnh có thể flash. Trong thực tế, nó là một phần của những gì tôi vừa biên soạn, vì vậy tôi cũng có thể sử dụng nó:
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
Thật tuyệt - vì vậy tôi rõ ràng có thể xây dựng hình ảnh hệ thống từ các thư mục cũ đơn giản. Bầu trời sẽ là giới hạn của tôi - Tôi sẽ có thể thêm bất cứ điều gì tôi muốn vào hình ảnh này.
Hãy đốt nó ...
linuxbox# fastboot flash system new_system.img
erasing 'system'...
OKAY [ 0.064s]
sending 'system' (2088960 KB)...
^C
Tôi đã đợi 1h trước khi nhấn Ctrl-C đó. Và phải quay vòng máy tính bảng, khởi động lại ở chế độ fastboot.
Điều này là không tốt.
Nếu tôi xây dựng một hình ảnh nhỏ hơn thì sao? Có thể 2GB bằng cách nào đó là một vấn đề và phân vùng này không được sử dụng hết công suất - nó có dung lượng trống:
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
OK, điều này có vẻ rất hứa hẹn (và chỉ mất 5 phút). Tôi đoán bây giờ tôi có thể khởi động lại và mọi thứ sẽ bình thường, đúng không?
Không :-)
Tôi không quan tâm một thiết bị tạm thời đóng viên gạch, miễn là tôi làm được để kiểm soát nó cuối cùng (máy mà tôi không phải là một bậc thầy về, là những cỗ máy Tôi không quan tâm đến hoạt động ;-)
Bất kỳ ý tưởng về những gì tôi đã làm sai và những gì tôi có thể làm để khắc phục điều này?
Cảm ơn trước.
PS Tôi đã kiểm tra trang hỗ trợ Asus cho máy tính bảng của mình - họ chỉ cung cấp nguồn cho kernel và tệp .zip qua mạng. Đến lượt nó chứa một bản sao lưu cấp hệ thống tệp từ system
thư mục gốc - tức là thư mục tồn tại trong đó dưới dạng thư mục, không phải hình ảnh, không phải là system.img
thứ tôi có thể flash - vì vậy nó không thực sự giúp tôi.
EPISODE 2: Tấn công của giày tùy chỉnh
Trong sự vắng mặt của bất kỳ loại nào recovery.img
từ Asus (tại sao một nhà sản xuất lại bận tâm xuất bản một flashboot-flashable recovery.img
? Tại sao thực sự ...) và sự vắng mặt tương tự trên các hình ảnh khôi phục từ các trang CWM và TWRP ... Tôi còn lại để chiến đấu với tất cả một mình.
Rất may, tập tin cập nhật qua mạng của Asus bao gồm bên trong nó ...
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
... hình ảnh khởi động máy tính bảng của tôi. Bây giờ có lẽ - chỉ có thể - tôi có thể làm một cái gì đó với điều này.
linuxbox$ mkdir rootfs
linuxbox$ cd rootfs
linuxbox$ abootimg -x /path/to/boot.img
linuxbox$ ls -l
bootimg.cfg
initrd.img
zImage
Mở rộng ramdisk ...
linuxbox$ mkdir initrd
linuxbox$ cd initrd
linuxbox$ gzip -cd ../initrd.img | cpio -ivd
...
linuxbox$ vi default.prop
Tôi thiết lập default.prop
để được root khi kernel khởi động:
ro.secure=0
ro.debuggable=1
ro.adb.secure=0
androidboot.selinux=disabled
Tôi cũng đã sao chép /system/bin/sh
( từ tệp Asus .zip qua mạng ) vào /sbin/sh
. Tôi đã làm tương tự với busybox - công cụ khá tiện dụng.
Và đóng gói lại 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
thực sự đã thất bại trong lần đầu tiên tôi chạy cái này, vì bootimg.cfg
phải cập nhật - bootsize
tham số phải được thay đổi, vì gói lớn hơn bây giờ. abootimg
báo cáo những gì nó cần, vì vậy đó là đủ dễ dàng.
Và bây giờ, tôi khởi động hình ảnh tùy chỉnh của mình ...
linuxbox# fastboot boot new_boot_busybox.img
... và chứng kiến những điều sau đây ...
linuxbox# adb logcat
- exec '/system/bin/sh' failed: Permission denied (13) -
linuxbox# adb shell
- exec '/system/bin/sh' failed: Permission denied (13) -
Hmm ... Có lẽ adbd không chạy bằng root?
linuxbox# adb root
restarting adbd as root
linuxbox# adb shell
- exec '/system/bin/sh' failed: Permission denied (13) -
Tốt ... Tôi hexedit adbd và patch / system / bin / sh thành / sbin / sh (Tôi đã sao chép / system / bin / sh từ hình ảnh OTA sang rootfs của initrd): Khởi động lại, fastboot ...
linuxbox# adb shell
- exec '/sbin/sh' failed: Permission denied (13) -
Chết tiệt. Là điều này có thể làm bất cứ điều gì?
linuxbox# adb pull /proc/partitions
15 KB/s (1272 bytes in 0.079s)
Đó là ... chúng ta hãy xem:
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
OK, vì vậy / hệ thống được gắn kết. Tôi có thể nhìn thấy những gì bên trong không?
linuxbox# adb pull /system
remote object '/system' does not exist
Cái gì ... Có lẽ tôi có thể kiểm tra những gì / Proc / kmsg chứa (những gì "dmesg" sẽ xuất ra)
linuxbox# adb pull /proc/kmsg
failed to copy '/proc/kmsg' to './kmsg': Operation not permitted
Không, tôi cần phải root để làm điều đó.
linuxbox# adb push /sbin/sh /system/bin/sh
failed to copy '/sbin/sh' to '/system/bin/sh': Permission denied
Và điều đó, quá.
Đây hóa ra là một câu đố ...
fastboot
vẫn hoạt động (đáp ứng yêu cầu tốt) và do đó tôi có thể ghi bất kỳ hình ảnh khôi phục nào, (a) Tôi đã tìm kiếm và không tìm thấy hình ảnh khôi phục CWM hoặc TWRP cho ME103K - Tôi không cho rằng có một cái "chung chung" mà bạn đang đề cập đến, phải không? (b) Tắt nguồn, nhấn nút nguồn + giảm âm lượng sẽ không hiển thị hình ảnh khôi phục - Tôi vẫn chỉ chuyển sang trạng thái fastboot. Mo nghĩ tại sao. Trong thực tế, tôi chưa bao giờ thấy quá trình phục hồi (hơi tò mò muốn xem nó) ...
fastboot boot <FILE>.img
), sau đó flash toàn bộ tệp ZIP stock. Ngoài ra, hãy xem nếu có (trên web) các tệp ROM stock có thể được flash bằng fastboot.
unzip -l UL-K01E-WW-12.16.1.12-user.zip | grep recovery
chỉ hiển thị một vài tập lệnh shell - tôi sẽ xem, nhưng chắc chắn không recovery.img
có ở đó). Googling cũng không giúp được gì - không có hình ảnh khôi phục của máy tính bảng này ở bất cứ đâu ... Đoán xem tôi sẽ phải chờ một linh hồn tốt bụng nào đó để dd
phân vùng phục hồi và chia sẻ?