Немного о структуре разделов в Андроиде

Jun 08, 2011 00:03

Мои недавние эксперименты с созданием своей прошивки на базе Андроида оказались не только приятными, но полезными во многих аспектах. Одним из таких аспектов было очень неплохое ознакомление с большинством модулей Андроида - от ядра до включенных приложений. Я намного лучше стал понимать, как работает ОС, как она общается с железом, из каких частей она состоит, что нужно сделать, чтобы портировать ее на свое устройство и т.д. и т.п. Ну и заодно почувствовал уважение к тем, кто пишет мобильные (и не только мобильные) платформы - это дело очень непростое, требует незаурядных могов. Тем, кто несогласен и уверен, что "он знает как", очень рекомендую написать хотя бы графический движок, можно без UI, а потом понять, что это была даже не двадцатая часть операционки. Или GPS стек (я, кстати, написал). Ну да ладно, оставим философию и перейдем к делу.


Подключаем Андроид телефон к компьютеру и набираем в командной строке "adb shell mount". Вы не знаете, что это такое? Очень просто - adb это Android Debug Bridge, утилитка, которая позволяет вам "общаться" с вашим телефоном с компьютера. Через нее можно набирать команды. Например, shell, который даст вам... правильно, шелл на телефоне. А если вам нужно набрать только одну команду, вы можете ее просто добавить, и она будет выполнена без вхождения в шелл на телефоне. Команда mount - это стандартная *никсовская команда, которая показывает подключенные устройства хранения информации и к каким директориям они "подключены".

Вот, что мы получим, если наберем эту команду на HTC Thunderbolt:

rootfs / rootfs ro,relatime 0 0
tmpfs /dev tmpfs rw,relatime,mode=755 0 0
devpts /dev/pts devpts rw,relatime,mode=600 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
/dev/block/mmcblk0p25 /system ext3 ro,relatime,errors=continue,data=ordered 0 0
/dev/block/mmcblk0p26 /data ext3 rw,nosuid,nodev,relatime,errors=continue,data=ordered 0 0
/dev/block/mmcblk0p27 /cache ext3 rw,nosuid,nodev,relatime,errors=continue,data=ordered 0 0
/dev/block/mmcblk0p29 /devlog ext3 rw,nosuid,nodev,relatime,errors=continue,data=ordered 0 0
none /acct cgroup rw,relatime,cpuacct 0 0
tmpfs /mnt/asec tmpfs rw,relatime,mode=755,gid=1000 0 0
tmpfs /app-cache tmpfs rw,relatime,size=8192k,mode=755,gid=1000 0 0
none /dev/cpuctl cgroup rw,relatime,cpu 0 0
htcfs /data/htcfs fuse.htcfs rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other 0 0

А вот, что мы получим, если наберем ее на Samsung Nexus S с установленным на нем CyanogenMod 7:

rootfs on / type rootfs (ro,relatime)
tmpfs on /dev type tmpfs (rw,relatime,mode=755)
devpts on /dev/pts type devpts (rw,relatime,mode=600)
proc on /proc type proc (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
none on /acct type cgroup (rw,relatime,cpuacct)
tmpfs on /mnt/asec type tmpfs (rw,relatime,mode=755,gid=1000)
tmpfs on /mnt/obb type tmpfs (rw,relatime,mode=755,gid=1000)
none on /dev/cpuctl type cgroup (rw,relatime,cpu)
/dev/block/mtdblock4 on /cache type yaffs2 (rw,nosuid,nodev,relatime)
/dev/block/mtdblock6 on /efs type yaffs2 (rw,nosuid,nodev,relatime)
/dev/block/platform/s3c-sdhci.0/by-name/system on /system type ext4 (ro,relatime,barrier=1,data=ordered)
/dev/block/platform/s3c-sdhci.0/by-name/userdata on /data type ext4 (rw,nosuid,nodev,noatime,barrier=1,data=ordered,noauto_da_alloc)
/sys/kernel/debug on /sys/kernel/debug type debugfs (rw,relatime)
/dev/block/vold/179:3 on /mnt/sdcard type vfat (rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro)
/dev/block/vold/179:3 on /mnt/secure/asec type vfat (rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro)
tmpfs on /mnt/sdcard/.android_secure type tmpfs (ro,relatime,size=0k,mode=000)
/dev/block/dm-0 on /mnt/asec/com.rovio.angrybirds-1 type vfat (ro,dirsync,nosuid,nodev,relatime,uid=1000,fmask=0222,dmask=0222,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro)
/dev/block/dm-1 on /mnt/asec/com.rovio.angrybirdsseasons-1 type vfat (ro,dirsync,nosuid,nodev,relatime,uid=1000,fmask=0222,dmask=0222,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro)

Первым идет так называемое "блок устройство" (block device). Для простоты можно считать, что это физическое устройство. На самом деле, оно необязательно должно быть физическим. Это просто устройство хранения, обмен данными с которым идет кусками (блоками) определенного размера.

Вторым идет директория, к которой это устройство "подключено" или "подмаунчено". То есть для вас это устройство будет просто директорией. Например, если вы наберете cd /sdcard, вы окажетесь в корне SD карточки. Причем к одному блочному устройству можно подмаунтить несколько директорий (прямо как логические диски на физическом). Кому интересно - одну директорию можно использовать для подключения нескольких устройств, но это сложнее делать (это делается через fuse, и это отдельный разговор).

Третьим идет тип файловой системы. Тут вы обычно увидите линуксовскую ext3/ext4, vfat (для SD карточки), yaffs (о ней отдельный разговор). На некоторых Самсунговских устройствах будет rfs, это самсунговская файловая система.

Дальше идут опции, с которыми подмаунчен конкретный девайс. О них тоже попозже.

Из вышеперечисленных маунтов нам интересны /system, /cache и /data. Ну и, наверное, еще и /sdcard. Если интересно что-то из остального - спрашивайте, отвечу как знаю.

/system - это платформа Андроида. Туда входят все фреймворки, все системные библиотеки, настройки, предустановленные приложения, шрифты, системные утилиты.

/cache - думаю, что по названию понятно, что там. :)

/data - тут живут пользовательские данные. Приложения, которые вы установили, их базы данных, их библиотеки, их файлы. Там же ваши личные настройки системы. Каждому приложению выделяется свой username, которому (и только которому) даются права на частную директорию приложения.

Такое разделение места дает несколько преимуществ:

- Четкое разделение между системными и пользовательскими данными. Можно спокойно переформатировать /system и прошить туда новую версию ОС, и при этом ползовательские данные на /data останутся нетронутыми. (Кстати, при завершении компиляции Андроида вы получаете несколько .img файлов, один из которых и есть образ для /system.) Или переформатировать /data, вернув систему к первозданному состоянию "из коробки". (Кстати, это именно так и делается.)

- Разделение доступа. Посмотрите на опции маунта, и вы увидите, что у /data одна из них - rw, а у /system - ro. Догадались, что это означает? rw = read-write, ro - read-only. По умолчанию, пользователю не дается доступ к системным файлам. И это совершенно разумно, ни один производитель вам не даст доступ к системным файлам, вы должны знать, что вы делаете, чтобы его заслужить. Чтобы его получить, нужен рут, а пользоваться им умеют не все, и не всем он нужен.

"А зачем раздельные партиции?" - спросите вы (особенно если вы немного знакомы с Линуксом) - "ведь можно же было просто директории сделать?". Можно, конечно, но тогда у вас может появиться дополнительная головная боль:

- Пользователь может загадить все свободное пространство своими файлами, а когда вам надо будет прошивать новую версию, вам может не хватить места на нужный файл. А если у вас отдельная партиция для системных файлов, место вам гарантированно, и вы всегда знаете сколько.

- Вам может понадобиться разместить партиции на разных физических устройствах. А для этого приходится их форматировать под разные файловые системы. Еще раз сравните результаты команды mount, приведенные выше. Обратите внимание на /cache. Заметили, что в одном случае она ext3, а в другом - yaffs? Это потому, что они расположены на разных типах памяти. В случае ext3 - на встроенной SD карточке, а в случае yaffs - на другом типе флэш памяти, которая называется oneNAND. Второй вид памяти намного быстрее, надежнее и, соответственно, дороже. Ставить 16 Гб такой памяти в телефон экономически невыгодно, поэтому производители ставят ее немного и размещают на ней то, что хорошо бы ускорить - /cache, /system и т.п.

- Использование разных разделов дает вам возможность выборочно защищать данные на них шифрованием, используя очень удобную утилиту dmcrypt. Например, /system шифровать глупо, а вот /data вполне имеет смысл. Да, можно использовать файловое шифрование (про eryptfs я тоже знаю), но, поверьте мне, dmcrypt - куда более элегантное решение. Но это тема для отдельного разговора.

android

Previous post Next post
Up