GrabDuck

Raspberry PI — загрузка с USB флэшки | 100.org.ua — блог программиста

:

Введение

Найденые ошибки и их решение здесь.

Итак есть Raspberry PI 2 B (последняя модель на данный момент — Декабрь 2015), sdcard объемом 128MB и USB флэшка на 8GB.

raspberrypi-2-b

Задача: надо заставить Raspberry PI как-то загружаться со всего этого.

Проблема в том, что официальные дистрибутивы OS, предложенные на сайте www.raspberrypi.org предполагают что у вас есть в наличии sdcard как минимум на 4GB, но никак не на 128MB, с чем мы и будем разбираться в этой статье.

Как стало известно с различных источников, Raspberry PI не может быть загружена напрямую с USB накопителя, а только с sdcard, и как не странно, но все предложенные официальные дистрибутивы OS для Raspberry PI — уже объемом более 1 GB. И получается, имея sdcard объемом всего в 128MB и используя официальные образы OS, — нет возможности запустить Raspberry PI. Но пытливые умы нашли множество способов как это сделать, правда с небольшими танцами. Конечно же, полностью избавиться от sdcard и зугружать Raspberry PI  с USB у нас не получится, но все же это также рабочие и вполне достойные варианты, имеющие право на жизнь в подобных случаях, один из которых мы будем рассматривать в этой статье.

Вся идея заключается в том, чтобы разделить оригинальный образ OS, вытащить с него первый (загрузочный) раздел и записать его на sdcard. Все остальное (то есть второй раздел с образа) мы записываем на USB накопитель.

Процедура загрузки следующая:

  1. Первым делом Raspberry PI загрузится с sdcard, а это основные драйвера для процессора, системных устройств, и, самое главное, — для USB контроллера, что и позволит нам в дальнейшем продолжить загрузку операционной системы с другого источника. Кстати, это может быть не только USB флэшка, но и NFS сервер, запущенный, например, на вашем домашнем роутере.
  2. Далее, загрузчик считывает инструкции с файла cmdline.txt и продолжает загрузку с источника указанного в параметре root=/dev/mmcblk0p2, значение которого нам и нужно изменить на root=/dev/sda2. Да, вот именно на /dev/sda2, именно так определяется USB флэшка, и никак иначе. Под номером раз, то есть /dev/sda1, — у нас будет определена sdcard с ядром linux и минимальными драйверами.
  3. Далее загрузка должна продолжиться как обычно, и в итоге вы должны увидеть стандартное окно (консоль) базовой конфигурации Raspberry PI.

Напомню, что логин и пароль по умолчанию в raspbian OS следующие:

  • login: pi
  • pass: raspberry

Для реализации запланированного нам понадобится следующее:

  1. Win32DiskImage (под Windows, если запускаете под Windows 8 или выше — запускайте в режиме совместимости с Windows XP SP3)
  2. Ubuntu 14.04 (у меня через VirtualBox)

Приступим

Скачиваем образ raspbian OS с оф. сайта. Их несколько, так что есть с чего выбрать. У меня в примерах будет использован образ RASPBIAN WHEEZY.
Ложим этот образ в какую нибудь папочку, которую в дальнейшем расшарим для VirtualBox.

Устанавливаем Ubuntu 14.04 на VirtualBox.

Устанавливаем расширения для VirtualBox для того, чтобы нам были доступны такие возможности как шаринг папок и более высокое разрешние дисплея.

Расшариваем папку, в которую мы положили образ raspbian.

В Ubuntu открываем terminal и набираем следующие команды:

# логинимся под root-ом, чтобы не вводить постоянно команду sudo
sudo su
# создаем папку для монтирования шары
cd /mnt
mkdir share
# монтируем расшареную папку
mount -t vboxsf SHARED /mnt/share
# заходим в примонтированую папку
cd /mnt/share

Далее нам нужно определить какие разделы есть в образе, для этого

# смотрим разделы файловой системы в образе
fdisk -l 2015-05-05-raspbian-wheezy.img

Должно быть что-то в этом роде:

Disk 2015-05-05-raspbian-wheezy.img: 3276 MB, 3276800000 bytes
255 heads, 63 sectors/track, 398 cylinders, total 6400000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xa6202af7

                         Device Boot      Start         End      Blocks   Id  System
2015-05-05-raspbian-wheezy.img1            8192      122879       57344    c  W95 FAT32 (LBA)
2015-05-05-raspbian-wheezy.img2          122880     6399999     3138560   83  Linux

Из данного листинга хорошо видно, что каждый сектор = 512 байт, первый раздел начинается с 8192 сектора и заканчивается сектором 122879, всего 114687 секторов. Второй раздел начинается с 122880 сектора и заканчивается сектором 3138560, всего 3015680 секторов. Нам нужны данные первого сектора, потому что именно его мы будем выдирать отсюда и записывать на sdcard, на USB флэшку же мы запишем весь оригинальный образ, как есть (вместе с первым и вторым разделами).

Для того чтобы выдрать всего один раздел мы будем использовать очень удобную и полезную linux утилиту dd. Для начала мы запишем этот образ в файл, а потом залъем его на sdcard с помощью Windows утилиты Win32DiskImage, так как мне не удалось заставить VirtualBox подключить к хост-системе sdcard.

# используем dd, скопируем первый раздел образа в файл boot.img
dd if=2015-05-05-raspbian-wheezy.img bs=512 skip=8192 count=114687 | pv | dd of=boot.img

Как вы успели заметить, в данном случае dd использоуется в связке с pv. Я специально использовал pv для того, чтобы видеть прогресc копирования.

Теперь возвращаемся в Windows, и с помощью утилиты Win32DiskImage заливаем boot.img на sdcard.

Следующим шагом будет правка файла cmdline.txt в корне sdcard, которую мы только что перезаписали. Нам надо изменить значение одного параметра — root=/dev/mmcblk0p2 на root=/dev/sda2

После всего этого вставляем sdcard в соответствующее гнездо RaspberryPI, а воторую флэшку, которая 8GB и на которой, я так полагаю, уже залит полный оригинальный образ raspbian, — в свой соответствующий USB порт (подойдет любой, кроме mini).

Первую загрузку RaspberryPI следует выполнять с подключенным дисплеем и клавиатурой, потому как, скорее всего, выскочит ошибка о проверке файловой системы и продолжить загрузку системы можно будет только с помощью нажатия комбинации клавишь на клавиатуре — CTRL + D. Эта ошибка появляется из-за того что мы изменили немного процесс загрузки системы, но не изменили файл /etc/fstab, в котором нам также надо прописать новые пути к устройствам, /dev/sda1 и /dev/sda2 соответственно, чтобы это выглядело примерно так:

# /etc/fstab
proc            /proc           proc    defaults          0       0
/dev/sda1       /boot           vfat    defaults          0       2
/dev/sda2       /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, so no using swapon|off from here on, use  dphys-swapfile swap[on|off]  for that

SSH сервис должен быть включен по умолчанию, поэтому, после того как вы исправите fstab, в следующий раз, можно уже будет загружаться полность автономно, при этом надо быть подключеным к сети, ну и дальнейшие манипуляции уже можно будет производить по SSH протоколу.

В общем то это и всё.

Экспериментируйте и гарантировано получите кирпич :), но кто не экспериментирует — то не учится, а кто не учится — тот не развивается, а кто не развивается — тот уже умер.

Материалы были собраны из даных источников:
http://www.instructables.com/id/Boot-the-Raspberry-Pi-from-USB/?ALLSTEPS
http://jonathanmh.com/boot-raspberry-pi-from-a-usb-stick/
http://raspberrypi.stackexchange.com/questions/1187/boot-from-external-usb-stick-drive
http://elinux.org/RPi_Easy_SD_Card_Setup
https://www.raspberrypi.org/forums/viewtopic.php?f=36&t=21819
https://www.raspberrypi.org/forums/viewtopic.php?f=66&t=12015&sid=b8f24195f79bb7ff1685b92ffc3166c8
http://cellux.github.io/articles/moving-to-nfs-root/
http://www.linuxquestions.org/questions/linux-software-2/using-dd-to-copy-specific-partitions-into-specific-partitions-841701/
http://stackoverflow.com/questions/2621076/copying-sectors
http://helpdeskgeek.com/virtualization/virtualbox-share-folder-host-guest/
http://lavrenov-pavel.ru/raspberrypi/nastrojka-setevogo-podklyucheniya/
http://rabexc.org/posts/raspberry-pi

Метки: , , , , , , , , , , , , , , , ,