<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0">

<channel>

<title>Блог ни о чём, заметки с тегом: сисадминство</title>
<link>https://gladilov.org.ru/blog/tags/anykeing/</link>
<description></description>
<generator>E2 (v3249; Aegea)</generator>

<item>
<title>Проброс событий в ClickHouse с использованием Vector</title>
<guid isPermaLink="false">2955</guid>
<link>https://gladilov.org.ru/blog/all/forward-events-to-clickhouse-with-vector-and-balancer/</link>
<comments>https://gladilov.org.ru/blog/all/forward-events-to-clickhouse-with-vector-and-balancer/</comments>
<description>&lt;p&gt;От устройства снаружи ИС на фронтальные балансировщики приходят сообщения в локейшн&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;/&amp;lt;device_location&amp;gt;/status&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;Файл журнала&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;/var/log/&amp;lt;device_access_log_file_path&amp;gt;.status.access.log&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt; разбирается с помощью vector, пересылающий события на внутренний балансировщик. Между фронтальными и внутренними балансировщиками есть сетевая связность по порту TCP&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;&amp;lt;port&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;Конфиг vector на фронтальных балансировщиках: &lt;b class="spoiler-controller pop-up_camper_clickhouse-vector-balancer-1"&gt;Показать&lt;/b&gt;&lt;section class="spoiler pop-up_camper_clickhouse-vector-balancer-1"&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;sources:
  device-status:
    type: &amp;quot;file&amp;quot;
    max_line_bytes: 1638400
    include:
      - /var/log/&amp;lt;device_access_log_file_path&amp;gt;.status.access.log

transforms:
  device-status_filter:
    type: &amp;quot;filter&amp;quot;
    inputs:
      - device-status
    condition:
      .message != &amp;quot;&amp;quot;

  device-status_transform:
    type: &amp;quot;remap&amp;quot;
    inputs:
      - device-status_filter
    source: |
      .message = parse_jsonI(.message)
      .message.traffic_source = .host
      . = .message

sinks:
  sink_clickhouse:
    type: &amp;quot;clickhouse&amp;quot;
    inputs:
      - device-status_transform
    endpoint: &amp;quot;http://&amp;lt;inner_BGP_IP&amp;gt;:&amp;lt;port&amp;gt;&amp;quot;
    format: &amp;quot;json_as_string&amp;quot;
    healthcheck:
        enabled: false
    auth:
      strategy: &amp;quot;basic&amp;quot;
      user: &amp;quot;&amp;lt;clickhouse_DB_user&amp;gt;&amp;quot;
      password: &amp;quot;&amp;lt;clickhouse_DB_password&amp;gt;&amp;quot;
    database: &amp;quot;&amp;lt;clickhouse_DB&amp;gt;&amp;quot;
    table: &amp;quot;&amp;lt;clickhouse_table&amp;gt;&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;&lt;/section&gt;&lt;/p&gt;
&lt;p&gt;Конфиг внутреннего балансировщика, пробрасывающего события в clickhouse: &lt;b class="spoiler-controller pop-up_camper_clickhouse-vector-balancer-2"&gt;Показать&lt;/b&gt;&lt;section class="spoiler pop-up_camper_clickhouse-vector-balancer-2"&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;stream {
include /etc/&amp;lt;path_to_balancer_config&amp;gt;/log-format-s.conf;

upstream clickhouse8123 {
    server &amp;lt;clickhouse_BGP_IP&amp;gt;:8123;
    server &amp;lt;clickhouse_node1_IP&amp;gt;:8123 backup;
    server &amp;lt;clickhouse_node2_IP&amp;gt;:8123 backup;
}

server {
    listen &amp;lt;port&amp;gt;;
    proxy_pass clickhouse8123;
    access_log /var/log/&amp;lt;access_log_file_path&amp;gt; main_json_mini_s;
    error_log /var/log/&amp;lt;error_log_file_path&amp;gt;;
}
}&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;&lt;/section&gt;&lt;/p&gt;
&lt;p&gt;Команды clickhouse для создания БД, таблиц и представлений: &lt;b class="spoiler-controller pop-up_camper_clickhouse-vector-balancer-3"&gt;Показать&lt;/b&gt;&lt;section class="spoiler pop-up_camper_clickhouse-vector-balancer-3"&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;# Создание БД
CREATE DATABASE vector ON CLUSTER &amp;lt;cluster_name&amp;gt;;

DROP TABLE IF EXISTS vector.device_status_logs ON CLUSTER &amp;lt;cluster_name&amp;gt;;
# Создание таблицы
CREATE TABLE vector.device_status_logs ON CLUSTER &amp;lt;cluster_name&amp;gt; (
        'message' String
)
ENGINE = ReplicatedReplacingMergeTree('/сlickhouse/{cluster}/tables/validator_status_logs','{replica}')
ORDER BY tuple();

DROP VIEW IF EXISTS vector.device_status_logs_view ON CLUSTER &amp;lt;cluster_name&amp;gt;;
# Создание представления
CREATE MATERIALIZED VIEW vector.device_status_logs_view ON CLUSTER &amp;lt;cluster_name&amp;gt; (
        'time_stamp' DateTime,
        'req' String,
        'req_body' String
)
ENGINE = ReplicatedReplacingMergeTree('/clickhouse/{cluster}/tables/device_status_logs_view','{replica}')
ORDER BY time_stamp
SETTINGS index_granularity = 8192
AS SELECT
        parseDateTimeBestEffortOrNull(JSONExtractString(message, 'timestamp')) AS time_stamp,
        simpleJSONExtractRaw(message, 'req') AS req,
        simpleJSONExtractRaw(message, 'req_body') AS req_body
FROM (
        SELECT message
        FROM vector.device_status_logs
);&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;&lt;/section&gt;&lt;/p&gt;
</description>
<pubDate>Tue, 01 Jul 2025 16:23:41 +0300</pubDate>
</item>

<item>
<title>Полезное: БД Postgres</title>
<guid isPermaLink="false">2950</guid>
<link>https://gladilov.org.ru/blog/</link>
<comments>https://gladilov.org.ru/blog/</comments>
<description>&lt;p&gt;&lt;img style="vertical-align:middle!important;" src="/blog/pictures/work/rncb/tech/postgresql-20.png" /&gt; #postgresql #owner #create #delete&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;DROP DATABASE {db} with (FORCE);
CREATE DATABASE {db} WITH OWNER {user|role};
...&amp;lt;импорт БД&amp;gt;...
SELECT concat ('ALTER TYPE ' , typname, ' OWNER TO {user|role};') from pg_type where typtype ='e' and typnamespace =(select oid from pg_catalog.pg_namespace where nspname ='checkpoint' );
SELECT concat ('ALTER TABLE ' , {db} , ' OWNER TO {user|role};') from information_schema.&amp;quot;tables&amp;quot; t where table_schema = 'checkpoint' ;
ALTER SCHEMA checkpoint OWNER TO {user|role};&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;img style="vertical-align:middle!important;" src="/blog/pictures/work/rncb/tech/postgresql-20.png" /&gt; #включение сбора статистики на кластере PostgreSQL+patroni&lt;br /&gt;
&lt;font size="2"&gt;Имя кластера смотрится командой&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;patronictl -c /etc/patroni/patroni.yml list&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;На лидере кластера выполнить команду&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;/usr/local/bin/patronictl -c /etc/patroni/patroni.yml edit-config&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;В разделе postgresql: -&gt; parameters: добавить строку&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;shared_preload_libraries: pg_stat_statements&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;Согласиться на применение изменений. Перезагрузить кластер командой&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;/usr/local/bin/patronictl -c /etc/patroni/patroni.yml restart &amp;lt;имя кластера&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;Затем от пользователя postgres запустить psql&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;sudo su postgres
psql&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;и выполнить команду&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;CREATE EXTENSION pg_stat_statements;&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;Проверка, существует ли вьюшка pg_stat_statements:&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;select * from pg_stat_statements;&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;img style="vertical-align:middle!important;" src="/blog/pictures/work/rncb/tech/postgresql-20.png" /&gt; #изменение количества соединений в кластерной БД:&lt;font size="2"&gt;&lt;br /&gt;
На лидере кластера выполнить команду&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;/usr/local/bin/patronictl -c /etc/patroni/patroni.yml edit-config&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;в строке max_connections: &lt;число&gt; изменить число на необходимое и согласиться на применение изменений. Перезагрузить кластер командой&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;/usr/local/bin/patronictl -c /etc/patroni/patroni.yml restart &amp;lt;cluster_name&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;В файле /etc/haproxy/haproxy.cfg поменять все вхождения строки&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;maxconn &amp;lt;число&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt; и перегрузить сервис haproxy&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;systemctl restart haproxy&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;img style="vertical-align:middle!important;" src="/blog/pictures/work/rncb/tech/postgresql-20.png" /&gt; #аптайм БД&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;select pg_postmaster_start_time();&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;&lt;/p&gt;
</description>
<pubDate>Wed, 25 Jun 2025 11:57:37 +0300</pubDate>
</item>

<item>
<title>Игры с keepalived</title>
<guid isPermaLink="false">2512</guid>
<link>https://gladilov.org.ru/blog/all/keepalived-lifehacks/</link>
<comments>https://gladilov.org.ru/blog/all/keepalived-lifehacks/</comments>
<description>&lt;p&gt;&lt;img src="/blog/pictures/keepalived/logo.png" class="main_left_img" /&gt;В продолжение &lt;a href="/blog/all/setup-ip-failover-on-debian-with-keepalived/"&gt;поста о системном демоне Keepalived&lt;/a&gt;, позволяющем организовать отказоустойчивость сервиса и балансировку нагрузки. Возник вопрос — как узнать, какая нода в каком состоянии запущена? Для этого я создал две ВМ, к примеру:&lt;br /&gt;
d1 IP=172.16.32.31/24&lt;br /&gt;
d2 IP=172.16.32.32/24&lt;/p&gt;
&lt;p&gt;Конфигурация d1: &lt;b class="spoiler-controller pop-up_camper_keepalived_vm1_conf"&gt;Показать&lt;/b&gt;&lt;section class="spoiler pop-up_camper_keepalived_vm1_conf"&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;global_defs {
   notification_email { root@localhost }
   router_id PD
    vrrp_garp_master_refresh 30
    vrrp_garp_master_refresh_repeat 2
}
vrrp_instance TEST {
    state MASTER
!    state BACKUP
    interface &amp;lt;интерфейс&amp;gt;
    virtual_router_id 101
    priority 103
!    priority 102
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass &amp;lt;пароль&amp;gt;
    }
    virtual_ipaddress { 172.16.32.30/24 dev &amp;lt;интерфейс&amp;gt; label &amp;lt;интерфейс&amp;gt;:vrrp }
    notify /opt/notify.sh
}&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;&lt;/section&gt;Конфигурация d2: &lt;b class="spoiler-controller pop-up_camper_keepalived_vm2_conf"&gt;Показать&lt;/b&gt;&lt;section class="spoiler pop-up_camper_keepalived_vm2_conf"&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;global_defs {
   notification_email { root@localhost }
   router_id PD
    vrrp_garp_master_refresh 30
    vrrp_garp_master_refresh_repeat 2
}
vrrp_instance TEST {
!    state MASTER
    state BACKUP
    interface &amp;lt;интерфейс&amp;gt;
    virtual_router_id 101
!    priority 103
    priority 102
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass &amp;lt;пароль&amp;gt;
    }
    virtual_ipaddress { 172.16.32.30/24 dev &amp;lt;интерфейс&amp;gt; label &amp;lt;интерфейс&amp;gt;:vrrp }
    notify /opt/notify.sh
}&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;&lt;/section&gt;&lt;/p&gt;
&lt;p&gt;Для контроля текущей конфигурации (состояния) демона keepalived используется скрипт /opt/notify.sh: &lt;b class="spoiler-controller pop-up_camper_keepalived_sh_script"&gt;Показать&lt;/b&gt;&lt;section class="spoiler pop-up_camper_keepalived_sh_script"&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;#!/bin/bash
echo $1 $2 is in $3 state &amp;gt; /var/run/keepalive.$1.$2.state&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;&lt;/section&gt;Ещё полезный скрипт-однострочник:: &lt;b class="spoiler-controller pop-up_camper_keepalived_script"&gt;Показать&lt;/b&gt;&lt;section class="spoiler pop-up_camper_keepalived_script"&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;conf=/etc/keepalived/keepalived.conf &amp;amp;&amp;amp; vip=$(expr &amp;quot;$(cat $conf)&amp;quot; : '.*\bvirtual_ipaddress\s*{\s*\(.*\)/*}') &amp;amp;&amp;amp; vip=`expr &amp;quot;$vip&amp;quot; : '\([^ ]*\)' | sed 's/\./\\\\./g'` &amp;amp;&amp;amp; if ip addr | grep -q &amp;quot;$vip&amp;quot;; then echo Primary; else echo Secondary; fi&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;&lt;/section&gt;&lt;/p&gt;
</description>
<pubDate>Sun, 25 Dec 2022 22:00:09 +0300</pubDate>
</item>

<item>
<title>Команда Devuan просрочила ключ подписи репозиториев</title>
<guid isPermaLink="false">2454</guid>
<link>https://gladilov.org.ru/blog/all/devuan-certificate/</link>
<comments>https://gladilov.org.ru/blog/all/devuan-certificate/</comments>
<description>&lt;p&gt;Ключ, которым подписываются все системные обновления, выпущенный в 2017 году, был действителен до 2 сентября 2022 года. Сегодня пользователи дистрибутива столкнулись с невозможностью штатного обновления системы через apt в связи с отсутствием действительного ключа. Разработчики дистрибутива, судя по всему, узнали о просрочке из жалобы на форуме и сгенерировали новый пакет devuan-keyring, который предлагают скачать через http (поскольку apt неработоспособен) и без каких-либо проверок сразу установить.&lt;/p&gt;
&lt;p&gt;&lt;b class="spoiler-controller pop-up_camper_03_09_2022"&gt;Показать&lt;/b&gt;&lt;section class="spoiler pop-up_camper_03_09_2022"&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;wget http://deb.devuan.org/devuan/pool/main/d/devuan-keyring/devuan-keyring_2022.09.04_all.deb
dpkg -i devuan-keyring_2022.09.04_all.deb&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Впрочем, какую-никакую проверку провести всё-таки можно, на странице пакета (по https) указан sha256-хэш deb-файла: 96c4a206e8dfdc21138ec619687ef9acf36e1524dd39190c040164f37cc3468d, который перед тем как запускать dpkg можно сравнить так:&lt;br /&gt;
&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;sha256sum devuan-keyring_2022.09.04_all.deb&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;Старый ключ:&lt;br /&gt;
&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;/etc/apt/trusted.gpg.d/devuan-keyring-2017-archive.gpg
------------------------------------------------------
pub   rsa4096 2017-09-04 [SC] [просрочен с: 2022-09-03]
      E032 601B 7CA1 0BC3 EA53  FA81 BB23 C00C 61FC 752C
uid         [  просрочен ] Devuan Repository (Amprolla3 on Nemesis) &amp;lt;repository@devuan.org&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;Новый ключ:&lt;br /&gt;
&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;/etc/apt/trusted.gpg.d/devuan-keyring-2022-archive.gpg
------------------------------------------------------
pub   rsa4096 2017-09-04 [SC] [   годен до: 2023-09-03]
      E032 601B 7CA1 0BC3 EA53  FA81 BB23 C00C 61FC 752C
uid         [ неизвестно ] Devuan Repository (Amprolla3 on Nemesis) &amp;lt;repository@devuan.org&amp;gt;
sub   rsa4096 2017-09-04 [E] [   годен до: 2023-09-03]&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Несмотря на то, что, по-видимому, новый ключ легитимен, стоит отметить, что цепочка безопасного доверия ключей прервана, и пользователи вынуждены, при обновлении пакета, полагаться на https-сертификат сайта с информацией о пакетах, который может выпустить (поддельный) любая из огромного количества организаций, в том числе сомнительных, в доверенном списке браузера.&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;Источники:&lt;br /&gt;
&lt;a href="https://dev1galaxy.org/viewtopic.php?id=5211"&gt;https://dev1galaxy.org/viewtopic.php?id=5211&lt;/a&gt;&lt;br /&gt;
&lt;a href="https://www.linux.org.ru/news/security/16964008"&gt;https://www.linux.org.ru/news/security/16964008&lt;/a&gt;&lt;/font&gt;&lt;/section&gt;&lt;/p&gt;
</description>
<pubDate>Sat, 03 Sep 2022 22:00:00 +0300</pubDate>
</item>

<item>
<title>Напильник для Эгеи, часть 4</title>
<guid isPermaLink="false">2444</guid>
<link>https://gladilov.org.ru/blog/all/file-for-aegea-vol-4/</link>
<comments>https://gladilov.org.ru/blog/all/file-for-aegea-vol-4/</comments>
<description>&lt;p&gt;&lt;img src="/blog/pictures/file-aegea/aegea-file.jpg" align="left" /&gt;      Четвёртая часть о «доводке напильником» Эгеи.&lt;/p&gt;
&lt;p&gt;      &lt;strong&gt;Август 2022 года:&lt;/strong&gt;&lt;br /&gt;
Позавчера (02.08.2022) вынужден был переместить сайт (и блог) на домашний сервер. После переезда в тегах блога стали отображаться сообщения об ошибках: &lt;b class="spoiler-controller pop-up_camper_04_08_22-aegea-error"&gt;Показать&lt;/b&gt;&lt;section class="spoiler pop-up_camper_04_08_22-aegea-error"&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="lightbox2" data-lightbox="04_08_22-aegea" href="/blog/pictures/file-aegea/error.jpg"&gt;&lt;img src="/blog/pictures/file-aegea/error-preview.jpg" style="vertical-align:middle;" /&gt;&lt;/a&gt;&lt;/section&gt;&lt;/p&gt;
&lt;p&gt;Лёгкий гугляж завёл меня на страницу Александра Токарева &lt;a href="https://alexandertokarev.ru/all/aegea-core-php-line-2/"&gt;Эгея и красные банеры /core.php, line 2&lt;/a&gt;, но предлагаемый способ лечения (понизить версию PHP) оказался для меня неприемлемым. Решено было бороться радикальными методами — править код.&lt;/p&gt;
&lt;p&gt;&lt;a class="lightbox2" data-lightbox="04_08_22-aegea" href="/blog/pictures/file-aegea/mcedit.png"&gt;&lt;img src="/blog/pictures/file-aegea/mcedit-preview.png" style="vertical-align:middle;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;В файле &lt;b&gt;system/core.php&lt;/b&gt; ищу переменную, вызвавшую сообщение об ошибке (&lt;b&gt;k&lt;/b&gt;). Для этого в редакторе mc ищу символ &lt;b&gt;k&lt;/b&gt; как слово целиком (whole word). Комментирую второе вхождение работы с этой переменной. После обновления страницы ошибка исчезла.&lt;/p&gt;
&lt;p&gt;P. S. Эмпирический список пакетов, необходимых к установке для работы &lt;img src="/img/sites//blog.png" style="vertical-align:middle;width:20px;height:20px;" /&gt; блога, &lt;img src="/img/sites//reader.png" style="vertical-align:middle;width:20px;height:20px;" /&gt; RSS-ридера и &lt;img src="///cloud.gladilov.org.ru/core/img/favicon.ico" style="vertical-align:middle;width:20px;height:20px;" /&gt; облака:&lt;br /&gt;
&lt;b&gt;php-mbstring php-mysql php-gd php-curl php-cli libapache2-mod-php php-xml php-zip php-intl&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;P. P. S. Версия Эгеи — релиз 2.7, версия 3249.&lt;/p&gt;
</description>
<pubDate>Thu, 04 Aug 2022 00:41:30 +0300</pubDate>
</item>

<item>
<title>Пакеты для русской локализации старого KDE</title>
<guid isPermaLink="false">2211</guid>
<link>https://gladilov.org.ru/blog/all/packets-for-old-kde-localization/</link>
<comments>https://gladilov.org.ru/blog/all/packets-for-old-kde-localization/</comments>
<description>&lt;p&gt;&lt;img src="/blog/pictures/x/kde-35.png" class="main_left_img" /&gt; Для целей «дистрособирательства» мне иногда нужно быстро русифицировать старые ОСи с разными рабочими столами. Иногда «родных» репозиториев для старых дистров уже нет, поэтому для KDE наскрёб несколько пакетов, пересобрал их и раскидал по архивам для будущего использования.&lt;/p&gt;
&lt;p&gt;&lt;a href="/me/hobby/os/kde/kde4-l10n-ru.tar.gz"&gt;&lt;img style="vertical-align:middle!important;" src="/img/special/files/archive.png" /&gt; KDE 4 (kde4-l10n-ru.tar.gz)&lt;/a&gt;&lt;br /&gt;
&lt;a href="/me/hobby/os/kde/kde3-i18n-ru.tar.gz"&gt;&lt;img style="vertical-align:middle!important;" src="/img/special/files/archive.png" /&gt; KDE 3 (kde3-i18n-ru.tar.gz)&lt;/a&gt;&lt;br /&gt;
&lt;a href="/me/hobby/os/kde/t.tar.gz"&gt;&lt;img style="vertical-align:middle!important;" src="/img/special/files/archive.png" /&gt; t.tar.gz&lt;/a&gt;&lt;br /&gt;
&lt;a href="/me/hobby/os/kde/k.tgz"&gt;&lt;img style="vertical-align:middle!important;" src="/img/special/files/archive.png" /&gt; k.tgz&lt;/a&gt;&lt;br /&gt;
&lt;a href="/me/hobby/os/kde/ru.tgz"&gt;&lt;img style="vertical-align:middle!important;" src="/img/special/files/archive.png" /&gt; ru.tgz&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;N. B. Файлы архивов доступны также по http.&lt;/font&gt;&lt;/p&gt;
</description>
<pubDate>Wed, 16 Feb 2022 18:53:49 +0300</pubDate>
</item>

<item>
<title>Let’s Encrypt отзывает 2 млн сертификатов</title>
<guid isPermaLink="false">2179</guid>
<link>https://gladilov.org.ru/blog/all/lets-encrypt-issue-with-tls-alpn-01-validation-method/</link>
<comments>https://gladilov.org.ru/blog/all/lets-encrypt-issue-with-tls-alpn-01-validation-method/</comments>
<description>&lt;p&gt;&lt;img src="/blog/pictures/events/letsencrypt.png" class="main_left_img" /&gt;Некоммерческий удостоверяющий центр Let’s Encrypt, контролируемый сообществом и предоставляющий сертификаты безвозмездно всем желающим, объявил о досрочном отзыве около двух миллионов TLS-сертификатов, что составляет около 1% от всех активных сертификатов данного удостоверяющего центра. Отзыв сертификатов инициирован из-за выявления несоответствия требованиям спецификации в применяемом в Let’s Encrypt коде с реализацией расширения TLS-ALPN-01 (RFC 7301, Application-Layer Protocol Negotiation). Несоответствие было связано с отсутствием некоторых проверок, выполняемых в процессе согласования соединений на базе TLS-расширения ALPN, применяемого в HTTP/2. Детальная информация об инциденте будет опубликована после завершения отзыва проблемных сертификатов.&lt;/p&gt;
&lt;p&gt;&lt;b class="spoiler-controller pop-up_camper_27_01_22"&gt;Показать&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;section class="spoiler pop-up_camper_27_01_22"&gt;26 января в 03:48 (MSK) проблема была устранена, но все сертификаты, при выдаче которых для верификации использовался метод TLS-ALPN-01, решено признать недействительными. Отзыв сертификатов начнётся 28 января в 19:00 (MSK). До этого времени пользователям, использующим метод проверки TLS-ALPN-01, рекомендуется успеть обновить свои сертификаты, иначе они досрочно будут признаны недействительными.&lt;/p&gt;
&lt;p&gt;Соответствующие уведомления о необходимости обновления сертификатов отправлены на email. Пользователей, применяющих для получения сертификата инструментарии Certbot и dehydrated, при использовании настроек по умолчанию проблема не затронула. Метод TLS-ALPN-01 поддерживается в пакетах Caddy, Traefik, apache mod_md и autocert. Проверить корректность своих сертификатов можно через поиск идентификаторов, серийных номеров или доменов в списке проблемных сертификатов.&lt;/p&gt;
&lt;p&gt;Так как изменения затрагивают поведение при проверке методом TLS-ALPN-01, для продолжения работы может требоваться обновление ACME-клиента или изменение настроек (Caddy, bitnami/bn-cert, autocert, apache mod_md, Traefik). Изменения сводятся к использованию версий TLS не ниже 1.2 (клиенты теперь не смогут использовать TLS 1.1) и прекращению поддержки OID 1.3.6.1.5.5.7.1.30.1, идентифицирующего устаревшее расширение acmeIdentifier, поддерживаемое только в ранних черновиках спецификации RFC 8737 (при формировании сертификата теперь допускается только OID 1.3.6.1.5.5.7.1.31, а клиенты использующие OID 1.3.6.1.5.5.7.1.30.1 не смогут получить сертификат).&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;Источники:&lt;br /&gt;
&lt;a href="https://www.opennet.ru/opennews/art.shtml?num=56588"&gt;https://www.opennet.ru/opennews/art.shtml?num=56588&lt;/a&gt;&lt;br /&gt;
&lt;a href="https://community.letsencrypt.org/t/2022-01-25-issue-with-tls-alpn-01-validation-method/170450"&gt;https://community.letsencrypt.org/t/2022-01-25-issue-with-tls-alpn-01-validation-method/170450&lt;/a&gt;&lt;font&gt;&lt;/section&gt;&lt;/p&gt;
</description>
<pubDate>Thu, 27 Jan 2022 12:48:23 +0300</pubDate>
</item>

<item>
<title>Google Drive выявляет нарушения прав в файлах с одним числом</title>
<guid isPermaLink="false">2173</guid>
<link>https://gladilov.org.ru/blog/all/google-drive-flags-file-with-only-one-number-copyright-infringem/</link>
<comments>https://gladilov.org.ru/blog/all/google-drive-flags-file-with-only-one-number-copyright-infringem/</comments>
<description>&lt;p&gt;Эмили Долсон (Emily Dolson), преподаватель из Мичиганского университета, столкнулась с необычным поведением сервиса Google Drive, который стал блокировать доступ к одному из сохранённых файлов с сообщением о нарушении правил сервиса, связанных с авторскими правами, и предупреждением о невозможности запросить для данного типа блокировок ручную проверку. Интересно то, что содержимое заблокированного файла состояло только из одной цифры «1».&lt;/p&gt;
&lt;p&gt;&lt;img src="https://web.archive.org/web/20220126000152if_/https://pbs.twimg.com/media/FJ1LDHbXwAAlAfs?format=png&amp;name=900x900" /&gt;&lt;/p&gt;
&lt;p&gt;Изначально предполагалось, что блокировка может быть вызвана коллизиями при вычислении хэшей, но данная гипотеза была отвергнута, так как экспериментальным путём выявлено, что блокировка срабатывает не только на «1», но и на многие другие цифры, независимо от наличия символа перевода строки и имени файла. Например, при создании файлов с числами из диапазона от -1000 до 1000, блокировка была применена для чисел 0, 500, 174, 833, 285, 302, 186, 451, 336 и 173. Блокировка производится не сразу, а примерно через час после размещения файла. Представители Google сообщили, что пытаются разобраться в причинах сбоя и работают над устранением проблемы.&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;Источники:&lt;br /&gt;
&lt;a href="https://news.ycombinator.com/item?id=30060405"&gt;https://news.ycombinator.com/item?id=30060405&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.opennet.ru/opennews/art.shtml?num=56574"&gt;http://www.opennet.ru/opennews/art.shtml?num=56574&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;P. S. Как тут не вспомнить &lt;a href="https://ru.wikipedia.org/wiki/Незаконное_простое_число"&gt;Незаконное простое число&lt;/a&gt;...&lt;/p&gt;
</description>
<pubDate>Tue, 25 Jan 2022 17:58:16 +0300</pubDate>
</item>

<item>
<title>Разница между командами выключения *nix</title>
<guid isPermaLink="false">2164</guid>
<link>https://gladilov.org.ru/blog/all/nix-shutdown-ways/</link>
<comments>https://gladilov.org.ru/blog/all/nix-shutdown-ways/</comments>
<description>&lt;p&gt;&lt;img src="/blog/pictures/linux-shutdown.png" class="main_right_img" /&gt;Техническая разница между различными командами выключениями системы.&lt;/p&gt;
&lt;p&gt;*nix-систему можно выключить различными способами: можно использовать &lt;b&gt;poweroff&lt;/b&gt;, &lt;b&gt;shutdown&lt;/b&gt;, &lt;b&gt;init&lt;/b&gt;, &lt;b&gt;halt&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;Результат выполнения команд выключения:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;&lt;kbd&gt;poweroff&lt;/kbd&gt;&lt;/b&gt; (команда выключения) посылает команду ACPI на выключение системы (как при однократном нажатии кнопки выключения питания);&lt;br /&gt;
&lt;b&gt;&lt;kbd&gt;shutdown&lt;/kbd&gt;&lt;/b&gt; (команда завершения) — позволяет выполнить отложенные операции с питанием. При этом утилита выводит оповещение всем залогинившимся пользователям о предстоящем завершении работы и может с помощью файла /run/nologin блокировать вход в систему за 5 минут до времени выключения (если указан аргумент времени) После вызываются системные и локальные {init/rc}.d-скрипты с параметром stop.. В конце вызывается тот же poweroff;&lt;br /&gt;
&lt;b&gt;&lt;kbd&gt;halt&lt;/kbd&gt;&lt;/b&gt; (команда останова) отдаёт команду аппаратному обеспечению приостановить все функции CPU, но оставляет систему включённой (в некоторых случаях использование команды без параметров полностью выключает ПК). На машинах с архитектурой x86 обычно происходит выключение, но на машинах Sun управление возвращается в «ROM monitor» для получения информации о состоянии системы. Как и reboot, команда сбрасывает кэш файловой системы на диск и посылает всем процессам сигналы TERM и KILL;&lt;br /&gt;
&lt;b&gt;&lt;kbd&gt;init&lt;/kbd&gt;&lt;/b&gt; (команда изменения уровня выполнения системы) — при переходе на уровень выполнения 0 производится остановка системы командой halt с помощью выполнения скриптов, соответствующих этому уровню.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;В большинстве современных *nix-систем для обратной совместимости со старыми проприетарными ОСями эти команды выполняют одно и то же и ссылаются на один и тот же файл. Например, команды &lt;b&gt;poweroff&lt;/b&gt; и &lt;b&gt;shutdown&lt;/b&gt; представляют из себя символические ссылки на /bin/systemctl:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;user@localhost:/sbin$ ls -l poweroff
lrwxrwxrwx 1 root root 14 Sep  5 18:01 poweroff -&amp;gt; /bin/systemctl
user@localhost:/sbin$ ls -l shutdown 
lrwxrwxrwx 1 root root 14 Sep  5 18:01 shutdown -&amp;gt; /bin/systemctl&lt;/code&gt;&lt;/pre&gt;</description>
<pubDate>Thu, 20 Jan 2022 23:57:48 +0300</pubDate>
</item>

<item>
<title>Защита опций загрузчика GRUB паролём</title>
<guid isPermaLink="false">2123</guid>
<link>https://gladilov.org.ru/blog/all/boot-with-password-to-edit-grub/</link>
<comments>https://gladilov.org.ru/blog/all/boot-with-password-to-edit-grub/</comments>
<description>&lt;p&gt;&lt;img src="/blog/pictures/grub-password/grub-password.jpg" class="main_right_img" /&gt;Метод заключается в редактировании опций загрузчика GRUB, чтобы установить пароль на их изменение при загрузке системы. Настройка делается в текстовых конфигурационных файлах GRUB, и при физическом доступе к компьютеру с возможностью загрузки с LIVE-дистрибутива можно обойти и эту защиту. При физическом доступе всегда остаётся вариант вынуть жёсткий диск и просмотреть его содержимое в другой ОСи. То есть настоящую защиту данных обеспечивает только их шифрование или шифрование всего диска, защита в виде пароля на загрузку не является надёжной!&lt;br /&gt;
&lt;b class="spoiler-controller pop-up_camper_29_12_21"&gt;Показать&lt;/b&gt;&lt;section class="spoiler pop-up_camper_29_12_21"&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Настройка пароля на загрузку системы и на редактирование опций загрузки&lt;/h2&gt;
&lt;p&gt;От имени пользователя &lt;b&gt;root&lt;/b&gt; генерируется хеш пароля:&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;sudo grub-mkpasswd-pbkdf2&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;Будет показана примерно такая строка:&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;Хэш PBKDF2 вашего пароля: grub.pbkdf2.sha512.10000.6B2B740048C68DCEAD7B288ED37FCC577F1FFDBFE9955A3B9CA5CC47FEF524D07A75E97D17DB4F2E53AF836FBA08DF88CA8EEB7ABF87ABDE0A327A742F8DC745.476B122C205094968098043AF0DF40B4C009AA18F454A8D38E047BA7E50C5DA809F9E3C7FEAA927EF3C0F43CE0EB46072E7303F42559170A09C96DCD37A341D7&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;Пример показан на рисунке 1:&lt;br /&gt;
&lt;a class="lightbox2" data-lightbox="grub-mkpasswd" href="/blog/pictures/grub-password/mkpasswd.jpg"&gt;&lt;img src="/blog/pictures/grub-password/mkpasswd-preview.jpg" style="vertical-align:middle;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;i&gt;Рисунок 1. Пример генерации хеша пароля загрузки.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Из выведенных данных скопировать строку «&lt;b&gt;grub.pbkdf2.sha512.10000………….&lt;/b&gt;» (полностью) и дописать в файл &lt;b&gt;/etc/grub.d/40_custom&lt;/b&gt;:&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;set superusers=&amp;quot;&amp;lt;имя&amp;gt;&amp;quot;
password_pbkdf2 &amp;lt;имя&amp;gt; grub.pbkdf2.sha512.10000.6B2B740048C68DCEAD7...&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;Поскольку файл &lt;b&gt;/etc/grub.d/40_custom&lt;/b&gt; содержит хеш пароля, то рекомендуется запретить его чтение и изменение всеми пользователями, кроме пользователя &lt;b&gt;root&lt;/b&gt;:&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;sudo chmod 711 /etc/grub.d/40_custom&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;Создание нового конфигурационного файла загрузчика:&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;sudo grub-mkconfig -o /boot/grub/grub.cfg&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;После выполнения процесса перезагрузки ПК при попытке выбрать любой пункт меню будет предложено ввести имя пользователя и пароль. При вводе логина &lt;b&gt;&amp;lt;имя&amp;gt;&lt;/b&gt; и пароля, используемого в команде &lt;b&gt;grub-mkpasswd-pbkdf2&lt;/b&gt;, если учётные данные верны, система продолжит загрузку.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;N. B. Логин &lt;b&gt;&amp;lt;имя&amp;gt;&lt;/b&gt; в файле &lt;b&gt;/etc/grub.d/40_custom&lt;/b&gt; можно указать любой, он никак не связан с именами пользователей в системе, главное — не забыть его в дальнейшем. Кроме того, информацию о ​​пользователе и пароле не обязательно требуется вносить в определённый файл. Информация может быть помещена в любой файл  каталога &lt;b&gt;/etc/grub.d&lt;/b&gt;, если этот файл включён в &lt;b&gt;grub.cfg&lt;/b&gt;. Файл &lt;b&gt;/etc/grub.d/40_custom&lt;/b&gt; выбран потому, что он не перезаписывается при обновлении пакета GRUB.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;P. S. Для возможности загрузки без пароля какого-либо пункта (или пунктов) меню их необходимо найти в файле &lt;b&gt;/etc/grub.d/10_linux&lt;/b&gt; и добавить опцию:&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;--unrestricted&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;Пример показан на рисунке 2:&lt;br /&gt;
&lt;a class="lightbox2" data-lightbox="grub-unrestricted" href="/blog/pictures/grub-password/unrestricted.jpg"&gt;&lt;img src="/blog/pictures/grub-password/unrestricted-preview.jpg" style="vertical-align:middle;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;i&gt;Рисунок 2. Пример добавления опции класса загрузки в файл &lt;b&gt;/etc/grub.d/10_linux&lt;/b&gt;.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;В результате загрузка системы будет выполняться как и раньше — пароль в загрузчике GRUB вводить не нужно, при выборе пункта меню GRUB продолжится обычная загрузка. Но при попытке отредактировать опции загрузчика будет предложено ввести имя и пароль. Без их ввода доступ к опциям загрузки не будет дан.&lt;/p&gt;
&lt;p&gt;P. P. S. Если в меню загрузчика содержатся параметры для других ОСей, отличных от операционной системы по умолчанию (другие установки Linux, Mac OS, Windows и т. д.), в файле &lt;b&gt;/etc/grub.d/30_os-prober&lt;/b&gt; вносятся изменения в опции класса загрузки соответствующей ОСи с добавлением строки&lt;font size="2"&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;--unrestricted&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/font&gt;Пример показан на рисунке 3:&lt;br /&gt;
&lt;a class="lightbox2" data-lightbox="grub-os-prober" href="/blog/pictures/grub-password/os-prober.jpg"&gt;&lt;img src="/blog/pictures/grub-password/os-prober-preview.jpg" style="vertical-align:middle;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;i&gt;Рисунок 3. Пример добавления опции класса загрузки в файл &lt;b&gt;/etc/grub.d/30_os-prober&lt;/b&gt; для всех найденных типов операционных систем.&lt;/i&gt;&lt;/section&gt;&lt;/p&gt;
</description>
<pubDate>Thu, 30 Dec 2021 18:42:59 +0300</pubDate>
</item>


</channel>
</rss>