Карта Linux SD, предоставляемая с платами Sitara AMx EVM, может быть повторно создана с помощью Sitara Linux SDK. Здесь описывается процесс создания карты SD, которая может быть загружена всем необходимым для запуска системы Linux на Sitara EVM. ВАЖНОЕ ЗАМЕЧАНИЕ: внимательно прочитайте эту инструкцию и поймите её указания перед тем, как запускать любой из описанных здесь скриптов.
[Сколько потребуется разделов на карте SD]
AM35x EVM или AM37 EVM. Эти EVM используют 3 раздела. На карте будет маленький (примерно 70 мегабайт) загружаемый DOS-раздел для бинарников системы (x-loader, u-boot, uImage), и раздел ext3 (приблизительно 1 гигабайт) для корневой файловой системы (Linux root file system), и еще один раздел ext3 для исполняемого файла инсталлятора Linux и исходного кода SDK. Третий раздел займет все оставшееся пространство карты SD поэтому если у карты объем 2 гигабайта, то третий раздел получит размер около 1 гигабайта. Соответственно если карта размером 4 гигабайта, то третий раздел будет размером около 3 гигабайт.
Имя раздела |
Тип |
Система |
Содержимое |
Boot |
FAT32 |
Windows/Linux |
Демонстрационная страничка; windows_user.htm |
File System |
EXT3 |
Linux |
Корневая файловая система |
START_HERE |
EXT3 |
Linux |
Инсталлятор SDK; setup.htm |
AM180x EVM или AM1810 EVM. Эти EVM используют 2 раздела. Здесь находится альтернативный скрипт, который создаст на карте 2 раздела, только раздел загрузки и раздел файловой системы. Эти разделы - все что нужно для для загрузки системы с карты SD. Третий раздел опционален.
ВНИМАНИЕ: этот процесс запускает форматирование и создание разделов на носителе. Пользователю следует тщательно проверить имена устройств, передаваемых скрипту, используемому в этом процессе. Иначе есть возможность отформатировать и уничтожить файловую систему хоста, где происходит форматирование.
Предполагаемое оборудование:
• Машина хоста Linux с доступными портами USB для подключения карт-ридера SD (также подойдет виртуальная машина).
• Карт-ридер USB.
• Карта SD (рекомендуемый размер как минимум 4 гигабайта).
Необходимое ПО:
• Системные бинарники Linux (x-loader, u-boot, uImage).
• Корневая файловая система (Linux embedded system root filesystem).
[Как создать на SD-карте 3 раздела]
Следующие процедуры относятся к процессорам TI Sitara: AM35x и AM37x.
1. Подготовка скрипта. Создайте файл на хосте Linux с именем mk3PartSDCard. Скопируйте в него содержимое показанного ниже скрипта, и сохраните файл. Этот скрипт создает 3 раздела, далее будет также описан скрипт, создающий 2 раздела.
#! /bin/sh
# mk3PartSDCard.sh v0.3
# Licensed under terms of GPLv2
DRIVE=$1
dd if=/dev/zero of=$DRIVE bs=1024 count=1024
SIZE=`fdisk -l $DRIVE | grep Disk | awk '{print $5}'`
echo DISK SIZE - $SIZE bytes
CYLINDERS=`echo $SIZE/255/63/512 | bc`
sfdisk -D -H 255 -S 63 -C $CYLINDERS $DRIVE << EOF
,9,0x0C,*
10,115,,-
126,,,-
EOF
mkfs.vfat -F 32 -n "boot" ${DRIVE}1
umount ${DRIVE}1
mkfs.ext3 -L "rootfs" ${DRIVE}2
umount ${DRIVE}2
mkfs.ext3 -L "START_HERE" ${DRIVE}3
Этот скрипт требует для запуска один входной параметр, который должен обозначать устройство носителя, установленное в карт-ридер USB. ВАЖНОЕ ЗАМЕЧАНИЕ: не запускайте этот скрипт, если не уверены полностью, что корректно ввели в параметре имя устройства. Если Вы случайно укажете устройство жесткого диска машины хоста, то его содержимое будет уничтожено. Далее будет показано, как правильно определить имя устройства, соответствующее подключенной в ридер карте SD, и как определить имя системного жесткого диска хоста.
Как правильно определить нужное имя устройства. Как уже было сказано, скрипту нужно передать один параметр, обозначающий целевой форматируемый носитель. Этот параметр должен однозначно указывать на устройство, используемое для подключения к карт-ридеру USB SD. Для этой цели можно использовать команду df -hT, см. пример ниже.
user@UbuntuVbox1004:~$ df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda1 ext4 19G 16G 2.5G 87% /
none devtmpfs 245M 308K 245M 1% /dev
none tmpfs 249M 192K 249M 1% /dev/shm
none tmpfs 249M 340K 249M 1% /var/run
none tmpfs 249M 0 249M 0% /var/lock
none tmpfs 249M 0 249M 0% /lib/init/rw
/dev/sdb1 vfat 1.9G 4.0K 1.9G 1% /media/00F8-E7F0
user@UbuntuVbox1004:~$
Показанный выше пример показывает результат выполнения команды df на системе Linux, к которой подключен USB карт-ридер, в котором установлена карта SD. Карт-ридер соответствует устройству /dev/sdb1. Карта SD, установленная в карт-ридер, имеет размер 2 гигабайта, и отформатирована как один стандартный раздел Windows FAT. Это обычное состояние для карты SD, купленной в магазине. Важно отметить, что раздел хоста Linux, где запускаются команды (смонтированный на /) соответствует устройств /dev/sda1. Имя /dev/sda показывает, что машина хоста имеет диск SATA. Если бы машина имела более старый диск IDE, то устройство получило бы имя /dev/hda.
Теперь мы четко знаем, что скрипту следует передать имя /dev/sdb, ни в коем случае не /dev/sda. Передача скрипту устройства, связанного с жестким диском машины хоста, попросту разрушит операционную систему Linux на хосте.
И еще несколько замечаний. Другие системы могут иметь аппаратуру, размещенную в других устройствах системы. Некоторые системы могут иметь несколько карт-ридеров. Так что один карт-ридер может называться /dev/sdb и другой /dev/sdc. Также может быть, что хост смонтировал жесткий диск IDE на устройстве /dev/hda, и имеет карт-ридер USB SD на имени /dev/sda. В этом случае будет правильным передать скрипту имя /dev/sdat. В любом случае пользователь должен правильно определить, что передавать в параметре скрипта.
2. Сделайте скрипт запускаемым:
user@UbuntuVbox1004:~$ chmod 755 mk3PartSDCard
3. Запуск скрипта. После того, как Вы правильно определили имя устройства, которое нужно передать скрипту, необходимо размонтировать любую директорию, которая смонтирована на этом устройстве. В примере запуска команды df, показанном выше, на устройство /dev/sdb1 смонтирована директория /media/disk. Для размонтирования выполните следующую команду:
user@Ubuntu1004:~$ umount /dev/sdb1
Скрипт должен быть запущен с правами суперпользователя. В Ubuntu это осуществляется через команду "sudo". Когда sudo запросит пароль, используйте пароль пользователя root.
user@Ubuntu1004:~$ sudo ./mk3PartSDCard /dev/sdb
Успешное выполнение скрипта в покажет в терминале вывод, подобный показанному ниже. Ошибка, которую может выдать sfdisk (что и показано ниже) может быть безопасно проигнорирована.
user@UbuntuVbox1004:~$ sudo ./mk3PartSD /dev/sdb
[sudo] password for user:
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB) copied, 1.53109 s, 685 kB/s
Disk /dev/sdb doesn't contain a valid partition table
DISK SIZE - 1977614336 bytes
Checking that no-one is using this disk right now ...
OK
Disk /dev/sdb: 240 cylinders, 255 heads, 63 sectors/track
sfdisk: ERROR: sector 0 does not have an msdos signature
/dev/sdb: unrecognized partition table type
Old situation:
No partitions found
New situation:
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0
Device Boot Start End #cyls #blocks Id System
/dev/sdb1 * 0+ 8 9- 72261 c W95 FAT32 (LBA)
/dev/sdb2 10 124 115 923737+ 83 Linux
/dev/sdb3 126 239 114 915705 83 Linux
/dev/sdb4 0 - 0 0 0 Empty
Successfully wrote the new partition table
Re-reading the partition table ...
If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes: dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)
mkfs.vfat 3.0.7 (24 Dec 2009)
umount: /dev/sdb1: not mounted
mke2fs 1.41.11 (14-Mar-2010)
Filesystem label=rootfs
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
57856 inodes, 230934 blocks
11546 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=239075328
8 block groups
32768 blocks per group, 32768 fragments per group
7232 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 20 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
umount: /dev/sdb2: not mounted
mke2fs 1.41.11 (14-Mar-2010)
Filesystem label=START_HERE
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
57232 inodes, 228926 blocks
11446 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=234881024
7 block groups
32768 blocks per group, 32768 fragments per group
8176 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 27 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
Скрипт будет работать до тех пор, пока в терминале снова не покажется приглашение ввода команды Linux. На этой точке нужно размонтировать все на устройстве /dev/sdb:
user@Ubuntu1004:~$ umount /dev/sdb1
user@Ubuntu1004:~$ umount /dev/sdb2
user@Ubuntu1004:~$ umount /dev/sdb3
Теперь физически извлеките карту SD из карт-ридера USB, и снова установите её. Ubuntu автоматически смонтирует на ней новые разделы. Запуск команды df -hT должен показать следующее:
user@Ubuntu1004:~$ df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda1 ext4 19G 16G 2.5G 87% /
none devtmpfs 245M 360K 245M 1% /dev
none tmpfs 249M 252K 249M 1% /dev/shm
none tmpfs 249M 340K 249M 1% /var/run
none tmpfs 249M 0 249M 0% /var/lock
none tmpfs 249M 0 249M 0% /lib/init/rw
/dev/sdb1 vfat 70M 512 70M 1% /media/boot
/dev/sdb2 ext3 888M 18M 826M 3% /media/rootfs
/dev/sdb3 ext3 881M 17M 819M 3% /media/START_HERE
user@Ubuntu1004:~$
Загрузочный раздел на карте SD (vfat, смонтированный сейчас как /media/boot) по минимуму должен содержать x-loader в файле MLO, файлы u-boot.bin и uImage. Раздел rootfs это корневая файловая файловая система для embedded Linux.
[Как создать на SD-карте 2 раздела]
Следующие процедуры относятся к процессорам TI Sitara: AM180x и AM1810.
Карта SD с двумя разделами может быть создана незначительно модифицированным скриптом, который использовался для создания карты SD с тремя разделами. Сохраните скрипт, описанный ранее, в файл с именем mk2PartSDCard. Используйте для него те же предохранительные процедуры. ВНИМАНИЕ: этот скрипт также опасен при неправильном использовании!
#! /bin/sh
# mk2PartSDCard.sh v0.1
# Licensed under terms of GPLv2
DRIVE=$1
dd if=/dev/zero of=$DRIVE bs=1024 count=1024
SIZE=`fdisk -l $DRIVE | grep Disk | awk '{print $5}'`
echo DISK SIZE - $SIZE bytes
CYLINDERS=`echo $SIZE/255/63/512 | bc`
sfdisk -D -H 255 -S 63 -C $CYLINDERS $DRIVE << EOF
,9,0x0C,*
10,114,,,
EOF
mkfs.vfat -F 32 -n "boot" ${DRIVE}1
umount ${DRIVE}1
mkfs.ext3 -L "rootfs" ${DRIVE}2
После использования этого скрипта на карте SD будет создан раздел с именем "boot" и размером 70M. Второй раздел будет разделом Linux ext3, у него будет имя "rootfs", и он займет все оставшееся пространство карты. Этот скрипт очень хорошо работает с картами на 2 гигабайта.
[Копирование на карту системных файлов]
Настало время скопировать на карту SD загрузчики, ядро Linux и другие необходимые файлы. Готовые собранные системные файлы включены в Sitara SDK. Для AM35x/37x EVM файлы загрузчика и образа ядра могут быть размещены в загрузочном разделе карты SD. Для AM18x/181x EVM на карту SD нужно записать только образ ядра, потому что эти платы EVM должны иметь загрузчик (u-boot), записанный в SPI flash. Файлы загрузчика и ядра обычно находятся в подкаталоге установки SDK с именем psp/prebuilt-images. Корневая файловая система присутствует в tarball, находящемся в поддиректории инсталляции SDK с именем filesystem. Пример ниже показывает эти места на диске для AM37x SDK.
user@UbuntuVbox1004:~/ti-sdk-am37x-evm-4.0.1.0/filesystem$ ls -l
total 10504
-rw-r--r-- 1 user user 10751480 2011-01-26 09:13 base-rootfs-am37x-evm.tar.gz
drwxr-xr-x 18 user user 4096 2011-02-07 14:40 SDK_NFS
user@UbuntuVbox1004:~/ti-sdk-am37x-evm-4.0.1.0/filesystem$ cd ..
user@UbuntuVbox1004:~/ti-sdk-am37x-evm-4.0.1.0$ cd psp/prebuilt-images/
user@UbuntuVbox1004:~/ti-sdk-am37x-evm-4.0.1.0/psp/prebuilt-images$ ls -l
total 51168
lrwxrwxrwx 1 user user 40 2011-02-11 16:09 MLO -> MLO-am37x-evm-1.46-psp03.00.01.06.sdk-r0
-rwxr-xr-x 1 user user 20060 2011-01-22 09:30 MLO-am37x-evm-1.46-psp03.00.01.06.sdk-r0
-rwxr-xr-x 1 user user 216572 2011-01-22 09:30 u-boot-am37x-evm-2009.11-psp03.00.01.06.sdk-r0.bin
lrwxrwxrwx 1 user user 50 2011-02-11 16:09 u-boot.bin -> u-boot-am37x-evm-2009.11-psp03.00.01.06.sdk-r0.bin
lrwxrwxrwx 1 user user 13 2011-02-11 16:09 uImage -> uImage-2.6.32
-rw-r--r-- 1 user user 2409528 2011-01-25 17:12 uImage-2.6.32
-rw-r--r-- 1 user user 49743774 2011-01-25 17:12 vmlinux-2.6.32
user@UbuntuVbox1004:~/ti-sdk-am37x-evm-4.0.1.0/psp/prebuilt-images$
Для AM18x/AM181x EVM плата всегда запускает u-boot из SPI flash. Как записать u-boot в SPI flash показано в статье [6].
Для AM35x/37x EVM файлами загрузчика являются MLO и u-boot.bin. Эти два файла должны быть скопированы в загрузочный раздел карты SD.
Для всех EVM образом ядра служит файл uImage. Этот файл нужно записать в загрузочный раздел карты SD.
Корневая файловая система должна быть записана в раздел rootfs карты SD. Tarball, содержащий корневую файловую систему, доступен в директории filesystem установленного SDK. Здесь может быть два разных tarball-а. Пример ниже показывает, что AM181x SDK содержит два tarball-а с корневой файловой системой. Один имеет в имени префикс tisdk- и относится к файловой системе, поставляемой с retail EVM, и там полная система с Matrix GUI и все приложения примеров. Другой tarball это "базовая" файловая система без дополнительных, она может использоваться для как основа произвольных конфигураций Linux.
user@UbuntuVbox1004:~/ti-sdk-am181x-evm-4.0.1.0/filesystem$ ls -l
total 75264
-rw-r--r-- 1 user user 11055454 2011-01-26 10:44 base-rootfs-am181x-evm.tar.gz
-rw-r--r-- 1 user user 66010750 2011-01-26 10:44 tisdk-rootfs-am181x-evm.tar.gz
user@UbuntuVbox1004:~/ti-sdk-am181x-evm-4.0.1.0/filesystem$
Необходимо распаковать (un-tar) одну из этих файловых систем в раздел rootfs карты SD. Простое копирование и метод "drag-and-drop" на существующей файловой системе не сработают. Причина в том, что команда tar, использовавшаяся для создания tarball в SDK, имеет сохраненные полномочия, мягкие ссылки и узды device/file, которые важны в файловой системе. Также эти tarball-ы не создадут новую поддиректорию. Они разработаны для распаковки в раздел rootfs карты SD. Имейте в виду: необходимо использовать команду sudo, когда делаете распаковку tar-пакета файловой системы, чтобы дерево файлов устройств было создано корректно.
Самый лучший способ распаковать tar - сначала поменять текущую директорию на /media/rootfs (или на ту директорию, куда смонтирована карта в системе хоста). Затем нужно запустить команду tar, которая распакует tarball в текущую директорию. И наконец, что может быть самым важным, - нужно запустить команду sync некоторое количество раз после того, как корневая файловая система была распакована tar на карту SD. Это обеспечит гарантию, что все данные из буферов кеширования будут сброшены на физический носитель SD (flush data) и корректно записаны. См. пример ниже.
user@UbuntuVbox1004:~/ti-sdk-am181x-evm-4.0.1.0/filesystem$ cd /media/rootfs
user@UbuntuVbox1004:/media/rootfs$ sudo tar -xzvf
~/ti-sdk-am181x-evm-4.0.1.0/filesystem/tisdk-rootfs-am181x-evm.tar.gz
...
... тут будут еще сообщения, если был использован ключ -v в команде tar
...
user@UbuntuVbox1004:/media/rootfs$ sync
user@UbuntuVbox1004:/media/rootfs$ sync
И конечно же, можно поместить все это в скрипт, что может быть полезно для создания более одной карты SD. Пример ниже показывает скрипт, который копирует системные файлы для AM37x SDK. Перед запуском этого скрипта следует правильно отредактировать в нем все пути. Вот этот скрипт:
#! /bin/sh
# cpSDCard v0.1
export PATH_TO_SDK=
export PATH_TO_SDBOOT=
export PATH_TO_SDROOTFS=
cp $PATH_TO_SDK/psp/prebuilt-images/MLO $PATH_TO_SDBOOT
cp $PATH_TO_SDK/psp/prebuilt-images/u-boot.bin $PATH_TO_SDBOOT
cp $PATH_TO_SDK/psp/prebuilt-images/uImage $PATH_TO_SDBOOT
cd $PATH_TO_SDROOTFS
tar -xzvf $PATH_TO_SDK/filesystem/tisdk-rootfs-am37x-evm.tar.gz
sync
sync
Убедитесь, что поменяли export PATH_TO_SDK... на места расположения PSP, установленного в Вашем SDK. Пример ниже показывает пути для AM37 SDK и смонтированной карты SD.
export PATH_TO_SDK=/home/user/ti-sdk-AM37x-evm-4.0.1.0
export PATH_TO_SDBOOT=/media/boot
export PATH_TO_SDROOTFS=/media/rootfs
Для запуска скрипта cpSDCard используйте команду ./cpSDCard, введенную в терминале.
Позвольте скрипту работать, пока в терминале снова не будет выведено приглашение ввода команды. Это займет некоторое время, потому что работа команд "tar" и "sync" может занимать несколько минут.