понедельник, 14 июня 2021 г.

Веб-сервер на базе Raspberry Pi Zero W. Часть 1: Организационная.

В прошлый раз мы установили операционную систему Raspberry Pi OS на нашу "малинку", подключили ее к сети Wi-Fi и смогли даже удаленно зайти на нее по протоколу SSH. Сегодня мы продолжим дальше настраивать наш миниатюрный web-сервер. Но прежде чем мы перейдем к установке и конфигурированию программ и служб, непосредственно связанных с работой web-сервера, необходимо завершить настройку самой "системы". В частности:

  • сменить пароль по умолчанию на свой.
  • сменить имя пользователя на своё (опционально). 
  • сменить имя компьютера на своё (опционально).
  • установить скрипт автоматической проверки необходимости перезагрузки системы после очередного обновления программного обеспечения.
  • установить свою временную локаль (часовой пояс).
Итак, задачи определены, перейдем непосредственно к реализации.

Следует сразу оговорить, что все действия, описываемые далее, будут проводиться в "командной строке" т.к. ранее мы установили ОС без графического оболочки и подключаемся к Raspberry Pi в терминальном режиме. Возможно, что часть действий можно осуществить и более простыми решениями при наличии "графики", но данная задача не является целью данного поста. Графическая оболочка может быть, а может и не быть, а терминал будет всегда :-))).

Смена пароля пользователя Raspberry Pi OS.

Для того, чтобы сменить пароль пользователя в дистрибутиве Raspberry Pi OS как и в любом другом дистрибутиве Linux, необходимо воспользоваться утилитой passwd. Синтаксис passwd очень прост:

passwd опции логин_пользователя

При этом и опции и логин_пользователя являются опциональными и могут быть просто опущены при обычной смене пароля. Наберите в окне терминала команду passwd и нажмите Enter. Система сначала попросит Вас ввести текущий пароль, а потом дважды новый. 


В случае успешной смены пароля, утилита passwd уведомит Вас соответствующим сообщением. Если же при вводе текущего или нового пароля была допущена ошибка, либо новый пароль не будет соответствовать минимальным требованиям к паролю, процесс смены пароля завершится неудачей с выводом текста ошибки. Утилита passwd очень старая и информации по ней в интернете очень много, в т.ч. подробные мануалы по её использованию, поэтому подробно останавливаться на этом не будем. 

Смена имени пользователя в Raspberry Pi OS.

Данный шаг я пометил как "опциональный" т.к. совершенно не принципиально это делать в обязательном порядке. Большинству пользователей вполне удобно работать и с логином пользователя по умолчанию (pi). Но если же Вы из тех, кто любит настраивать систему максимум "под себя", милости прошу читать далее :-). 

В смене имени пользователя нам поможет другая системная утилита - usermod. Формально, для переименования логина пользователя, достаточно ввести команду:

usermod -l новый_логин старый_логин

Но сделать это "на лету", будучи авторизованным в системе под пользователем, логин которого Вы пытаетесь изменить, просто так не получиться. Т.к. в системе будут запущены процессы от имени данного пользователя, процедура смены логина будет завершаться ошибкой, например:


Поэтому нам потребуется создать временного пользователя с правами sudo от имени которого мы проведем все требуемые операции. Может возникнуть резонный вопрос - А не проще ли будет просто создать нового пользователя, а пользователя pi удалить? Возможно и проще, для человека, который с linux-подобными системами на "ты". Если же Вы не совсем понимаете, как функционируют подобныме ОС, и в частности Raspberry Pi OS, я бы все же советовал именно переименовать пользователя pi, а не создавать вместо него иного. Таким образом Вы избежите возможных "непонятных" ситуаций в будущем, когда система вдруг начнет работать не так, как Вы от нее ожидали. 

Добавляем нового временного пользователя userok:

sudo adduser userok

После ввода команды, система предложит задать пароль для пользователя, а также внести дополнительную информацию о создаваемой учетной записи. В принципе, все вопросы, кроме пароля, можно оставить пустыми (просто нажимать клавишу Enter).


Включаем нашего нового пользователя userok в группу sudo:

sudo usermod -aG sudo userok


Входим в систему под временным пользователем userok:

Для этого сначала выходим из системы из-под учетной записи pi - это можно сделать, либо просто закрыв окно терминала, либо, что более правильно, набрав команду logout.


После этого заново устанавливаем SSH подключение с нашей Raspberry Pi и уже вместо пользователя pi, входим под пользователем userok. 


Изменяем имя пользователя pi и его домашний каталог:

sudo usermod -l oxide -d /home/oxide -m pi

В моем случае я изменяю стандартное имя пользователя pi на новое имя oxide. Соответственно, вместо oxide Вам необходимо указать имя пользователя, на которое хотите сменить Вы. 


Изменяем основную группу пользователя:

sudo groupmod -n oxide pi

По общему правилу, для каждого пользователя ОС Linux наименование основной группы пользователя соответствует наименованию логина пользователя. Но это не означает, что они не могут различаться. В многопользовательских системах, например, администраторы сервера Linux зачастую делают основной группой всех пользователей группу users. Тема пользователей, групп и привилегий доступа является одной из фундаментальных для ОС семейства Linux, и если Вы стремитесь в ней разбираться более глубоко, то стоит уделить этому вопросу дополнительное время.  

В моем случае, я так же меняю наименование основной группы пользователя с pi на oxide.


Создание символической ссылки из старого домашнего каталога в новый:

sudo ln -s /home/oxide /home/pi

Зачем мы это делаем - как показывает практика, вполне допустима ситуация, когда уже установленная программа в своих конфигурационных файлах имеет прямую ссылку на домашний каталог пользователя pi. Соответственно, при попытке запустить ее уже от переименованного пользователя мы рискуем получить ошибку, которую неопытные пользователя не сразу смогут локализовать. Создание символической ссылки позволит нам избежать большинства подобных ситуаций.

Не забывайте вместо oxide использовать Ваше имя.


Удаление временного пользователя:

Процесс переименования пользователя pi на этом завершен. Теперь нам осталось только заново подключиться по SSH к Raspberry Pi, авторизоваться уже под новым именем (в моем случае это oxide) и удалить нашего временного пользователя userok командой userdel.

sudo userdel -r userok


Смена имени компьютера в Raspberry Pi OS.

Имя компьютера, оно же хостнейм (hostname), буквенно-цифровое обозначение компьютера, которое, например, Вы видите в окне терминала после логина пользователя и символа "@" (в нашем случае имя хоста - raspberrypi).


Это же имя используется для сетевой "идентификации" компьютера в сети в сервисах, которые поддерживают передачу имени хоста. Например, в сервисах доступа к файлам и принтерам, организованном через протокол SMB.

Как и в случае со сменой имени пользователя, вопрос о необходимости смены имени хоста - вопрос не принципиальный. Можно оставить и такое как есть. С другой стороны, если у Вас окажется в сети два и более устройства Raspberry Pi, возникнет вопрос - как их различать по "имени" в приложениях прикладного уровня? 

Имя компьютера в ОС семейства Linux задается в момент установки системы, но в случае с Raspberry Pi OS нам не доступен этот "шаг", поскольку систему мы "распаковываем", а не устанавливаем с нуля. Что же делать? Главное - не отчаиваться :))). 

Имя хоста практически в любой ОС Linux "зафиксировано" в двух конфигурационных файлах:

/etc/hostname
/etc/hosts

И все, что нам требуется, это отредактировать их содержимое. 

Стоит отдельно сказать, что к имени хоста предъявляются определенные требования и оно не может быть абсолютно произвольным. В частности: имя хоста должно быть длиной от 1 до 63 символов, состоять из букв латинского алфавита a-z, цифр и дефиса (-). При этом имя хоста не может начинаться с дефиса. Кому интересно, подробнее может об этом почитать здесь.

Изменить содержимое файла /etc/hostname мы можем двумя путями: непосредственно отредактировать содержимое файла с помощью любого текстового редактора (например, vi), либо использовать команду hostnamectl (являющейся частью systemd):

sudo hostnamectl set-hostname новое_имя_компьютера

Какой способ использовать - совершенно не важно, результат будет один и тот же, поэтому выбирайте тот, который вам удобнее. К слову про команду hostnamectl, ее вызов без каких-либо аргументов выведет общую идентификационную информацию о системе (в том числе и актуальное имя компьютера):


Сменим название компьютера с помощью команды hostnamectl:


Как можно видеть на скриншоте выше, система выводит предупреждение, что она не может определить хост с новым именем rpi-srv. Это происходит из-за того, что мы не внесли изменения во второй файл (/etc/hosts), который используется для DNS запросов. Давайте исправим это.

В отличии от файла /etc/hostname, изменения в файл /etc/hosts можно внести только с помощью тестового редактора. Проще всего воспользоваться для этого программой vi (кто совершенно не знаком с особенностями ее работы, рекомендую ознакомиться, например, вот с этой обзорной информацией):


После запуска программы vi, нам необходимо найти строчку 127.0.1.1 raspberrypi 


и заменить ее на строчку 127.0.1.1 новое_имя_компьютера (в моем случае 127.0.1.1 rpi-srv)


После этого сохраняем изменения и перезагружаем нашу "малинку". 

При последующем подключении к Raspberry Pi мы увидим, что имя компьютера изменилось на требуемое:


На роутере, к которому подключается "малинка", тоже можно наблюдать, что имя хоста изменилось на новое (пример на роутере Keenetic):


На этом можно считать, что имя компьютера изменено :))).

Установка скрипта автоматической проверки необходимости перезагрузки системы после очередного обновления программного обеспечения.

Устанавливая новое ПО, либо обновляя существующее, периодически возникает ситуация, когда необходимо перезапустить тот или иной процесс, а иногда и все устройство, чтобы заработала уже новая версия программы. Хорошо, когда система нас предупреждает о такой необходимости, но это не наш случай - в "штатной" установке Raspberry Pi OS нет подобного функционала. После очередного "обновления" Вам придется либо самим догадываться какие службы перезапускать, либо перезапускать все устройство. Но это, согласитесь, не совсем удобно. Тем более, что обновление некоторых программ не требуют подобных действий. И вот тут нам на помощь приходит отличный скрипт проверки необходимости перезапуска обновляемых служб, процессов, а то и всего устройства - needrestart.

И на этом можно было за закончить повествование об этой весьма полезной утилите, если бы не один нюанс. Так уж получилось, что при установке Raspberry Pi OS "установщик" автоматически подтягивает все имеющиеся ядра Linux, которые есть для данной ОС для всего имеющегося многообразия Raspberry Pi. Одно из которых вообще для 64-битной платформы. На этом и спотыкается needrestart версии ниже, чем 3.5. Но как это исторически повелось, в репозитории "стабильной" версии ОС программы всегда чуть "старше", чем их актуальная версия. Так и с Raspberry Pi OS - на момент написания этой заметки версия в репозитории - 3.4-5. 

Поэтому, если Вы читаете данный текст и хотите установить needrestart на свою Raspberry Pi, сначала проверьте версию программы в актуальном репозитории. Вполне возможно, что к этому моменту версия уже была обновлена и дополнительные "телодвижения" просто не потребуются и достаточно будет просто ее установить непосредственно из репозитория.

Для того, чтобы проверить версию пакета в репозитории Вы можете воспользоваться командой:

apt-cache policy needrestart


Не забывайте перед установкой новых пакетов обновлять кэш репозитория и уже установленные пакеты командами:

sudo apt-get update
sudo apt-get upgrade

Если же версия в репозитории ниже 3.5, прошу читать далее :))).  

Перво-наперво, нам потребуется установить клиент Git:

sudo apt-get install git

После установки клиента Git, Вам необходимо (желательно в своей домашней директории) клонировать официальный репозиторий needrestart с сайта GitHub. Для этого используйте команду:

git clone https://github.com/liske/needrestart

В процессе работы Вы должны наблюдать примерной такую картину:


По окончании клонирования в вашей домашней директории должна появиться новая директория с именем needrestart


Теперь нам необходимо установить все зависимые пакеты, требуемые для работы needrestart (их список Вы можете найти в файле install.md):

gettext
Perl::Module::Find
Perl::Module::ScanDeps
Perl::Proc::ProcessTable
Perl::Sort::Naturally
Perl::Term::ReadKey
Perl::Locale::TextDomain
po-debconf

Устанавливаем их поочередно:

sudo apt-get install gettext
sudo apt-get install libmodule-find-perl
sudo apt-get install libmodule-scandeps-perl
sudo apt-get install libproc-processtable-perl
sudo apt-get install libsort-naturally-perl
sudo apt-get install libterm-readkey-perl
sudo apt-get install libintl-perl
sudo apt-get install libintl-xs-perl (если не установился при установке libintl-perl)
sudo apt-get install po-debconf

После этого переходим в директорию needrestart:

cd needrestart

И находясь в ней, последовательно выполняем две команды:

make
sudo make install

Если Вы все правильно сделали, то в итоге будет скомпилирован и запущен демон needrestart. 

Теперь дело осталось за малым - указать в настройках программы какой именно файл с ядром Linux считать правильным для нашей "малинки". Для этого отредактируйте файл /etc/needrestart/needrestart.conf следующим образом - найдите в нем строчку:

#$nrconf{kernelfilter} = qr(kernel7\.img);

И замените ее на следующую:

$nrconf{kernelfilter} = qr(kernel\.img);

Как Вы могли заметить - мы указали утилите needrestart считать корректным файлом ядра Linux файл kernel.img. Это справедливо для самых первых моделей Raspberry Pi и в том числе для обсуждаемой Raspberry Pi Zero W. Если Вы по данной инструкции конфигурируете иную версию Raspberry Pi, то настоятельно рекомендую сначала посетить данную страницу и ознакомиться какой именно файл ядра используется в вашей системе (в секции kernel). 

Осталось проверить успешность установки. В терминале просто наберите команду needrestart и если все корректно установилось, то Вы увидите процесс сканирования из псевдо-графики.


Есть такое? Значит все отлично! Теперь после установки нового или обновления существующего пакета, утилита needrestart будет проверять необходимость перезапуска затронутых установкой/обновлением служб и процессов. И при наличии такой необходимости предлагать это осуществить. А вот так, например, выглядит результат ее работы после установки программы, которая не потребовала ничего перезапускать после своей установки:


Согласитесь, весьма полезная программа! Особенно для пользователей Linux, которые только начинают делать в ней свои первые шаги :))).

Установка часового пояса.

Наверное, два самых первых популярных вопросах у всех начинающих пользователей Linux - как установить русскую раскладку и как поменять часовой пояс? И если с графическим интерфейсом данные вопросы стали решаться в духе "windows", то вот в терминальном режиме по-прежнему приходиться "ковыряться ручками". 

И сегодня я опишу как в Raspberry Pi OS сменить часовой пояс на свой. Для этого, как минимум, существуют три возможности: 

  • "классический" способ с помощью символической ссылки /etc/localtime указывающей на файл требуемого часового пояса (работает практически в любой версии ОС Linux)
  • с помощью функционала systemd (аналогично тому, как мы меняли имя хоста)
  • с помощью утилиты raspi-config (пожалуй, самый простой способ)
Рассмотрим все три варианта.

Вариант с помощью символической ссылки /etc/localtime полезен тем, что позволяет понять, как "фактически" это работает в ОС Linux, где "все есть файл"...  Для начала, необходимо определить какой часовой пояс Ваш и какой файл непосредственно относится к нему. С этой целью потребуется изучить содержимое каталога /usr/share/zoneinfo/. Именно в этой директории содержатся файлы, описывающие различные часовые пояса. Нужно учитывать, что содержимое этого каталога имеет древовидную структуру и необходимо по ней "идти" до конечного файла, который описывает именно ваш часовой пояс. Так содержимое непосредственно каталога /usr/share/zoneinfo/ (для просмотра содержимого каталога используется команда ls):


Как видно из скриншота, в каталоге есть директории, соответствующие целым материкам (например, Африка. Хотя она попутно является и частью света :-)))) так и частям света (например, Европа). В моем случае меня интересует Европа, т.к. я проживаю в России, в Самарской области и мне нужен часовой пояс города Самары. Просмотрим содержимое каталога /usr/share/zoneinfo/Europe/:


А вот тут и нашлась моя Самара. Соответственно, мне необходимо сделать символическую ссылку на файл /usr/share/zoneinfo/Europe/Samara. А Вам необходимо сделать ссылку на город с вашим часовым поясом. Что делать, если Вы не нашли в каталоге вашего города или ближайшего к вам крупного города? Просто подобрать город с таким же часовым поясом, что и ваш. Только в этом случае будьте внимательны, т.к. в некоторых странах разный подход к "летнему времени" и нужно убедиться, что настройки перехода на летнее время совпадают у Вас и в выбранной вами стране города.

Итак, делаем символическую ссылку /etc/localtime на файл с нужным часовым поясом:

sudo ln -sf /usr/share/zoneinfo/Europe/Samara /etc/localtime


После этого проверяем полученный результат командой date:


Все отлично - часовой пояс установился корректно (часовой пояс Самары - UTC +4 часа).

Теперь рассмотрим, как проделать аналогичную работу, но только с помощью средств systemd. Для этого в арсенале systemd есть такая утилита с "говорящим" именем как timedatectl (в ОС Linux, надо сказать, большинство утилит имеют "говорящие" наименования). Как следует из ее имени - она позволяет работать с настройками даты и времени. Так, помимо непосредственно установки нужной даты и времени, утилита позволяет просматривать текущие настройки и значения даты и времени. Для этого следует запустить утилиту timedatectl с опцией status:

timedatectl status


С помощью же опции list-timezones Вы можете просмотреть все доступные часовые пояса (временные зоны, если быть дословным):

timedatectl list-timezones


Правда, листать весь список в терминале - это еще то "удовольствие"... Учитывая, что это просто список всех комбинаций из директорий и содержащихся в них файлов, знакомой уже нам директории /usr/share/zoneinfo/ (см. первый способ установки часового пояса), то можно предварительно найти требуемый населенный пункт там, а можно отфильтровать вывод команды timedatectl с опцией list-timezones с помощью другой утилиты - grep. Например, таким вот образом мы отфильтруем весь список и оставим в нем только те строки, которые содержат "Europe" (обращаю внимание, что по умолчанию фильтр регистрозависимый и Europe и europe для него совершенно разные слова):

timedatectl list-timezones | grep Europe


Так список стал значительно короче ;))). А можно отфильтровать сразу по требуемому городу (если вдруг возникла необходимость проверить себя - есть такой в списке или нет). Например, та же Самара:

timedatectl list-timezones | grep Samara


Обожаю вот Linux за подобные штуки :))). Для того же, чтобы установить требуемый часовой пояс, необходимо запустить утилиту timedatectl с опцией set-timezone и наименованием временной зоны (не забываем делать это с привилегией root). Например, для установки часового пояса г. Самары (Россия):

sudo timedatectl set-timezone Europe/Samara


Обращаю внимание, что в отличии от первого способа, где мы указывали полный путь до файла, описывающий нужный нам часовой пояс, в этом случае мы указываем "наименование" часового пояса, складывающееся из наименования территории, знака "/", и наименования населенного пункта (как правило).

И на "закуску" еще один способ установить в Raspberry Pi OS свой часовой пояс, самый легкий из всех обсуждаемых. Для этого мы воспользуемся штатной утилитой raspi-config (утилита по конфигурированию Raspberry Pi). Запускаем ее с правами root:

sudo raspi-config

И в появившемся меню нас интересует пункт номер 5 - Localisation Options:


Выбираем его и далее пункт меню L2 - Timezone:


Ну, а далее необходимо определиться с географической территорией и населенным пунктом (часовым поясом). Полагаю, тут комментарии излишни.



Как видите, есть и такой способ, который позволяет настроить часовой пояс буквально за пару секунд без "утомительной" работы с терминалом :))).

И конечно же, не стоит забывать, что во всех моделях Raspberry Pi полностью отсутствуют часы реального времени (RTC). Поэтому, если Вы обесточите вашу "малинку" и не обеспечите ей наличие выхода в интернет, то не удивляйтесь, что при новом запуске часы будут показывать неверную дату и время (настройки часового пояса останутся неизменными). Если для Вас эта ситуация критична и для Вас очень важно, чтобы время и дата всегда были актуальны и никак не зависели от наличия доступа в интернет, а так же от возможных выключений/включений Raspberry Pi, то решение есть. И решение это состоит в приобретении отдельного аппаратного модуля. Например, что-то вроде этого устройства


Ну, а на сегодня - все! В следующей заметке мы установим и сконфигурируем http-сервер - "ядро" нашего web-сервера. Stay tuned :))). 


Tip & Tricks

Если Вы новичок в мире Linux и Вам весьма сложно осуществлять навигацию по файловой системе, то рекомендую установить файловый менеджер Midnight Commander. Его использование поможет Вам значительно ускориться при работе с файлами и каталогами. Интерфейс программы выполнен в духе старого-доброго Norton Commander (ну.... если это что-то Вам говорит :)))), и позволяет в том числе быстро просматривать и редактировать текстовые файлы (что приходиться делать даже очень часто при конфигурировании нового устройства). Так что, настоятельно рекомендую иметь его в своем "арсенале" пользователя Linux.

Для установки выполните команду:

sudo apt-get install mc

А для запуска просто наберите в терминале mc:

mc


И не забывайте, что, просто запустив файловый менеджер Midnight Commander командой mc, Вы запускаете его с теми правами, которые есть у вашего пользователя. Соответственно, если Вам потребуется отредактировать системные файлы, требующие привилегий пользователя root, у Вас это не получиться. Как самое простое решение, в таких ситуациях можно просто перезапустить Midnight Commander с правами root, используя sudo (да простят меня гуру-админы):

sudo mc


И всех новичков мира Raspberry Pi приглашаю стать участниками официального форума Raspberry Pi Foundation на котором даже есть ветка русскоязычных пользователей. И более того, иногда люди там даже отвечают на заданные вопросы :))). Так что, присоединяйтесь!

Комментариев нет:

Отправить комментарий