Роман Теличко

Заметки веб-разработчика/админа

Установка и оптимизация Raspbian на Raspberry Pi

// | 2370 просмотров | комментариев (0)

Начнём с Википедии, если для вас эти слова в новинку 🙂

Raspberry Pi — одноплатный компьютер размером с банковскую карту, изначально разработанный как бюджетная система для обучения информатике, впоследствии получивший намного более широкое применение и популярность, чем ожидали его авторы. Разрабатывается Raspberry Pi Foundation. Всего за пять лет было продано более 12,5 миллионов устройств.

Raspberry Pi 3 Model B

  1. Скачиваем и устанавливаем Raspbian на SD-карту
  2. Первая загрузка
  3. Настраиваем сеть
  4. Закрываем всё ненужное с помощью iptables
  5. Оптимизируем дисковые операции
  6. Оптимизируем оперативную память

Скачиваем и устанавливаем Raspbian на SD-карту

Raspbian LogoRaspbian — это специальный форк Debian Linux под Raspberry Pi
Скачиваем его отсюда (лучше через торрент)

Распаковываем архив (для этого у вас должен стоять пакет unzip)

unzip 2017-11-29-raspbian-stretch-lite.zip

Raspberry Pi работает с карточкой MicroSD. Я рекомендую Вам взять карточку размером более 4ГБ скоростного класса «10» (или лучше).
Больше о скоростных классах можете почитать здесь

Вставляем в кард-ридер и ищем

sudo df -h

или так

sudo tail -f /var/log/messages

Обратите внимание что мы будем полностью перезаписывать содержимое таблицы разделов карты памяти тут тут очень важно подставить правильное устройство, иначе вы можете случайно затереть себе важдый диск/раздел.
У меня система смотрировала первый раздел на устройстве как /dev/sdd1, значит в моём случаи будет так: /dev/sdd (поскольку нас интересует устройство, а не раздел на нём)

Запускаем побайтовую запись на карту памяти скачанного и уже распакованного образа Raspbian:

sudo dd bs=4M if=./2017-11-29-raspbian-stretch-lite.img of=/dev/sdd status=progress conv=fsync

Вывод будет приблизительно следующий:

443+0 записів прочитано
443+0 записів записано
скопійовано 1858076672 байтів (1,9 GB, 1,7 GiB), 316,249 с, 5,9 MB/с

Вставляем карту памяти в Raspberry Pi, подключаем монитор, питание и USB-клавиатуру.
Загружаемся.

Первая загрузка

По-умолчанию для Raspbian логин pi и пароль raspberry

Авторизуемся и поднимаем привилегии до суперпользователя

sudo -s

Посмотрим информацию о системе

lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 9.3 (stretch)
Release:	9.3
Codename:	stretch
uname -a
Linux pi3 4.9.77-v7+ #1081 SMP Wed Jan 17 16:15:20 GMT 2018 armv7l GNU/Linux

Сразу рекомендую сделать конфигурацию locales и tzdata, чтобы не было недопониманий с текущей раскладкой клавиатуры (по-умолчанию будет стоять британская со своим набором спецсимволов, вместо общепринятых)

dpkg-reconfigure locales
dpkg-reconfigure tzdata

Добавляем пользователя и добавляем его в группу sudo

adduser 
usermod -a -G sudo 

Заходим под новым пользователей и удаляем стандартного pi

userdel -r pi

Обновляем пакеты по-дебиановски:

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

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

rpi-update && reboot
 *** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom
 *** Performing self-update
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 13403  100 13403    0     0  31813      0 --:--:-- --:--:-- --:--:-- 31836
 *** Relaunching after update
 *** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom
 *** We're running for the first time
 *** Backing up files (this will take a few minutes)
 *** Backing up firmware
 *** Backing up modules 4.9.59-v7+
#############################################################
This update bumps to rpi-4.9.y linux tree
Be aware there could be compatibility issues with some drivers
Discussion here:
https://www.raspberrypi.org/forums/viewtopic.php?f=29&t=167934
##############################################################
 *** Downloading specific firmware revision (this will take a few minutes)
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   168    0   168    0     0    229      0 --:--:-- --:--:-- --:--:--   229
100 54.1M  100 54.1M    0     0  1858k      0  0:00:29  0:00:29 --:--:-- 3568k
 *** Updating firmware
 *** Updating kernel modules
 *** depmod 4.9.77+
 *** depmod 4.9.77-v7+
 *** Updating VideoCore libraries
 *** Using HardFP libraries
 *** Updating SDK
 *** Running ldconfig
 *** Storing current firmware revision
 *** Deleting downloaded files
 *** Syncing changes to disk
 *** If no errors appeared, your firmware was successfully updated to 51bc4cc4ee47d7e4efcc76fa664fcfe4c0e46e3e
 *** A reboot is needed to activate the new firmware

Настраиваем сеть

После перезагрузки настраиваем сеть (например так):

vi /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

auto lo
iface lo inet loopback

#iface eth0 inet manual

allow-hotplug eth0
iface eth0 inet static
    address 192.168.0.100
    netmask 255.255.255.0
    gateway 192.168.0.1
    # dns-* options are implemented by the resolvconf package, if installed
    dns-nameservers 8.8.8.8 8.8.4.4

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

В составе Raspberry Pi 3 также имеется Wi-Fi модуль, что настраивается редактированием файла /etc/wpa_supplicant/wpa_supplicant.conf

Например так:

vi /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=UA

network={
	ssid="MyNet"
	psk="MyMegaSecurePassword"
}

Или сделать это через удобную встроенную тулзу для конфигурации Raspbian (через которую много делать ещё много чего)

raspi-config

Я обычно выключаю поддержку IPv6.
И оборудование пока не 100% всё готово для его поддержки и памяти больше сэкономите.

vi /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv6.conf.eth0.disable_ipv6 = 1
net.ipv6.conf.wlan0.disable_ipv6 = 1
sysctl -p

А также раскоментируйте в файле /etc/modprobe.d/ipv6.conf строчку alias ipv6 off и добавьте blacklist ipv6 (чтобы наверняка)

vi /etc/modprobe.d/ipv6.conf 

Получится как-то так:

alias net-pf-10 off
alias ipv6 off
blacklist ipv6

Активируем ssh при загрузке системы (по-умолчанию он отключен) и запускаем его и дальше уже можем работать с Raspberry Pi удаленно через ssh.

systemctl enable ssh
Synchronizing state of ssh.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable ssh
# systemctl start ssh
# systemctl status ssh
● ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2018-01-19 18:46:51 EET; 48s ago
 Main PID: 684 (sshd)
   CGroup: /system.slice/ssh.service
           └─684 /usr/sbin/sshd -D

Закрываем всё ненужное с помощью iptables

Вначале поставим пакет iptables-persistent, что обеспечит автоматическое поднятие правил после перезагрузки системы.
Вы можете править и системные скрипты, но учитывая что их расположение от дистрибутива к дистрибутиву постоянно меняется, я рекомендую использовать более универсальное решение.

apt install iptables-persistent

Пакет при установке задаст вопрос по-поводу сохранения текущих правил в конфиг. Отвечаем «Yes» на оба вопроса (IPv4 и IPv6).

Создадим удобный скрипт по-умолчанию закроет все входящие подлючения, кроме SSH по 22-му порту из вашей сети (при условии что она 192.168.0.0/24) и полностью закроет все подключения по IPv6 (по-умолчанию они разрешены)

vi /etc/iptables.rules.sh
#!/bin/bash

/sbin/iptables -F
/sbin/iptables -X

/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT ACCEPT
/sbin/iptables -P FORWARD DROP

/sbin/iptables -I INPUT 1 -i lo -p all -j ACCEPT
/sbin/iptables -I INPUT -s 127.0.0.1 -j ACCEPT

/sbin/iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

/sbin/iptables -A INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT

/sbin/iptables-save > /etc/iptables/rules.v4

echo "[IP v4]"
/sbin/iptables -L -n --line-numbers

/sbin/ip6tables -F
/sbin/ip6tables -X

/sbin/ip6tables -P INPUT DROP
/sbin/ip6tables -P OUTPUT DROP
/sbin/ip6tables -P FORWARD DROP

/sbin/ip6tables-save > /etc/iptables/rules.v6

echo ""
echo "[IP v6]"
/sbin/ip6tables -L -n --line-numbers

Добавим право запуска и выполним его

chmod +x /etc/iptables.rules.sh
/etc/iptables.rules.sh
[IP v4]
Chain INPUT (policy DROP)
num  target     prot opt source               destination         
1    ACCEPT     all  --  127.0.0.1            0.0.0.0/0           
2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
4    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
5    ACCEPT     tcp  --  192.168.0.0/24       0.0.0.0/0            tcp dpt:22
6    DROP       all  --  0.0.0.0/0            0.0.0.0/0           

Chain FORWARD (policy DROP)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

[IP v6]
Chain INPUT (policy DROP)
num  target     prot opt source               destination         

Chain FORWARD (policy DROP)
num  target     prot opt source               destination         

Chain OUTPUT (policy DROP)
num  target     prot opt source               destination

Оптимизируем дисковые операции

Поскольку ресурс на запись SD-карты довольно мал, перенесём хранение и ведение логов в оперативную память (на случай, если они вам нужны).
Для этого всего-лишь необходимо отредактировать /etc/fstab, добавив в него следующее содержимое:

vi /etc/fstab
tmpfs           /tmp                tmpfs   defaults,noatime,nosuid,size=100m                   0   0
tmpfs           /var/tmp            tmpfs   defaults,noatime,nosuid,size=30m                    0   0
tmpfs           /var/log            tmpfs   defaults,noatime,nosuid,mode=0755,size=100m         0   0
tmpfs           /var/spool/mqueue   tmpfs   defaults,noatime,nosuid,mode=0700,gid=12,size=10m   0   0

И отправим наше устройство в перезагрузку:

reboot

После чего мы увидим что-то следующее:

df -h
Ф. система      Розм   Вик  Дост Вик% змонтований на
/dev/root       7,3G  1,3G  5,8G  18% /
devtmpfs        460M     0  460M   0% /dev
tmpfs           464M     0  464M   0% /dev/shm
tmpfs           464M   12M  452M   3% /run
tmpfs           5,0M  4,0K  5,0M   1% /run/lock
tmpfs           464M     0  464M   0% /sys/fs/cgroup
tmpfs            10M     0   10M   0% /var/spool/mqueue
tmpfs           100M     0  100M   0% /tmp
tmpfs           100M  128K  100M   1% /var/log
tmpfs            30M     0   30M   0% /var/tmp
/dev/mmcblk0p1   41M   21M   21M  52% /boot
tmpfs            93M     0   93M   0% /run/user/1001

Выключаем использование swap-памяти

dphys-swapfile swapoff
dphys-swapfile uninstall
systemctl disable dphys-swapfile
dphys-swapfile.service is not a native service, redirecting to systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable dphys-swapfile

Оптимизируем оперативную память

Если вы не собираетесь запускать графическую систему, то стоит ограничить GPU в оперативной памяти с 64МБ до 1МБ

raspi-config

7 Advanced Options -> A3 Memory Split -> How much memory (MB) should the GPU have?
тут устанавливаем значение 1 и нажимаем Finish. После чего необходимо будет перезагрузиться.

Также можете отключить демон Bluetooth, если не собираетесь им пользоваться.

systemctl disable bluetooth
Synchronizing state of bluetooth.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable bluetooth
Removed /etc/systemd/system/dbus-org.bluez.service.
systemctl stop bluetooth

Количество свободной памяти:

free
              total        used        free      shared  buff/cache   available
Mem:        1000312       29516      900036       13032       70760      909556
Swap:             0           0           0

Это всё.
Удачи!