Установка Raspbian from scratch на Unix/Linux

Raspbian — основанная на Debian операционная система для Raspberry Pi. Существует несколько версий Raspbian, в том числе Raspbian Stretch и Raspbian Jessie. С 2015 года Raspbian официально представлена Raspberry Pi Foundation в качестве основной операционной системы для одноплатных компьютеров Raspberry Pi.

Купил я малину для того, чтобы начать делать умный дом. Чтобы Взял только плату

Скачиваем дистрибутив с Raspbian, я брал вот этот:

$ wget -O raspberrypi.zip https://downloads.raspberrypi.org/raspbian_lite_latest && unzip ./raspberrypi.zip

Ждем завершения, а пока можно посмотреть нужную информацию о монтируемой SD-флешке. Вставляем флешку ( у меня ОС — макОС) и находим монтируемую область:

$ diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *500.3 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                 Apple_APFS Container disk1         499.4 GB   disk0s2

/dev/disk1 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +499.4 GB   disk1
                                 Physical Store disk0s2
   1:                APFS Volume Macintosh HD            472.9 GB   disk1s1
   2:                APFS Volume Preboot                 44.1 MB    disk1s2
   3:                APFS Volume Recovery                522.8 MB   disk1s3
   4:                APFS Volume VM                      1.1 GB     disk1s4

/dev/disk3 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *128.2 GB   disk3
   1:               Windows_NTFS                         128.2 GB   disk3s1

Так же можно вывести всю инфу:

$ diskutil info -all

PS: Можно использовать (но не очень информативно как по мне):

$ mount

С вывода видно что у меня это — /dev/disk3. Для Linux систем можно использовать:

$ df -aTh

или:

$ cat /proc/mounts
$ cat /proc/self/mounts

Отформатирую SD-card следующим образом:

$ sudo diskutil eraseDisk FAT32 RASPBIAN MBRFormat /dev/disk3

Password:
Started erase on disk3
Unmounting disk
Creating the partition map
Waiting for partitions to activate
Formatting disk3s1 as MS-DOS (FAT32) with name RASPBIAN
512 bytes per physical sector
/dev/rdisk3s1: 250253568 sectors in 3910212 FAT32 clusters (32768 bytes/cluster)
bps=512 spc=64 res=32 nft=2 mid=0xf8 spt=32 hds=255 hid=32768 drv=0x80 bsec=250314752 bspf=30549 rdcl=2 infs=1 bkbs=6
Mounting disk
Finished erase on disk3

Где:

  • sudo — Дает пользователю супер-права.
  • diskutil — Вызывает утилиту.
  • eraseDisk — Команда для форматирования.
  • FAT32 — Установка типа ФС.
  • RASPBIAN — Имя устройства.
  • MBRFormat — Говорит disk utility, отформатировать флешку в Master Boot Record.
  • /dev/disk3 — Локация\путь к SD card-е.

Если используете Linux, то можно это сделать следующим образом, чтиво тут:

Утилита FDISK в Unix/Linux

Установка/Использование parted в Unix/Linux

После расспоковки архива образа для расбиана, у меня появился файл — 2019-04-08-raspbian-stretch-lite.img который стоит записать на SD карту, я буду использовать утилиту dd следующим образом:

$ sudo dd if=2019-04-08-raspbian-stretch-lite.img of=/dev/disk3 bs=1m status=progress conv=fsync

Получил ошибку:

dd: /dev/disk2: Resource busy

Чтобы исправить, стоит отмонтировать волюму, т.к ОС работает с ней:

$ diskutil unmountDisk /dev/disk3

Unmount of all volumes on disk3 was successful

Ну а потом, сново выполняем:

$ sudo dd if=2019-04-08-raspbian-stretch-lite.img of=/dev/disk3 bs=1m

1720+0 records in
1720+0 records out
1803550720 bytes transferred in 590.702848 secs (3053228 bytes/sec)

Мануал по работе с DD вот тут:

Утилита dd в Unix/Linux

Чтобы отключить флешку ( на макОС), я заюзал:

$ diskutil eject /dev/disk3

Disk /dev/disk3 ejected

Полезное чтиво:

Делаем загрузочную флешку из ISO образа на Unix/Linux

Теперь можно вставлять данную СД карту в расбери пи и начинать установку. Конечно, для этого нужно будет клавиатура, экран, питание. У меня это все есть… приступим! У малины нет кнопки питания, по этому — она включаеться сразу. И так, чтобы войти нам нужно:

  • Login: pi
  • Password: raspberry

Сразу же логинимся под root-а:

$ sudo -s

Нужно сейчас подключиться к малине. И начать настройку. Я наверное начну с обновлений:

# apt update && apt upgrade && apt dist-upgrade

Затем, пропишем нужные локали, у меня:

# dpkg-reconfigure locales

И можно во так еще:

# localedef -i en_US -f UTF-8 en_US.UTF-8

Выполняем:

# LANG=en_US.utf8

И смотрим что есть:

pi@raspberrypi:~ $ locale

LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8

Настраиваем тайм-зону:

# dpkg-reconfigure tzdata

Чтобы проверить дату, выполните:

# date
Thu May  9 17:04:52 EEST 2019

Создаем нового юзера:

# adduser captain

Добавляем юзера в sudo группу:

# usermod -a -G sudo captain

Обновим прошивку и перезагрузимся в случаи успеха:

# rpi-update && reboot

Обновления поставили, теперь можно настроить сеть, открываем:

# vim /etc/network/interfaces 

И приводим к виду:

# interfaces(5) file used by ifup(8) and ifdown(8)

# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'

# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d

#loop
auto lo
iface lo inet loopback

# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 8.8.8.8 8.8.4.4

#eth0
iface eth0 inet manual

#wlan0
allow-hotplug wlan0
iface wlan0 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

# default

С Raspberry Pi 3 также имеется Wi-Fi модуль, по этому, можно заюзать и настроить его, для этого, открываем:

# vim /etc/wpa_supplicant/wpa_supplicant.conf

Приводим к виду:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=UA
#
network={
	ssid="YOUR_WIFI"
	psk="YOUR_PASSWORD_of_WIFI"
	proto=RSN
	key_mgmt=WPA-PSK
	pairwise=CCMP
	group=CCMP
	auth_alg=OPEN
}

Где:

  • ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev — гуглил что это. Было по дефолту.
  • update_config=1 — Тоже дефолтное.
  • country=UA — Выставляем код страны.
  • ssid=»YOUR_WIFI» — Название вай-фая.
  • psk=»YOUR_PASSWORD_of_WIFI» — Пароль от вай-фай.
  • proto=RSN
  • key_mgmt=WPA-PSK — Шифрование. У меня настроено WPA2 personal.
  • pairwise=CCMP
  • group=CCMP
  • auth_alg=OPEN

Или сделать это можно, через утилиту:

# raspi-config

Я нагуглил что еще нужно поставить вот что:

# apt install wicd wicd-curses

Не уверен что нужно, но я ставил и у меня работает сеть по вай-фай.

Так же, добавим ssh в автозагрузку ОС:

# systemctl enable ssh

Можно потюнить ssh:

Port 22
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
SyslogFacility AUTHPRIV #AUTH
LoginGraceTime 2m
PermitRootLogin yes #prohibit-password
StrictModes yes
MaxAuthTries 5
MaxSessions 10

PubkeyAuthentication yes
AuthorizedKeysFile	%h/.ssh/authorized_keys .ssh/authorized_keys2
HostbasedAuthentication no
PasswordAuthentication yes
PermitEmptyPasswords no
ChallengeResponseAuthentication no
GSSAPIAuthentication no
GSSAPICleanupCredentials yes
UsePAM no
X11Forwarding yes
PrintMotd no
UsePrivilegeSeparation sandbox
UseDNS no
AllowUsers root captain
AcceptEnv LANG LC_*
AcceptEnv XMODIFIERS
Subsystem	sftp	/usr/lib/openssh/sftp-server

Создаем вот что:

$ mkdir ~/.ssh && chmod 0700 ~/.ssh && touch ~/.ssh/authorized_keys && chmod 0600 ~/.ssh/authorized_keys

Проверить что вышло, можно вот так:

# sshd -t
/etc/ssh/sshd_config line 36: Deprecated option RSAAuthentication
/etc/ssh/sshd_config line 46: Deprecated option RhostsRSAAuthentication
/etc/ssh/sshd_config line 102: Deprecated option UseLogin

Если появились такие вот ошибки, исправление будет следующее:

# sed -i '/KeyRegenerationInterval/d' /etc/ssh/sshd_config && \
sed -i '/ServerKeyBits/d' /etc/ssh/sshd_config && \
sed -i '/RSAAuthentication/d' /etc/ssh/sshd_config && \
sed -i '/RhostsRSAAuthentication/d' /etc/ssh/sshd_config 

И проверяем что вышло:

# sshd -t
/etc/ssh/sshd_config line 100: Deprecated option UseLogin

И так, фиксим — для этого открываем конфиг-файл и коментируем:

UseLogin no

Перезапускаем ssh:

$ systemctl restart ssh

Теперь, можно потюнить fstab, открываем:

# vim /etc/fstab

Добавляем «noatime» во все области, у меня это:

#=========================================================================================================================
# <file system> 	     |	<dir> 	     |	<type> 	    |	<options>                          | <dump> | <pass>  	 |
#=========================================================================================================================

#-------------------------------------------------------------------------------------------------------------------------
# System
#-------------------------------------------------------------------------------------------------------------------------
proc            		/proc           proc    	defaults          			0	0
PARTUUID=126fbf65-01  		/boot           vfat    	defaults,ro    				0       2
PARTUUID=126fbf65-02  		/               ext4    	defaults,noatime,errors=remount-ro  	0       1
#
#/dev/mmcblk0p1  		/boot           vfat    	defaults,ro          			0       2
#/dev/mmcblk0p2  		/               ext4    	defaults,noatime  			0       1
#
tmpfs        			/tmp            tmpfs  		nodev,size=128M,mode=1777,nosuid        0       0
tmpfs                   	/var/tmp        tmpfs       	nosuid,nodev                            0       0

#-------------------------------------------------------------------------------------------------------------------------
#Flash-cards
#-------------------------------------------------------------------------------------------------------------------------
#/dev/sda1 	      		/mnt/volume     ntfs-3g    	defaults 		0 			0

#-------------------------------------------------------------------------------------------------------------------------
# HDDs
#-------------------------------------------------------------------------------------------------------------------------

Так же, для `boot`, прописал «ro» — т.е монтирование раздела только для чтения.

Открываем:

# vim /boot/cmdline.txt

В поле «elevator» — т.е планировщик I/O добавляем noop или deadline:

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=126fbf65-02 rootfstype=ext4 elevator=noop fsck.repair=yes rootwait fastboot noswap splash plymouth.ignore-serial-consoles

Почитать насчет планировщиков I/O можно в интернете и решить, какой вам подойдет, но о некоторых, расскажу:

  • Планировщик NOOP самый простой планировщик, обладает минимальными возможностями и выполняет только простые операции объединения и сортировки, но зато и потребляет минимум ресурсов. Он представляет собой очередь FIFO (First In, First Out) то есть он, просто выставляет запросы в очередь в том порядке, в котором они пришли. Предназначен NOOP в основном для работы с не дисковыми устройствами (ОЗУ или флэшдиск) или со специализированными решениями которые уже имеют свой собственный планировщик I/O. В этом случае его простота имеет преимущество перед остальными алгоритмами.
  • Задачей алгоритма Deadline является минимизация задержек ввода/вывода, и обспечивает поведение близкое к реальному времени. В нем использовано 5 очередей ввода/вывода, а планировщик использует алгоритм предельного срока для улучшения производительности постоянно переупорядочивая запросы. Кратко суть алгоритма заключается в том, что операциям чтения всегда отдается предпочтение перед операциями записи. Поэтому в настройках по умолчанию операция чтения будет выполнена максимально через — 500 мс, а записи — 5 с. Далее из очереди извлекается следующий процесс, который и получает практически монопольный доступ к ресурсу, затем он переводится в состояние ожидания, а планировщик выбирает следующую программу.

Проверить какой планировщик используеться в ОС, можно вот так:

# dmesg | grep scheduler
[    0.232071] io scheduler noop registered
[    0.232095] io scheduler deadline registered (default)
[    0.232300] io scheduler cfq registered
[    0.232324] io scheduler mq-deadline registered (default)
[    0.232348] io scheduler kyber registered
[    0.807436] dwc_otg: Microframe scheduler enabled

Добавляем проверку на целосность ОС, для этого, создаем/открываем файл:

# vim /etc/default/rcS

И прописываем в него «FSCKFIX=yes», но я привел к виду:

#
# /etc/default/rcS
# Default settings for the scripts in /etc/rcS.d/
# For information about these variables see the rcS(5) manual page.
#
# This file belongs to the "initscripts" package.
# delete files in /tmp during boot older than x days.
# '0' means always, -1 or 'infinite' disables the feature
TMPTIME=0

# spawn sulogin during boot, continue normal boot if not used in 30 seconds
SULOGIN=yes

# do not allow users to log in until the boot has completed
DELAYLOGIN=no

# assume that the BIOS clock is set to UTC time (recommended)
UTC=yes

# be more verbose during the boot process
#VERBOSE=no

# automatically repair filesystems with inconsistencies during boot
FSCKFIX=yes

Потом, выполняем:

# tune2fs -c 3 /dev/mmcblk0p2

tune2fs 1.43.4 (31-Jan-2017)
Setting maximal mount count to 3

Note: Если не уверене с разделом (у меня /dev/mmcblk0p2), то можно поглядеть с утилитой:

# fdisk -l

Установим log2ram для оптимизации I/O на флешку:

# curl -Lo log2ram.tar.gz https://github.com/azlux/log2ram/archive/master.tar.gz && tar xf log2ram.tar.gz && cd log2ram-master && chmod +x install.sh && sudo ./install.sh && cd .. && rm -r log2ram*

Данная автоматизая нужна для того, чтобы логи как можно меньше писались на SD карту. Карта не вечна и износ будет быстрым!

Выключаем swapping следующими командами:

# dphys-swapfile swapoff
# dphys-swapfile uninstall
# update-rc.d dphys-swapfile remove

Еще, можно добавить монтирование. Например если нужно настроить SAMBA с NTFS, то стоит поставить пакет:

# apt install ntfs-3g

Вводим команду:

# blkid

Мой вывод:

# blkid
/dev/mmcblk0p1: LABEL="boot" UUID="16D2-035F" TYPE="vfat" PARTUUID="126fbf65-01"
/dev/mmcblk0p2: LABEL="rootfs" UUID="d065e631-6b9d-48c0-a8fe-e663b42828e0" TYPE="ext4" PARTUUID="126fbf65-02"
/dev/mmcblk0: PTUUID="126fbf65" PTTYPE="dos"
/dev/sda1: UUID="C4C677A2C6779380" TYPE="ntfs" PARTUUID="0012d5c8-01"

Т.е /dev/sda1 — моя вставленная флешка.

Создаем папку для монтирования:

# mkdir /mnt/fasion_trend_32gb && chmod 770 /mnt/fasion_trend_32gb

Монтируем:

# mount -t ntfs-3g -o nofail,uid=1000,gid=1000,umask=007 /dev/sda1 /mnt/fasion_trend_32gb

После ребута слетит все это дело, но можно добавить строки в fstab:

# cp /etc/fstab /etc/fstab_BK && vim /etc/fstab

Прописываем:

UUID=C4C677A2C6779380 /mnt/fasion_trend_32gb ntfs-3g async,big_writes,noatime,nodiratime,nofail,uid=1000,gid=1000,umask=007 0 0

Ну или альтернатива:

/dev/sda1 /mnt/fasion_trend_32gb ntfs defaults 0 0

После чего, делаем ребут:

# reboot

У меня роутер — time capsule и чтобы открыть порт в мир, мне потребовалось время и помощь друга (Спасибо Loper). Настроить это можно вот так. Открываем «AirPort Utility»:

Нажимаем по капсуле и кликаем по «Edit». Затем, переходим во вкладку «Network»:

В поле «DHCP Reservation», нажимаем на «+» чтобы зарезервировать WLAN IP адресс, например:

Где:

  • Description — Название.
  • Reserve Address By — Стоит выбрать «Mac Address».
  • Mac Address — Это мак адрес вашей малине на WLAN.
  • IPv4 Address — Адресс резерва.

Чтобы посмотреть мак адресс, выполните на малине:

# ifconfig -a wlan0 | grep -E "ether"| awk '{print $2}'
b8:27:eb:9c:47:57

После всех добавлений, нажимаем на «Save». Теперь, стоит открыть порт, переходим в «Port Settings» и нажимаем на «+»:

AirPort Utility (Port Settings) на макОС
AirPort Utility (Port Settings) на макОС

Где:

  • Description — Выбираем «Удаленный вход — SSH».
  • Public TCP Ports — Выбираем нужный порт для пробрасывания. У меня это 22.
  • Private IP Address — Зарезервированный ИП адресс ( делали выше).
  • Private TCP Ports — Порт который будет слушаться на малине. У меня это тоже — 22.

Нажимаем на «Save» и потом на «Update». Ждем пока капсуля обновит настройки.

Вы можете использовать лицензированную по GPL программу upsd (Демон бесперебойного питания) для включения следующих функций:

  • Выключать систему при отключении питания или когда павер-банк будет разряжен.
  • Выполнять скрипты для определенных изминений питания.
  • Мониторинг состояния БП (включая текущий уровень заряда).
  • Молно логировать все события электропитания в системный log-файл.
# wget http://raspi-ups.appspot.com/upsd/upsd_1.2-1.deb && dpkg -i upsd_1.2-1.deb && rm -f upsd_1.2-1.deb

Проверяем текущий статус:

# upsd -i

У меня это:

IS_RUNNING=NO

Скрипты лежат вот тут:

# ls -alh /usr/lib/upsd
total 20K
drwxr-xr-x  2 1000 1000 4.0K May 14 15:00 .
drwxr-xr-x 60 root root 4.0K May 14 14:55 ..
-rwxr-xr-x  1 1000 1000  436 Mar 12  2015 low_battery
-rwxr-xr-x  1 1000 1000  106 Dec 29  2014 power_back
-rwxr-xr-x  1 1000 1000  159 Mar 13  2015 power_outage

Где:

  • low_battery — Данный скрипт работает при достижении низкого уровня заряда батареи. На этом этапе вы должны подготовить свою систему к завершению (выключению ОС).
  • power_back — Этот скрипт выполняется, если питание возвращается после сбоя. В этой ситуации может быть хорошей идеей отправить уведомление на ваш смартфон с помощью IFTTT, предполагая, что при включении питания интернет-соединение также будет восстановлено.
  • power_outage — Этот скрипт, будет работать после обнаружения сбоя питания. Вы можете решить где уменьшить активности на малине, чтобы уменьшить потребление.

И так, для начала, отредактирую:

# vim /usr/lib/upsd/power_back

И прописываем:

#!/bin/bash

# This script is executed by upsd if the power comes back after a
# preceding power outage.

while true;
	do ping -c1 www.google.com > /dev/null && break;
	sleep 30s
done
curl -X POST -H "Content-Type: application/json" https://maker.ifttt.com/trigger/{your_created_event}/with/key/{your_ifttt_key} 2>1

Где:

  • your_created_event — Название ивента который вы создали на ifttt сайте.
  • your_ifttt_key — Это ключ от ивента в ifttt.

Создать его можно в «My Applets» -> «New Applet». Кликаем на «+ THIS». В поиске, вводим «Webhooks» и кликаем по нему. Потом, выбрать нужно «Receive a web request». Прописываем:

  • Event Name — Название события (например — raspberry_up). В примере что выше, я использую «your_created_event».

Далее, нажимаем на «+THAT» и в поле поиска вводим «Notifications» и кликаем по нему. После чего, выбираем «Send a notification from the IFTTT app» и нажимаем по нему. В поле «Message» стоит вписать текст который будет отправляться вам, например у меня:

The "{{EventName}}" has been started up at {{OccurredAt}}

Затем, кликаем по «Create action». «Finish».

Открываем «ifttt_site_url_here/maker_webhooks». Затем, кликаем по «settings». Собственно URL нам и понадобиться. Можно взять тот УРЛ и вставить в браузер и потом, выполнить тестирование.

Перезапустить сервис:

# service upsd restart

Смотрим статус:

# service upsd status
● upsd.service - LSB: Starts and stops the upsd daemon.
   Loaded: loaded (/etc/init.d/upsd; generated; vendor preset: enabled)
   Active: active (running) since Tue 2019-05-14 15:05:34 EEST; 4s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 16698 ExecStop=/etc/init.d/upsd stop (code=exited, status=0/SUCCESS)
  Process: 16708 ExecStart=/etc/init.d/upsd start (code=exited, status=0/SUCCESS)
   Memory: 2.1M
      CPU: 41ms
   CGroup: /system.slice/upsd.service
           └─15791 /lib/nut/upsd

May 14 15:05:34 raspberrypi systemd[1]: Starting LSB: Starts and stops the upsd daemon....
May 14 15:05:34 raspberrypi upsd[16708]: Network UPS Tools upsd 2.7.4
May 14 15:05:34 raspberrypi upsd[16708]: Fatal error: A previous upsd instance is already running!
May 14 15:05:34 raspberrypi upsd[16708]: Either stop the previous instance first, or use the 'reload' command.
May 14 15:05:34 raspberrypi systemd[1]: Started LSB: Starts and stops the upsd daemon..

Добавить сервис в автозагрузку, можно:

# systemctl enable upsd

Ну и на последок — конечно же, делаем бекап, для начала смотрим какой блок используется на карте:

$ sudo hdiutil imageinfo /dev/disk3 | grep block-size
	block-size: 512

А потом, делаем бэкап:

$ sudo dd if=/dev/disk3 bs=512 | gzip -c > /Users/captain/raspberrypi.img.gz

Возможные траблы с Raspberry Pi

Буду описывать возможные причины ошибок или проблемы в роботе с малиной.

-=== Ошибка 1 — загрузка ОС в Emergency Mode===-

Иногда бывает так, что ОС грузиться в Emergency Mode. Причины могут быть разные, одна из них — это плохой /etc/fstab. Или что-то пошло не так при работе с fsck.

Исправление будет не сложным, для начала открываем:

# vim /boot/cmdline.txt

Стоит в самый конец строки (не розвырая ее) добавляем:

init=/bin/sh

У меня данный файл выглядит следующим образом:

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=126fbf65-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait fastboot noswap splash plymouth.ignore-serial-consoles init=/bin/sh

Сохраняем файл. Грузимся, и монтируем разделы:

# mount -o remount,rw / –target /

Сейчас можно отредактировать и исправить fstab:

# vi /etc/fstab

Правим. Сохраняем и вводим «exit», нажимаем «enter». Это вызовет «kernel panic». Ничего страшного, вынимаем карту и вставляем ее карт-ридер и монтируем ее ПК, теперь стоит убрать то что добавляли — удаляем init=/bin/sh с файла /boot/cmdline.txt.

Вот и все, статья «Установка Raspbian с scratch на Unix/Linux» подошла к завершению.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.