3 апр. 2018 г.

Умный дом на основе Majordomo

Это черновик!

Это черновая версия публикации. Возможно в ней содержатся неточности и отсутствуют некоторые поясняющие фрагменты. Даже не смотря на это текст можно использовать в качестве знакомства с принципами работы Majordomo.

Системные требования

Что нужно для работы majordomo:

  1. веб-сервер
  2. php
  3. mysql

Выбор веб-сервера.

Так сложилось, что я не вижу большой необходимости в Apache для себя. Единственную функцию, которую он для меня выполняет - это разгребание .htaccess. Однако у меня нет задачи сделать хостинг для кого-то, у меня свой сервер, поэтому самым оптимальным будет спрятать эти правила в конфигурацию nginx. Тем более работающая конфигурация для nginx уже есть на сайте разработчиков.

Устанавливается nginx штатными средствами.

Файлы настроек nginx располагаются в папке /etc/nginx. В Debian-based дистрибутивах, в том числе Raspbian, nginx уже по умолчанию сконфигурирован на работу с виртуальными хостами, настройки которых хранятся в папке sites-available. Для включения виртуального хоста необходимо создать символическую ссылку в папке sites-enabled на созданный файл конфигурации виртуального хоста.

Если же конфигурация отличается, то можно самостоятельно прописать в секции http файла nginx.conf строку:

include /etc/nginx/sites.d/*.conf;

В этом случае внутрь секции http будут включены все файлы с расширением .conf из папки sites.d, которую необходимо будет создать.

На этом предварительную настройку nginx можно считать законченной. Дальнейшую настройку можно будет провести после установки php.

Установка PHP

Как известно на Apache можно установить PHP в виде модуля. Для nginx же из известных мне вариантов только подключение с использованием FastCGI. Впрочем, ещё в версии PHP 5.4 в самом PHP появился свой FastCGI Process Manager. Так что ничего лишнего устанавливать будет не нужно, всё уже есть «из коробки».

На Raspbian установить почти всё необходимое можно с помощью команды:

sudo apt-get install php-fpm

Для работы php из командной строки необходимо установить модуль php-cli.

После доустановки необходимых модулей для запуска Majordomo у меня получился следующий список:

  • php-cli
  • php-common
  • php-curl
  • php-fpm
  • php-gd
  • php-json
  • php-mbstring
  • php-mysql
  • php-opcache
  • php-readline
  • php-xml

Стандартный скрипт установки Majordomo предлагает более широкий набор модулей:

sudo apt-get -qq install -y php
sudo apt-get -qq install -y php-bz2 
sudo apt-get -qq install -y php-cli 
sudo apt-get -qq install -y php-common 
sudo apt-get -qq install -y php-curl 
sudo apt-get -qq install -y php-gd 
sudo apt-get -qq install -y php-json 
sudo apt-get -qq install -y php-mbstring 
sudo apt-get -qq install -y php-mcrypt 
sudo apt-get -qq install -y php-mysql 
sudo apt-get -qq install -y php-opcache 
sudo apt-get -qq install -y php-readline
sudo apt-get -qq install -y php-xml 
sudo apt-get -qq install -y php-mysql 
sudo apt-get -qq install -y php-pear
sudo apt-get -qq install -y php-idn 
sudo apt-get -qq install -y php-imagick 
sudo apt-get -qq install -y php-imap 
sudo apt-get -qq install -y php-memcache 
sudo apt-get -qq install -y php-mhash 
sudo apt-get -qq install -y php-ming 
sudo apt-get -qq install -y php-ps 
sudo apt-get -qq install -y php-pspell 
sudo apt-get -qq install -y php-recode 
sudo apt-get -qq install -y php-snmp 
sudo apt-get -qq install -y php-tidy 
sudo apt-get -qq install -y php-xmlrpc 
sudo apt-get -qq install -y php-xsl 
sudo apt-get -qq install -y php-json

Если у вас возникли проблемы с функционированием Majordomo, можете доустановить рекомендуемое.

Возможно при установке модулей потребуется явно указать версию php, для чего в наименовании пакеты нужно прописать php5-* или php7.0-*. Лично я не рекомендую использовать PHP 5 версии, т.к. в версии 7.0 разработчиками проделана значительная работа по оптимизации производительности (для системы на Raspberry Pi это особенно важно из-за небольшого количества ресурсов) и, кроме того, PHP 7.0 вышла в конце 2015 года и по стабильности не хуже PHP 5.

Конфигурация php хранится, как правило, в папке /etc/php. При этом внутренняя структура может отличаться на разных дистрибутивах. Например, на Raspbian конфигурация FPM хранится в папке /etc/php/7.0/fpm, а в Gentoo /etc/php/fpm-php7.0. В любом случае структура похожа. Нас интересует папка pool.d или fpm.d, во втором случае. Внутри этой папки расположен файл www.conf. Это пул процессов по имени www обрабатывающий запросы к PHP.

Настроим пул. Необходимо сделать минимум изменений в оригинальном файле. Во-первых, нужно указать системное имя пользователя и группу от имени которого будет запущены процессы PHP. Самым оптимальным будет использование того же самого пользователя, что и указан в конфигурации веб-сервера. Находим следующие строки и указываем своего пользователя:

user = www
group = www

Следующий интересующий нас параметр - прослушиваемый PHP-FPM сокет. Это может быть как TCP, так и unix. Можно просто записать значение параметра (его мы будем указывать в настройках nginx), либо указать своё значение. Вот так у меня выглядело значение по умолчанию:

listen = 127.0.0.1:9000

Это самый простой способ настроить PHP-FPM. Однако, поскольку наш PHP-FPM работает на той же машине, что и веб-сервер, можно воспользоваться unix-сокетами. При этом серверу не нужно будет использовать весь стек протоколов TCP/IP, который имеет свои накладные расходы. Однако, при использовании unix-сокета необходимо, чтобы у создаваемого ресурса были корректно выставлены права доступа. Находим и настраиваем следующие параметры (некоторые нужно будет раскомментировать):

listen = /run/php/php7.0-fpm.sock;
listen_owner = www
listen_group = www
listen_mode = 660

Вместо www укажите того же самого пользователя, что указывали в настройках веб-сервера и выше в этом файле конфигурации. Как не трудно догадаться, будет создан файл ресурса /run/php/php7.0-fpm.sock и владельцем www и группой www, а также правами доступа 660, т.е. доступный только для пользователя и группы, но не всех пользователей системы. Ещё неплохо будет убедиться, что папка /run/php существует и она доступна пользователю www (или того, который вы используете) для записи.

Теперь настал момент настройки nginx. Можно прописывать настройки php в каждый файл с виртуальным хостом, а можно прописать глобально. Даже не смотря на то, что у нас имеется только один виртуальный хост, воспользуемся вторым вариантом, как более «правильным». Для этого в файле /etc/nignx/nginx.conf найдём секцию http и добавим следующие строки (можно это сделать в самом начале секции после открывающейся фигурной скобки):

    upstream php-fpm {
 server unix:/run/php/php7.0-fpm.sock;
    }

Указанное нами имя php-fpm можно будет указывать в директиве fastcgi_pass в настройках виртуального хоста. Благодаря директиве upstream мы можем в любой момент изменить глобально настройки php, при этом все виртуальные хосты подхватят это изменение.

После этой настройки мой файл nginx.conf принял такой вид:

user www;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
 worker_connections 768;
 # multi_accept on;
}

http {
    upstream php-fpm {
 server unix:/run/php/php7.0-fpm.sock;
    }

 ##
 # Basic Settings
 ##

 sendfile on;
 tcp_nopush on;
 tcp_nodelay on;
 keepalive_timeout 65;
 types_hash_max_size 2048;

 include /etc/nginx/mime.types;
 default_type application/octet-stream;

 ##
 # SSL Settings
 ##

 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
 ssl_prefer_server_ciphers on;

 ##
 # Logging Settings
 ##

 access_log /var/log/nginx/access.log;
 error_log /var/log/nginx/error.log;

 ##
 # Gzip Settings
 ##

 gzip on;
 gzip_disable "msie6";

 # gzip_vary on;
 # gzip_proxied any;
 # gzip_comp_level 6;
 # gzip_buffers 16 8k;
 # gzip_http_version 1.1;
 # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

 ##
 # Virtual Host Configs
 ##

 include /etc/nginx/conf.d/*.conf;
 include /etc/nginx/sites.d/*.conf;
}

Настройка MySQL-сервера

В качестве MySQL-сервера для Majordomo можно использовать как оригинальный сервер, так и его форк MariaDB. Детальную настройку сервера опишу чуть позже.

Тут необходимо описать как настроить сервер, как создать базу данных и залить туда информацию, а также указать куда прописать реквизиты доступа.

При использовании MariaDB по умолчанию для пользователя root подключен плагин unix_socket. Это означает, что пользователь root не может использоваться при TCP соединении. Из-за этого нельзя зайти через phpMyAdmin. Самым безопасным вариантом является создание через командную строку своего пользователя и назначить ему глобальные привилегии. В качестве альтернативы можно просто записать пустую строку в поле plugin базы user в базе данных mysql, что, конечно, понизит безопасность системы.

Запуск сайта Majordomo

Основной интерфейс Majordomo выполнен в виде сайта. Скачиваем дистрибутив и распаковываем, например, в папку /var/www/majordomo. С помощью команды chown -R www:www /var/www/majordomo передаём эту папку нашему пользователю, от имени которого работает nginx и php. Задать права доступа для файлов и папок можно с помощью скрипта install-linux.sh в корневой папке. НО! В нём указаны команды chmod 777 и chmod 666, что явно излишне. Нам будет достаточно прав 770 и 660 или, даже, 750 и 640. Исправьте эти значения внутри файла, разрешите запуск скрипта с помощью команды chmod +x install-linux.sh и запустите его.

Создадим файл виртуального хоста в соответствующей папке, которую мы определили при настройке веб-сервера. Создаём там файл majordomo.conf:

server {
    listen 80 default_server;
    server_name  majordomo.localhost;

    charset utf-8;

    access_log  /var/log/nginx/majordomo_access.log;
    error_log  /var/log/nginx/majordomo_error.log;

    root   /var/www/majordomo;

    index  index.php index.htm index.html;

    location ~ index\.html$ {
    }

    location  fckeditor {
    }

    location ~ banner\.html$ {
    }

    location  flashcoms {
    }

    location  google {
    }

    location  fck {
    }

    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        index  index.html index.htm index.php;
        # Uncomment to enable naxsi on this location
        # include /etc/nginx/naxsi.rules
      rewrite pda$ /popup/pda.html redirect;
        if (!-e $request_filename){
            rewrite ^(.*)$ /nf.php;
        }
        if (!-e $request_filename){
            rewrite ^(.*)$ /nf.php;
        }
    }

    location /config.php {
        deny all;
    }

    location /debmes.txt {
        deny all;
    }

    location ~ /\.ht {
        deny all;
    }

    location ~ \.php$ {
 fastcgi_pass php-fpm;
        fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Я использовал один из вариантов конфигурации, который нашёл на сайте разработчика. Поясню некоторые из директив.

listen - указывает какой адрес и порт должен прослушивать веб-сервер для получения запросов к этому сайту. При указании только номера порта, как указано в конфигурации, прослушивание будет вестись на всех доступных серверу IP-адресах. Добавление директивы default_server позволит веб серверу всегда выводить этот сайт, в том числе по запросу через IP-адрес. Если хост один, то директиву можно и не добавлять. Позже расскажу как можно разнести несколько сайтов на одном хосте.

server_name - доменное имя сайта. Если у вас несколько виртуальных хостов на сервере и вы не указали директиву default_server, то попасть на этот сайт вы можете только если в адресной строке вашего браузера будет указано это доменное имя. Можно также указать несколько имён через пробел, например, добавить www.majordomo.localhost.

access_log и error_log - настройка, соответственно, логов доступа на сайт и логов ошибок. Если они вам не нужны просто закомментируйте эти строки или не указывайте их совсем.

root - собственно указание каталога где хранится сайт.

Теперь необходимо создать файл конфигурации Majordomo. Пример такого файл есть в корне проекта config.php.sample. Создаём его копию config.php. На что необходимо обратить внимание:

  • define констант с именами DB_*, это ни что иное, как реквизиты доступа к базе данных, в том числе: DB_HOST - хост базы данных (127.0.0.1 или localhost, скорее всего ваш вариант), DB_NAME - им базы данных, DB_USER - пользователь MySQL от имени которого будет осуществляться доступ к базе данных (указывали на этапе настройки MySQL), DB_PASSWORD - пароль пользователя (также указывали на этапе настройки MySQL);
  • date_default_timezone_set - ваш часовой пояс (также необходимо настроить его в MySQL, допишу позднее);
  • define('BASE_URL', 'http://127.0.0.1:80'); - здесь вместо http://127.0.0.1:80/ нужно указать корректный адрес, по которому демон сможет обратиться к вашему веб-сайту. Если у вас только один сайт, то можно оставить существующее значение, но если несколько виртуальных хостов, то необходимо установить корректное значение. Я установил это значение неверно и столкнулся с неработоспособностью модуля XiaomiHome. Возможно аналогичным образом работают и другие модули работы с оборудованием.

Запускаем демона

В терминологии разработчиков Majordomo системный сервис называется циклом. По сути это системный демон написанный, также на PHP, который работает в фоне и обеспечивает выполнение текущих задач и получение информации с датчиков.

Для обеспечения автоматического запуска нужного сервиса создаём файл конфигурации для systemd: /lib/systemd/system/majordomo.service (не могу ручиться, что создаю в правильном месте, позже будет уточнение)

[Unit]
Description=MajorDoMo

[Service]
Requires=mysql.service
Requires=nginx.service
Type=simple
WorkingDirectory=/var/www/majordomo
ExecStart=/usr/bin/php /var/www/majordomo/cycle.php
ExecStop=/usr/bin/pkill -f cycle_*.php
Restart=always
User=www
Group=www

[Install]
WantedBy=multi-user.target

Не забываем вместо www указывать того же пользователя и группу, что использовали ранее.

В список требований перед запуском сервиса указан Requires=nginx.service. Это необходимо для того, что некоторые модули, например, XiaomiHome передают данные с датчиков с помощью запросов к веб-серверу. У меня работает и без этой строки.


Итог

После всех этих настроек мы получаем работающий сервер Majordomo. Рекомендую после проведения настроек перезагрузить сервер. Таким образом можно убедиться, что все сервисы стартуют успешно.

25 нояб. 2015 г.

Как я ставил Windows без DVD/CD, флешки и сети

Возникла тут задача установить Windows на компьютер без DVD/CD.

Первая мысль была установить с флешки. День колдовал с флешкой, ничерта не грузится. Даже Ubuntu пробовал. Загружается. А Windows установочный никак. Кстати, позже проверил флешку на другом ПК, там всё загрузилось.

Вторая мысль - загрузиться по сети и установить. наличие настроенного сервера делало эту задачу, вроде бы, легко выполнимой. Но нет. Облегчённая версия Windows успешно грузилась по сети и в тот момент когда можно было бы подключать сетевой диск с дистрибутивом сетевая карта неожиданно умирала. Точнее пропадал линк и Windows PE уходила в вечное ожидание сети.

И тут в голову неожиданно пришла идея поставить систему в виртуальной машине... БРЕД? Нет. Всё сработало!.

Что нам необходимо для установки:

  1. VirtualBox
  2. Образ системы на диске или в файле ISO (ну или любой другой формат, которые съест VirtualBox).
  3. Контейнер для HDD или, на крайний случай, место в системнике для подключения второго винта на который будет ставиться система.

Приступаем к установке.

Для начала выясним как обзывается мой второй HDD. На Linux сделать это проще простого. Подключаю внешний диск и смотрю что появилось в /dev - у меня это /dev/sdb. Отлично. Создаю в удобном месте файл sdb.vmdk

VBoxManage internalcommands createrawvmdk -filename sdb.vmdk -rawdisk /dev/sdb

Виртуальный образ, а точнее ссылка на реальный HDD, для VirtualBox создан. Остаётся создать новую машинку, использовать в качестве HDD созданный образ и подключить желаемый ISO-образ с дистрибутивом в качестве CD/DVD. Не забываем о правах доступа к /dev/sdb*. Или даём при подклчении права 666 на все разделы, или вступаем в группу disk (или как группа называется в вашем дистрибутиве Linux).

Начинаем установку Windws. Ждём пока установка дойдёт до первой перезагрузки. Выключаем нашу виртуальную машину, достаём HDD из контейнера и ставим в наш ПК. Включаем ПК и наблюдаем продолжение установки уже на реальной машине. Всё. Система установлена.

3 сент. 2015 г.

Настройка ssl на сервере nginx

Каждый год приходится обновлять сертификат для сайтов, работающих через https. Решил описать весь процесс настройки. В качестве домена для демонстрации используется www.example.com.

Подробнее о настройке ssl можно узнать в официальной документации nginx.

На сайте StartSSL создаём сертификат «Web Server SSL/TLS Certificate».

Первым получаем секретный ключ *.key. Сохраняем его в файл www.example.com.key. Данный ключ защищён паролем. Можно поступить двумя способами:

  1. создать файл с паролями от секретных ключей (каждый пароль указан на отдельной строке) и указать путь к нему в директиве ssl_password_file;
  2. расшифровывать ключ командой openssl rsa -in www.example.com.key -out www.example.com.nopass.key.

Первый необходимый нам файл получен. Его нужно скормить директиве ssl_certificate_key в конфигурации nginx.

Далее получаем сертификат в формате PEM. Сохраняем его в файл www.example.com.crt. Обязательно проверяем, что в файле есть пустая строка в конце. Далее склеиваем с промежуточным сертификатом sub.class1.server.ca.pem ссылку на который вы можете найти на странице получения сертификата или через меню сайта StartSSL.:

cat www.example.com.crt sub.class1.server.ca.pem > www.example.com.pem

Файл www.example.com.pem скармливаем директиве ssl_certificate. Сертификат действителен на указанный вами домен третьего уровня, так и второго example.com. Добавить в сертификат дополнительные поддомены на бесплатном аккаунте startssl.com нельзя. Если на одном IP адресе требуется создать несколько SSL-сайтов можно воспользоваться SNI (Server Name Indication) — технология установки нескольких SSL сертификатов на один IP Поддержка SNI есть во всех современных браузерах. Проверить включена ли данная технология в вашем nginx можно командой nginx -V:

# nginx -V
nginx version: nginx/1.10.0
built with OpenSSL 1.0.2h  3 May 2016
TLS SNI support enabled
...

В выводе должно быть отображено сообщение «TLS SNI support enabled».

Настроим параметры SSL.

    ssl_session_timeout 10m;              # Увеличим время жизни сессий, по умолчанию 5 минут
    ssl_session_cache shared:SSL:10m;     # Размер разделяемого процесссами кэша
#    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Версия 1.9.1 и более поздних это значение по умолчанию, можно не указывать
#    ssl_ciphers "EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:
#                 EECDH+aRSA+SHA256:EECDH:EDH+aRSA:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4";
#    ssl_prefer_server_ciphers on;        # Установить более высокий приоритет серверным шифрам, чем клиентским
    ssl_password_file ssl/ssl.passwd;     # Файл с паролями от ключей (по одному на строку)   

При таком значении ssl_protocols отключены некоторые небезопасные протоколы (начиная с nginx 1.9.1 это значение по умолчанию), однако могут возникнуть проблемы с доступом для пользователей Internet Explorer под Windows XP.

Параметр ssl_ciphers здесь разбит на 2 строки для удобочитаемости. Описывает разрешённые шифры. Шифры задаются в формате, поддерживаемом библиотекой OpenSSL. В данном случае значение параметра я просто скопировал с сайта http://айри.рф/. За подробностями можете перейти по ссылке.

Если мы хотим распространить параметры настройки для всех сайтов, то данный код необходимо поместить в секцию http файла конфигурации.

Создаём виртуальный HTTPS-сервер и включаем SSL. Полученные на первом этапе файлы www.example.com.pem и www.example.com.key размещаем в папке ssl в папке настроек nginx (или любом другом месте по вкусу).

server {
    listen 443 ssl http2;
    ssl_certificate ssl/www.example.com.pem;     # Сертификат данного виртуального сервера и промежуточный сертификат StartSSL
    ssl_certificate_key ssl/www.example.com.key; # Секретный ключ

    # Другие настройки вашего сайта
}

Указывать ssl on не обязательно, и.к. это развнозначно использованию ssl в параметре listen.

Начиная с версии nginx 1.9 имеется поддержка протокола HTTP/2. В данной конфигурации мы активируем этот протокол. Для старых версий nginx можно использовать spdy.

При необходимости можно перенести некоторые настройки ssl из секции http в секцию server.

Для безопасности для папки ssl/ желательно установить права 700 и отдать её root. Все содержащиеся в них ключи, сертификаты и файл с паролями также отдать root и установить права доступа 600.

На этом настройку можно считать законченной. Можете убедиться, что ваш сайт https://www.example.com/ доступен и браузер принимает сертификат.

15 дек. 2014 г.

Памятка по установке GRUB2 и загрузке через EFI в Gentoo x64.

ПРЕДУПРЕЖДЕНИЕ! Всё, что вы делаете со своим компьютером вы делаете на свой страх и риск. Эта заметка создавалась с целью сохранения накопленного опыта для себя. Возможно, в будущем, я ещё раз проверю все действия и внесу в текст уточнения.

Уж очень много времени убил на поиск рабочего варианта. Итак!

Во-первых, при разметке диска нужно создать раздел с файловой системой FAT. На нём и будут располагаться ядро системы или Grub 2. Этот раздел нужно подключить в /boot/EFI. Хотя я в своё время сделал весь раздел /boot в FAT32. Далее рассматривается именно этот вариант.

Что нам понадобится:

  • sys-boot/grub — непосредственно GRUB2. Не забываем включить efi-64 в GRUB_PLATFORMS в файле /etc/portage/make.conf.
  • sys-boot/os-prober — нужен если мы ходим, чтобы GRUB2 находил что-то ещё, кроме ядер Linux, например, загрузчик Windows.
  • sys-boot/efibootmgr — утилита для настройки EFI.

После сборки нужных пакетов устанавливаем GRUB2:

grub2-install --target=x86_64-efi --efi-directory=/boot

Не забываем положить нужные ядра в /boot. После этого можно сгенерировать конфиг для grub2:

grub2-mkconfig -o /boot/grub/grub.cfg

Проверим, всё ли в порядке c EFI:

# efibootmgr -v
BootCurrent: 0000
Timeout: 1 seconds
BootOrder: 0000,0001
Boot0000* GRUB2 HD(1,800,f3800,927dfa8b-a8da-4a33-ae18-3cbab9449dbb)File(\EFI\gentoo\grubx64.efi)
Boot0001* Windows Boot Manager HD(1,800,96000,b0a33380-d8c1-4402-b7da-7d1214ebfd4c)File(\EFI\Microsoft\Boot\bootmgfw.efi)WINDOWS.........x...B.C.D.O.B.J.E.C.T.=.{.9.d.e.a.8.6.2.c.-.5.c.d.d.-.4.e.7.0.-.a.c.c.1.-.f.3.2.b.3.4.4.d.4.7.9.5.}...s................

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

efibootmgr -b XXXX -B

и создать угодную нам. ВНИМАНИЕ! Главное не перестарайтесь и не полудаляйте что-нибудь ценное.

efibootmgr -c -d /dev/sdb -p 1 -L "GRUB2" -l \\EFI\\gentoo\\grubx64.efi

(двойных слешей можно не делать, если взять имя файла в кавычки). Обратите внимание на направление слеша - оно не типичное для *nix систем.

Если лень ждать каждый раз загрузку GRUB и выбирать ядро, можно скопировать нужную версию ядра в любую папку в /boot/EFI и указать путь к ней:

efibootmgr -c -d /dev/sdb -p 1 -L "Gentoo Linux" -l \\EFI\\gentoo\\vmlinuz.efi

В результате получим что-то вроде:

# efibootmgr -v
BootCurrent: 0000
Timeout: 1 seconds
BootOrder: 0000,0002,0001
Boot0000* Grub 2 HD(1,800,f3800,927dfa8b-a8da-4a33-ae18-3cbab9449dbb)File(\EFI\gentoo\grubx64.efi)
Boot0001* Windows Boot Manager HD(1,800,96000,b0a33380-d8c1-4402-b7da-7d1214ebfd4c)File(\EFI\Microsoft\Boot\bootmgfw.efi)WINDOWS.........x...B.C.D.O.B.J.E.C.T.=.{.9.d.e.a.8.6.2.c.-.5.c.d.d.-.4.e.7.0.-.a.c.c.1.-.f.3.2.b.3.4.4.d.4.7.9.5.}...s................
Boot0002* Gentoo Linux HD(1,800,f3800,927dfa8b-a8da-4a33-ae18-3cbab9449dbb)File(\EFI\gentoo\vmlinuz.efi)

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

Если что-то сделали не так (кстати, нужно определённым образом сконфигурировать ядро, об этом позже), то просто выбираем в меню загрузки GRUB2 и грузим рабочее ядро. Если грузить ядро напрямую, то загрузка компьютера производится очень быстро!!!

20 февр. 2014 г.

Загружаем загрузчик linux по сети

Надеюсь со временем эта заметка вырастет во что-то больше. Но хотелось бы описать просто то, что раньше не мог понять и собирал по крупицам на русском языке, а потом нашёл немного времени разобраться что и как. Закончилось всё хорошо. Загрузилось красивое меню, куда можно добавлять разные нужные штуковины для загрузки по сети. Грузить пока ничего не будем, может быть позже :) Всё действо происходит под Gentoo, но пользователи иных дистрибутивов (и даже пользователи BSD) могут воспользоваться своими apt-get, aptitude, rpm, pacman, portmaster и т.д. по вкусу. Возможно, пути не всегда будут совпадать, надеюсь вы разберётесь сами.

Первое, что нужно сделать, это настроить свой DHCP-сервер. Обычно я использую net-misc/dhcp, т.е. isc-dhcpd. Всё, что нам нужно, это указать что мы будем грузить по сети и с какого сервера.

filename="pxelinux.0" # Какой мы файл будем загружать с нашего сервера. Можно указать файл где-то глубже в папке.
next-server="192.168.1.1" # Адрес нашего TFTP-сервера.

Добавляем эти строчки в глобальную секцию dhcpd.conf, если хотим предоставить наши услуги всем нашим сетям или в секцию subnet нужной сети. next-server можно не указывать, если ваш TFTP-сервер расположен на том же хосте, что и DHCP.

Как вы уже наверно поняли, нам понадобится ещё и TFTP-сервер. Можно использовать, например, net-ftp/tftp-hpa или net-ftp/atftp. Оба сервера ставятся без проблем, настройки минимальные. Корень TFTP сервера в обоих случаях размещается в /tftproot/. Запускаем наш TFTP-сервер и начнём заниматься его наполнением.

Третий компонент, необходимый для загрузки по сети, как ни странно, загрузчик linux. Его мы можем найти в пакете sys-boot/syslinux. В нём содержится множество разных загрузчиков, в том числе, необходимый нам pxelinux. После установки пакета заглядываем в /usr/share/syslinux и /usr/share/doc/syslinux-{ВЕРСИЯ}. В первой папке мы можем найти все необходимые нам файлы, а во второй можно узнать подробности о настройке загрузчика. Попробуем загрузить красивое меню для выбора того, что нам загружать в дальнейшем. Для этого нам понадобится загрузчик pxelinux.0 и красочное меню vesamenu.c32 (или текстовое меню menu.c32). Скопируем их в корень нашего TFTP-сервера, папку /tftproot/. Расскажем загрузчику что же мы хотим загружать. Для этого создадим в папке с pxelinux.0 папку с именем pxelinux.cfg. Внутри папки размещаются файлы конфигурации для наших клиентов. Можно задать свой индивидуальный файл для каждого клиента, группы и по умолчанию. Порядок поиска файлов конфигурации можно найти в файлах документации /usr/share/doc/syslinux-{ВЕРСИЯ}/pxelinux.txt.bz2 и menu.txt.bz2. Создадим в папке pxelinux.cfg файл default, который будет использоваться всеми клиентами для которых вы не задали конфигурацию.

UI vesamenu.c32 # Указываем какой интерфейс мы будем использовать

MENU TITLE My PXE boot menu # Заголовок меню
PROMPT 0 # Пункт меню, выбираемый по умолчанию (нумерация с 0)
TIMEOUT 50 # Количество секунд до автоматического выбора пункта меню умноженное на 10

LABEL Boot from first HDD # наименование пункта меню
LOCALBOOT 0x80 # загружаемся с первого HDD

Теперь можно попробовать запустить другой ПК или даже виртуальную машину в VirtualBox и вы должны увидеть красивую меню с единственным пунктом загрузки с HDD.

На этом всё. Следите за обновлениями данного поста! Всем удачной загрузки по сети!!!

15 окт. 2013 г.

Установка GRUB2

После недавнего обновления portage в gentoo прилетела обновка для GRUB. Отныне GRUB2 считается стабильным, а значит при апгрейде системы будет установлен. Причин оставаться на GRUB Legacy я не вижу, поэтому решил проапгрейдиться.

Последовательность действий для обновления:

  1. в /etc/portage/make.conf добавляем переменную, указывающую, что наш GRUB собирается для платформы PC:
    GRUB_PLATFORMS="pc"
  2. обновляем grub через emerge;
  3. монтируем папку /boot если она у вас на отдельном разделе;
  4. устанавливаем новую версию grub (вот тут я себе набил шишку):
    grub2-install /dev/sda
    обязательно указываем непосредственно HDD, а не раздел на нём!!! Никаких sda1!!!
  5. Правим файл /etc/defaults/grub где указываем нужные опции (читаем документацию), например, я себе включил дефолтную тему со звёздами;
  6. Создаём файл конфигурации grub, который является ничем иным, как скриптом (кстати, его не рекомендуется изменять непосредственно, а только через правку файла из предыдущего пункта):
    grub2-mkconfig -o /boot/grub/grub.cfg
    В процессе формирования проверяются все имеющиеся в /boot ядра, по умолчанию будет загружаться самое старшее ядро (если вы не правили /etc/default/grub).
На этом всё. Ваша система при следующем запуске должна успешно стартовать. Если кроме Linux у вас на компьютере есть другие операционные системы, то установите sys-boot/os-prober.

11 окт. 2013 г.

Настройка WiFi в Gentoo

На удивление быстро настроился WiFi на Gentoo. Поскольку заметка написана уже после настройки WiFi, то могут быть неточности. Замечания и полезные комментарии приветствуются. Если будет необходимо, заметка будет доработана.

По некоторым соображениям я не люблю NetworkManager, поэтому настройку сети предпочитаю делать через конфигурационные файлы и командную строку.

Что нам понадобится для настройки:

  • поддержка нашего адаптера в ядре;
  • опция в ядре для поддержки iw
    [*] Networking support --->
    -*- Wireless --->
    cfg80211 wireless extensions compatibility
  • пакет net-wireless/iw;
  • пакет net-wireless/wpa_supplicant для подключения к точкам доступа с WPA (по мне так дико настраивать точки доступа иначе).

Будем считать, что ядро вы уже собрали так, как нужно и по ifconfig или ip addr мы получаем в списке адаптеров наш wlan0 или wlp3s0. Установим необходимые пакеты.

Проверим работоспособность нашего WiFi:

iw list
В ответ вы должны получить список доступных точек доступа. Если выдаются ошибки, то дальнейшие действия вам не помогут. Если вы в списке не нашли вашей точки доступа, то проверьте, что она расположена на каналах с 1 по 11. У меня ранее были проблемы при использовании 13 канала!

Настроим сеть с помощью редактирования /etc/conf.d/net

modules_wlp3s0="wpa_supplicant" #Будем использовать WPA.
wpa_supplicant_wlp3s0="-Dnl80211" #Загрузим соответствующий модуль.
config_wlp3s0="dhcp" #Адрес будем получать автоматически.
Если желаете, то можете вместо dhcpd использовать статический IP адрес и другие опции, которые можно найти в документации Gentoo по настройке сети.

Создадим конфигурацию для подключения к нашей точке доступа. Для этого создадим или отредактируем файл /etc/wpa_supplicant/wpa_supplicant.conf:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=wheel
update_config=1

###### собственно конфигурация ######
network={
 priority=1
 ssid="port66"
 mode=0
 key_mgmt=WPA-PSK
 psk="WPA_PASSWORD"
}
WPA_PASSWORD - это ничто иное, как пароль к точке доступа. Секций network может быть несколько - по одной для каждой точки доступа.

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

Множество полезной информации по настройке WiFi можно найти на сайте http://wireless.kernel.org/.

Решение проблем

Столкнулся с проблемой настройки WiFi на ноутбуке Compaq C6510b. Во-первых, WiFi упорно не хотел включаться кнопкой, только выключался. Решить эту проблему помогли пара опций в ядре: CONFIG_ACPI_WMI и CONFIG_HP_WMI. Вместо второй вам возможно потребуется другая опция. Для этого поищите я опциях ядра WMI и найдите нужную опцию конкретно для вашей беспроводной сетевой платы.

Второй проблемой была жёсткая блокировка WiFi. rfkill list упорно выдавал Hard blocked: yes. По идее этой блокировкой управляет кнопка включения/выключения WiFi. Но не смотря ни на что, блокировка была. Решить эту проблему оказалось не просто, а очень просто: достаточно выдернуть кабель из порта Ethernet. Блокировка снята! Если же вам всё-таки нужно использовать одновременно WiFi и Ethernet, то нужно зайти в BIOS Setup и отключить опцию переключения LAN/WLAN. Что характерно, при включении этого переключателя, при блокировке WiFi индикатор не гаснет, что и сбивает с толку. Просто этот индикатор на данном ноутбуке сдвоенный и отображает активность обоих беспроводных интерфейсов: WiFi и Bluetooth.