Введение
Найденые ошибки и их решение здесь.
Итак есть Raspberry PI 2 B (последняя модель на данный момент – Декабрь 2015), sdcard объемом 128MB и USB флэшка на 8GB.
Задача: надо заставить 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 накопитель.
Процедура загрузки следующая:
- Первым делом Raspberry PI загрузится с sdcard, а это основные драйвера для процессора, системных устройств, и, самое главное, – для USB контроллера, что и позволит нам в дальнейшем продолжить загрузку операционной системы с другого источника. Кстати, это может быть не только USB флэшка, но и NFS сервер, запущенный, например, на вашем домашнем роутере.
- Далее, загрузчик считывает инструкции с файла cmdline.txt и продолжает загрузку с источника указанного в параметре root=/dev/mmcblk0p2, значение которого нам и нужно изменить на root=/dev/sda2. Да, вот именно на /dev/sda2, именно так определяется USB флэшка, и никак иначе. Под номером раз, то есть /dev/sda1, – у нас будет определена sdcard с ядром linux и минимальными драйверами.
- Далее загрузка должна продолжиться как обычно, и в итоге вы должны увидеть стандартное окно (консоль) базовой конфигурации Raspberry PI.
Напомню, что логин и пароль по умолчанию в raspbian OS следующие:
- login: pi
- pass: raspberry
Для реализации запланированного нам понадобится следующее:
- Win32DiskImage (под Windows, если запускаете под Windows 8 или выше – запускайте в режиме совместимости с Windows XP SP3)
- 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/?ALLSTEPShttp://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
1 comment for “Raspberry PI – загрузка с USB флэшки”