<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Andrey D.</title><generator>teletype.in</generator><description><![CDATA[Рассказываю про IT, повседневность и мимолётные увлечения так, как будто на свете нет других более важных вещей.]]></description><image><url>https://teletype.in/files/e1/b4/e1b436d8-0bb8-4f92-823c-300198bee375.png</url><title>Andrey D.</title><link>https://blog.ionice.ru/</link></image><link>https://blog.ionice.ru/?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devnull</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/devnull?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/devnull?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Fri, 24 Apr 2026 12:36:50 GMT</pubDate><lastBuildDate>Fri, 24 Apr 2026 12:36:50 GMT</lastBuildDate><item><guid isPermaLink="true">https://blog.ionice.ru/keenetic-ssh-setup</guid><link>https://blog.ionice.ru/keenetic-ssh-setup?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devnull</link><comments>https://blog.ionice.ru/keenetic-ssh-setup?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devnull#comments</comments><dc:creator>devnull</dc:creator><title>Настройка SSH на Keenetic Ultra KN-1811</title><pubDate>Mon, 04 Nov 2024 00:14:34 GMT</pubDate><category>devops</category><description><![CDATA[Понадобилось управлять Keenetic Ultra KN-1811 с версией прошивки 4.2.1 через SSH, однако инструкция по его настройке оказалась не актуальной, пришлось слегка дополнить и упростить:]]></description><content:encoded><![CDATA[
  <p id="EWNq">Понадобилось управлять Keenetic Ultra KN-1811 с версией прошивки 4.2.1 через SSH, однако <a href="https://help.keenetic.com/hc/en-us/articles/360000387189-SSH-remote-access-to-the-Keenetic-command-line" target="_blank">инструкция</a> по его настройке оказалась не актуальной, пришлось слегка дополнить и упростить:</p>
  <ol id="38bY">
    <li id="RJLn">Подключиться на Веб-интерфейс</li>
    <li id="A88C">Перейти в раздел Management -&gt; System Setting</li>
    <li id="jZOK">Выбрать пункт Component options</li>
    <li id="mVtT">Установить SSH-сервер и, при желании, SFTP-сервер</li>
    <li id="xf55">Перезагрузить роутер</li>
    <li id="tyWJ">По умолчанию SSH-сервер работает в private-сетях, то есть из локальной сети доступ по 22 порту должен быть из коробки, но у меня его не было, хотя сеть отвечала требованиям (и telnet из неё работал) - <code>show interface Home</code> показал   <code>security-level: private</code></li>
    <li id="lDRp">Проверить, что служба SSH запущена, можно выполнив команду <code>show processes</code>, либо перейдя по ссылке - <a href="http://%3Crouter_ip%3E/rci/show/processes" target="_blank">http://&lt;router_ip&gt;/rci/show/processes</a>, и найдя там &quot;id&quot;: &quot;SSH server&quot; (должен быть в статусе RUNNING)</li>
    <ol id="sQds">
      <li id="u1Ak">Если компонент в статусе STOPPED, надо подключиться к роутеру с помощью telnet и выполнить команду <code>service ssh</code></li>
      <li id="hhkS">Либо ту же самую команду выполнить в webcli по адресу <a href="http://%3Crouter_ip/a" target="_blank">http://&lt;router_ip/a</a></li>
    </ol>
    <li id="A3fX">Подключиться к роутеру командой <code>ssh &lt;user&gt;@&lt;router_ip&gt;</code>. Пользователь должен быть таким же, как в административном интерфейсе.</li>
  </ol>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.ionice.ru/deploy-openstack-2023</guid><link>https://blog.ionice.ru/deploy-openstack-2023?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devnull</link><comments>https://blog.ionice.ru/deploy-openstack-2023?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devnull#comments</comments><dc:creator>devnull</dc:creator><title>Деплой OpenStack в 2023 году</title><pubDate>Mon, 11 Dec 2023 20:24:15 GMT</pubDate><category>devops</category><description><![CDATA[В июне 2023 года OpenInfra провела встречу в Ванкувере. Мне понравился доклад про способы деплоя OpenStack, на основе которого и написана моя заметка.]]></description><content:encoded><![CDATA[
  <p id="IVSf">В июне 2023 года <a href="https://openinfra.dev/" target="_blank">OpenInfra</a> провела встречу в <a href="https://vancouver2023.openinfra.dev/" target="_blank">Ванкувере</a>. Мне понравился доклад про <a href="https://youtu.be/iIkWr_pzfLE?si=zpQHdGWOBTDUYdas" target="_blank">способы деплоя OpenStack</a>, на основе которого и написана моя заметка.</p>
  <p id="KHkT">Одна из проблем начала работы с <strong>OpenStack</strong> - понимание, как его деплоить в своей инфраструктуре. Опций великое множество, посмотрим что нам предлагают:</p>
  <ul id="qCI2">
    <li id="aUcc"><strong>Разработка</strong></li>
    <ul id="ud49">
      <li id="eMKc"><strong><a href="https://docs.openstack.org/devstack/latest/" target="_blank">DevStack</a></strong> - OpenStack, разворачивающийся в виртуальной машине или на физическом железе. Позволяет развернуть облако как на одной ноде, так и собрать несколько в кластер. Развивается OpenStack-сообществом.</li>
    </ul>
    <li id="1SF2"><strong>Kubernetes</strong></li>
    <ul id="KIwS">
      <li id="6Kgr"><strong><a href="https://wiki.openstack.org/wiki/Openstack-helm" target="_blank">OpenStack-Helm</a></strong> - OpenStack, собранный в Helm-chart, позволяющий управлять виртуальными машинами. Имеет в себе инструментарий для настройки ассетов, например, Storage-backends, таких как Ceph или NFS.</li>
      <li id="o6cN"><strong><a href="https://opendev.org/openstack/charm-ops-sunbeam/src/branch/main/README.rst" target="_blank">Sunbeam</a></strong> - Относительно новое решение, позволяющее использовать OpenStack в Kubernetes как на однонодовых решениях, так и с сотнями и тысячами гипервизоров.</li>
    </ul>
    <li id="VLJ8"><strong>Ansible</strong></li>
    <ul id="NbZi">
      <li id="VRie"><a href="https://github.com/openstack/openstack-ansible" target="_blank"><strong>OpenStack-Ansible</strong> </a>- деплой OpenStack, упакованного в LXC-контейнеры, при помощи Ansible</li>
      <li id="6OeL"><strong><a href="https://github.com/openstack/kolla-ansible" target="_blank">Kolla-Ansible</a></strong> - деплой OpenStack, упакованного в Docker-контейнеры, собирающиеся при помощи <a href="https://github.com/openstack/kolla" target="_blank">Kolla</a>, при помощи Ansible</li>
    </ul>
    <li id="2hDZ"><strong>OpenStack</strong></li>
    <ul id="nfmg">
      <li id="eHz9"><strong><a href="https://docs.openstack.org/developer/tripleo-docs/" target="_blank">TripleO</a></strong> - использует OpenStack для деплоя OpenStack. В настоящий момент последняя поддерживаемая версия OpenStack - Wallaby. С февраля 2023 года дальнейшее развитие продукта не планируется.</li>
    </ul>
    <li id="hTxh"><strong>Canonical Infrastructure</strong></li>
    <ul id="QVE5">
      <li id="GRi3"><strong><a href="https://microstack.run/" target="_blank">MicroStack</a></strong> - OpenStack в Kubernetes, упакованный в snap-пакет. Позволяет развернуть облако на локалхосте, либо небольшой приватный кластер.</li>
      <li id="6Zs9"><strong><a href="https://ubuntu.com/openstack/docs/overview" target="_blank">Charmed OpenStack</a></strong> - деплой OpenStack с использованием <a href="https://juju.is/" target="_blank">Juju</a>. Использует фреймворк Charmed Operator Framework. Очень лёгкий в управлении и гибкий в настройке. Интегрируется в Metal-as-a-Service (<a href="https://maas.io/" target="_blank">MAAS</a>)</li>
    </ul>
    <li id="OF4v"><strong>Baremetal</strong></li>
    <ul id="pmJW">
      <li id="pze0"><strong><a href="https://github.com/openstack/kayobe" target="_blank">Kayobe</a></strong> - инструмент, позволяющий установить OpenStack на железо, используя Bifrost, Kolla и Kolla-Ansible</li>
      <li id="9ABv"><strong><a href="https://www.airshipit.org/" target="_blank">Airship</a></strong> - набор утилит, позволяющий развернуть облако с OpenStack в Kubernetes с нуля. Использует yaml для описания конфигурации деплоя.</li>
    </ul>
    <li id="HAjd"><strong>Internet of Things</strong></li>
    <ul id="jHRX">
      <li id="1tW1"><strong><a href="https://www.starlingx.io/" target="_blank">StarlingX</a></strong> - решение, предназначенное, в основном, для промышленного IOT, где критичны низкие задержки. Использует контейнеры</li>
    </ul>
    <li id="wiIJ"><strong>Ручная установка</strong></li>
    <ul id="0Slu">
      <li id="KXtS">Никто не запрещает собрать OpenStack из <a href="https://github.com/openstack" target="_blank">исходных кодов</a> или использовать пакетный менеджер, однако это достаточно трудоёмкий и долгий путь, имеющий в настоящее время академическую ценность </li>
    </ul>
  </ul>
  <h2 id="tQUZ">Какой способ подойдёт мне?</h2>
  <p id="0Yrj">Выбор способа установки зависит от того, как вы ответите сами себе на следующие вопросы.</p>
  <h3 id="Jmrb">Кто будет устанавливать, поддерживать и обслуживать OpenStack?</h3>
  <p id="ZcE9">Чтобы было проще оценить свои силы, вот ещё вопросы:</p>
  <ul id="vm6B">
    <li id="qWkZ">Вы управляете инфраструктурой своего дата-центра?</li>
    <li id="HBb4">Вы управляете своей сетевой инфраструктурой?</li>
    <li id="Kwn8">Вы управляете конфигурацией операционных систем?</li>
    <li id="IrGb">Есть ли у вас опыт оркестрации сложной рабочей нагрузки на десятках-сотнях-тысячах нод?</li>
  </ul>
  <p id="A325">Возможно ответы на эти вопросы помогут вам понять что лучше выбрать готовое коммерческое решение или позвать интеграторов, имеющих достаточный опыт.</p>
  <h3 id="PMnd">В каком состоянии моя инфраструктура?</h3>
  <p id="EiMr">Если же вы всё таки решились деплоить OpenStack своими силами, ответьте на следующие вопросы:</p>
  <ul id="g3f9">
    <li id="2jzH">Вы используете Kubernetes?</li>
    <ul id="Plwh">
      <li id="3gli">Если да, то есть ли у вас административный доступ к кластеру?</li>
    </ul>
    <li id="q0a6">Какой дистрибутив ОС вы используете?</li>
    <li id="pg8j">Что вы используете для оркестрации своей инфраструктуры? (Ansible, Chef, Puppet, etc)</li>
    <li id="ltCn">Деплоите ли вы софт с помощью LXC или Docker?</li>
    <li id="YKPP">Используете ли вы свои образы операционных систем и зеркала дистрибутивов или полагаетесь на общедоступные комьюнити-сборки и репозитории?</li>
  </ul>
  <h3 id="Kz7q">Для чего вы будете использовать OpenStack?</h3>
  <ul id="yhTP">
    <li id="MuxG">Какой будет рабочая нагрузка?</li>
    <ul id="V6W9">
      <li id="Eqlu">Высокопроизводительные вычисления? (HPC)</li>
      <li id="GjrD">Телеком</li>
      <li id="9eyd">Оркестрация контейнеров</li>
      <li id="0X9C">Виртуальные машины</li>
    </ul>
    <li id="G5Th">Кто будет пользоваться этим ежедневно?</li>
    <ul id="DnkB">
      <li id="9xPL">Непревилегированные пользователи (не системные администраторы)</li>
      <li id="qQAr">Вы и ваша команда</li>
      <li id="kjVB">Клиенты</li>
    </ul>
  </ul>
  <p id="bwUb">Каждая система деплоя создана под специфические задачи различными людьми. Схожи ли их задачи и взгляды с вашими?</p>
  <h3 id="Avre">Достаточно ли у вас опыта в Kubernetes?</h3>
  <p id="bQb0">Если да, <strong>OpenStack-Helm</strong> может вам подойти</p>
  <ul id="l5UB">
    <li id="rnaY">OpenStack-Helm использует Helm для деплоя OpenStack в Kubernetes, давая возможность запускать виртуальные машины</li>
    <ul id="BCJo">
      <li id="ki9y">Что такое Helm?</li>
      <ul id="lSZ8">
        <li id="UVrY">Это пакетный менеджер для Kubernetes</li>
        <li id="A6qP">С помощью Helm вы можете упаковать свой деплой и управлять им в дальнейшем</li>
        <li id="Fv3v">Деплой представляет собой Helm-chart</li>
      </ul>
      <li id="cdVL">OpenStack-Helm представляет собой Helm-chart&#x27;ы для деплоя OpenStack и сопутствующего программного обеспечения</li>
    </ul>
    <li id="vlJN">Также OpenStack-Helm предоставляет инструменты  и скрипты для настройки ассетов, например storage-бэкэнды</li>
    <li id="78v9">OpenStack-Helm деплоится через Ubuntu и Docker</li>
  </ul>
  <h3 id="5bBf">Используете ли вы Ansible?</h3>
  <p id="IoHM">OpenStack-Ansible и Kolla-Ansible могут быть хорошим решением, т.к. используют Ansible для деплоя OpenStack</p>
  <ul id="0sSj">
    <li id="1EQm">Используете ли вы LXC или Docker?</li>
    <ul id="jvH1">
      <li id="puQ1">OpenStack-Ansible деплоит компоненты OpenStack используя LXC</li>
      <li id="ADwS">Kolla-Ansible деплоит компоненты OpenStack используя Docker</li>
    </ul>
    <li id="Liwi">Оба решения достаточно гибки и имеют меньше ограничений, чем другие способы деплоя OpenStack</li>
    <li id="3Cvk">У решения большая поддержка операционных систем, таких как Debain- и RHEL-based</li>
  </ul>
  <h3 id="sNYr">Есть ли у вас baremetal сервера?</h3>
  <ul id="GrX7">
    <li id="Bp61">Kayobe - это хорошее решение, позволяющее управлять железными серверами с помощью Bifrost (ironic)</li>
  </ul>
  <h2 id="v8LY">Выводы</h2>
  <p id="ezen">Переводить свою инфраструктуру в облако OpenStack - задача ответственная, однако способов минимизировать риски на этапе принятия решения и внедрения достаточно. Можно протестировать облако как на своей рабочей машине, так и в тестовой лаборатории, развернув его за час-два. После этого можно проводить внедрения на реальной инфраструктуре. Можно комбинировать различные способы деплоя и добавлять в них свои решения. Дьявол, как известно, кроется в деталях, но всё зависит только от собственных сил и возможностей.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.ionice.ru/homepage-part3</guid><link>https://blog.ionice.ru/homepage-part3?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devnull</link><comments>https://blog.ionice.ru/homepage-part3?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devnull#comments</comments><dc:creator>devnull</dc:creator><title>Что нам стоит сайт построить. Часть 2 - разработческая </title><pubDate>Sat, 30 Sep 2023 23:26:05 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/26/5f/265fa0a7-7090-4bf7-a6b3-41663a83d440.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/31/b8/31b884ae-caee-44a8-8131-095eed7df975.png"></img>В этой части разрабатываем домашнюю страницу согласно ТЗ из первой части.]]></description><content:encoded><![CDATA[
  <p id="Juyy">В этой части разрабатываем домашнюю страницу согласно ТЗ из <a href="https://blog.ionice.ru/homepage-part1" target="_blank">первой части</a>.</p>
  <h2 id="Ef5u">Шаг 1. Создаём репозиторий</h2>
  <p id="MOEX">Идём на <a href="https://gitlab.com/" target="_blank">https://gitlab.com/</a>, регистрируемся, создаём группу для нашего проекта (чтобы не плодить верхнеуровневый мусор) и пустой репозиторий в этой группе, где будет храниться код сайта.</p>
  <figure id="9BbQ" class="m_column">
    <img src="https://img4.teletype.in/files/31/b8/31b884ae-caee-44a8-8131-095eed7df975.png" width="1327" />
    <figcaption>Пример репозитория в GitLab</figcaption>
  </figure>
  <h2 id="odRI">Шаг 2. Создаём HTML страницу</h2>
  <p id="UY9w">Кто-то скажет что это слишком дедовский способ - использовать чистый HTML в 2023 году, но во-первых, интернет был 3000 лет назад и я был там, во-вторых, я видел такое, во что вы, люди, просто не поверите. Сайты на flash, табличная вёрстка, гостевые книги... Все эти мгновения затеряются во времени, как слёзы в дожде. Так, стоп. Я слишком увлёкся. На самом деле моя мотивация очень проста. Во-первых, в 2023 году всем абсолютно наплевать на вашу домашнюю страницу и на все её технологии. Во-вторых, чистый HTML идеален в плане кроссплатформенности. Его можно открыть на любом чайнике, даже если тот умеет работать только из текстового терминала, он растягивается под любой экран, весит минимально и грузится мгновенно. Круто же.</p>
  <p id="voEu">В общем, создали файл index.html, добавили туда теги, контент, сохранили, добавили в git, запушили в gitlab-репозиторий. Молодцы.</p>
  <p id="lp6c">Пример чистого HTML:</p>
  <pre id="4m5u" data-lang="html">&lt;!DOCTYPE html&gt;
&lt;html&gt;

&lt;head&gt;
  &lt;meta charset=&quot;utf-8&quot;&gt;
  &lt;title&gt;My homepage&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
  &lt;h1&gt;Welcome to my homepage&lt;/h1&gt;
  &lt;p&gt;This site uses pure HTML&lt;/p&gt;
&lt;/body&gt;

&lt;/html&gt;</pre>
  <h2 id="2SdT">Шаг 3. Создаём Dockerfile</h2>
  <p id="rhio">Я уже настолько привык что все проекты, с которыми работаю, запускаются в контейнерах, что открытие файла в браузере меня немного напрягает. Но свой HTML я закину в docker не для этого, а на будущее, когда решу что чистого HTML может быть недостаточно. Тогда мне и пригодится контейнер в полной мере.</p>
  <p id="asuE">За основу возьму alpine, в котором будет крутиться nginx. Dockerfile будет таким:</p>
  <pre id="kHPp" data-lang="dockerfile">FROM alpine:3.18.4

LABEL maintainer=&quot;Andrey Dolbilin nonice@ionice.ru&quot;

RUN set -x \
    &amp;&amp; addgroup --system --gid 101 nginx \
    &amp;&amp; adduser  --system --ingroup nginx --no-create-home --home /nonexistent --gecos &quot;nginx user&quot; --shell /bin/false --uid 101 nginx \
    &amp;&amp; apk add --no-cache nginx \
    &amp;&amp; ln -sf /dev/stdout /var/log/nginx/access.log \
    &amp;&amp; ln -sf /dev/stderr /var/log/nginx/error.log \
    &amp;&amp; mkdir -m 755 /www \
    &amp;&amp; chown nginx:nginx /www

COPY ./docker/default.conf /etc/nginx/http.d/default.confcat 
COPY --chown=nginx:nginx --chmod=644 ./index.html /www/

WORKDIR /www

EXPOSE 80

STOPSIGNAL SIGQUIT

ENTRYPOINT [&quot;nginx&quot;, &quot;-g&quot;, &quot;daemon off;&quot;]</pre>
  <p id="Eifp">Здесь мы создаём группу и пользователя nginx, от которого веб-сервер работать, устанавливаем сервер, логи монтируем в стандартный поток вывода, создадим директорию, скопируем конфигурацию для nginx и сам файл index.html.</p>
  <p id="JuLm">Сама конфигурация виртуального хоста для nginx выглядит так:</p>
  <pre id="tBJI" data-lang="nginx">#docker/default.conf 
server {
	listen 80 default_server;

	root /www;

	location / {
	}
}</pre>
  <p id="dAZr">Этого хватит чтобы собрать docker-образ, запустить контейнер и проверить проделанную работу, перейдя на <a href="http://localhost/" target="_blank">http://localhost/</a>:</p>
  <pre id="SvsU" data-lang="bash">docker build . -t my/nginx -f docker/Dockerfile
docker run --rm -d -p80:80 my/nginx</pre>
  <p id="JRse">Если в браузере открылся наш сайт - всё отлично. На данном этапе изменения можно закоммитить и отправить в репозиторий. На самом деле, если подумать на пару шагов дальше, тут работы ещё полно - мы не проверили валидность HTML, не настроили nginx, не протестировали docker-образ и так далее, но всё это будет ближе к появлению продакшн-сервера.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.ionice.ru/homepage-part1</guid><link>https://blog.ionice.ru/homepage-part1?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devnull</link><comments>https://blog.ionice.ru/homepage-part1?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devnull#comments</comments><dc:creator>devnull</dc:creator><title>Что нам стоит сайт построить. Часть 1 - теоретическая</title><pubDate>Thu, 28 Sep 2023 13:07:30 GMT</pubDate><description><![CDATA[<img src="https://img3.teletype.in/files/ae/f8/aef89348-f9da-4174-bdf8-3b7c12050451.png"></img>Начинаю приключенческий сериал о том, до какого безумия можно дойти в желании иметь домашнюю страницу.]]></description><content:encoded><![CDATA[
  <p id="27kh">Начинаю приключенческий сериал о том, до какого безумия можно дойти в желании иметь домашнюю страницу.</p>
  <h2 id="g9hd">Предыстория</h2>
  <p id="DotG">Когда-то давно я купил себе домен и решил что буду использовать его под всякие технические задачи. В какой-то момент на нём образовались поддомены с блогами. Всё было прекрасно, пока что-то не спросил почему основной домен у меня не открывается. Потому что я не думал об этом. Но, видимо, время пришло поставить на него какую-то заглушку-визитку. Но просто так купить VPS или шарик было бы скучно, поэтому будем разгонять безумие ради безумия. Начнём с ТЗ и будем его накручивать в каждой итерации.</p>
  <h2 id="Q9ab">Техническое задание v 0.1</h2>
  <p id="BzmH">Необходимо создать сайт-визитку в виде статичной HTML-страницы, указав на ней информацию об авторе сайта.</p>
  <h3 id="hlJM">Разработка</h3>
  <ul id="nasg">
    <li id="EmGE">Подготовить Git-репозиторий для размещения исходного кода проекта</li>
    <li id="vPQ7">Создать валидную HTML-страницу с указанным содержимым</li>
  </ul>
  <h3 id="O1Qq">Контент</h3>
  <ul id="K9wQ">
    <li id="dq7i">Указать имя автора сайта</li>
    <li id="ezVE">Указать краткую информацию об авторе сайте</li>
    <li id="cD66">Указать ссылки на блоги и аккаунты в соцсетях и репозиториях</li>
  </ul>
  <h3 id="61ME">Размещение</h3>
  <ul id="HhBG">
    <li id="ZD7k">Сайт должен представлять из себя docker-образ или набор образов, позволяющий запускать контейнер в любой среде исполнения, в том числе kubernetes</li>
    <li id="cy7K">Сайт должен размещаться на внешнем выделенном виртуальном сервере (продакшен)</li>
    <li id="5zri">Сайт должен автоматически разворачиваться на внешнем хостинге при внесении изменений в исходный код</li>
  </ul>
  <h3 id="WeSD">Безопасность</h3>
  <ul id="FJ7o">
    <li id="s6SD">Доступ к репозиториям исходного кода должен быть ограничен на изменение авторизованными учётными записями</li>
    <li id="bA2J">Доступ к управлению продакшен-сервера должен быть ограничен авторизованными учётными записями с использованием ключевой аутентификации. Парольный доступ должен быть исключён</li>
    <li id="16KH">Сайт должен использовать протокол подключения HTTPS</li>
  </ul>
  <h3 id="fxVp">Приёмка изменений</h3>
  <ul id="MkNh">
    <li id="1Rwk">Необходимо организовать тестовую среду исполнения, позволяющую проверить внесённые изменения перед отправкой их на продакшен-сервер.</li>
  </ul>
  <p id="UdID">То есть мы делаем что? Мы делаем сайт и готовим инфраструктуру. Примерно такую:</p>
  <figure id="eO8E" class="m_column">
    <img src="https://img3.teletype.in/files/ae/f8/aef89348-f9da-4174-bdf8-3b7c12050451.png" width="526" />
    <figcaption>Приблизительный флоу работы с проектом</figcaption>
  </figure>
  <h2 id="cShY">Архитектура</h2>
  <p id="W8T1">Я хочу предусмотреть возможность в перспективе развернуть не только статичный сайт, а какой-нибудь свистящий по-всякому CMS, поэтому начальные решения будут такими:</p>
  <ol id="OhFd">
    <li id="xz3O">Terraform - для раскатки тестового сервера и Gitlab Runner на Qemu/KVM.</li>
    <li id="1TYm">Ansible - для подготовки окружения на серверах</li>
    <li id="JIxw">K0S - для запуска контейнеров</li>
    <li id="pgGN">Репозиторий кода - GitLab. Сначала буду использовать общедоступный, но в перспективе перееду на self-hosted решение.</li>
    <li id="ipE5">Обеспечение CI/CD - GitLab Runner для деплоя сайта на тестовые и продакшн сервера</li>
  </ol>
  <figure id="PoF4" class="m_column">
    <img src="https://img2.teletype.in/files/5e/62/5e62444a-8174-413d-bab6-6f408bedc10d.png" width="578" />
    <figcaption>Инфраструктура проекта для версии v0.1</figcaption>
  </figure>
  <p id="9m6g">В процессе развития проекта мы столкнёмся с проблемами, ограничениями и прочими вещами, решение которых поможет раздуть инфарструктуру до бессмысленного объёма, без которого не может существовать ни один современный сайт.</p>
  <p id="osmV">В следующей части займёмся разработкой. Пока!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.ionice.ru/links-dump-1</guid><link>https://blog.ionice.ru/links-dump-1?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devnull</link><comments>https://blog.ionice.ru/links-dump-1?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devnull#comments</comments><dc:creator>devnull</dc:creator><title>Links dump</title><pubDate>Thu, 06 Jul 2023 23:25:27 GMT</pubDate><category>devops</category><description><![CDATA[Делюсь ссылками, которые я бережно сохранял для себя.]]></description><content:encoded><![CDATA[
  <p id="Vokg">Делюсь ссылками, которые я бережно сохранял для себя.</p>
  <h2 id="oPqj">Разработка</h2>
  <ul id="pMIC">
    <li id="Bjf4"><a href="https://github.com/Asabeneh/30-Days-Of-Python" target="_blank">30 Days of Python</a> - обучалка Python за месяц</li>
    <li id="MG3W"><a href="https://google.github.io/styleguide/pyguide.html" target="_blank">Google python style guide</a> - гайд по стилю написания кода на python от Google</li>
    <li id="AHD3"><a href="https://habr.com/ru/articles/725640/" target="_blank">Деплой Kubernetes</a> - гайд по деплою кубера. В кои-то веки что-то годное на Хабре</li>
    <li id="0D2y"><a href="https://direnv.net/" target="_blank">direnv</a> - утилита для загрузкии и выгрузки переменных окружения в зависимости от директории</li>
    <li id="mDtU"><a href="https://github.com/89luca89/distrobox" target="_blank">distrobox</a> - решение, позволяющее использовать любой дистрибутив linux в терминале. По идее, просто удобная оболочка над контейнеризацией</li>
    <li id="R0II"><a href="https://github.com/Xfennec/progress" target="_blank">progress</a> - утилита, позволяющая смотреть прогресс на больших задачах в терминале</li>
    <li id="UgrY"><a href="https://habr.com/ru/companies/yandex_cloud_and_infra/articles/738192/" target="_blank">Внедрение DevSecOps</a> - статья о том, как внедрить стратегию shift left в пайплайн для внедрения инструментов безопасности</li>
    <li id="TjpM"><a href="https://github.com/hahwul/DevSecOps" target="_blank">DevSecOps RoadMap</a> - дорожная карта по внедрению DevSecOps более подробно</li>
    <li id="tkqu"><a href="https://taylor.town/ikea-oriented-development" target="_blank">IKEA-oriented development</a> - очередной способ разработки, на этот раз в стиле ИКЕА</li>
    <li id="vcMR"><a href="https://github.com/zellij-org/zellij" target="_blank">zellij</a> - альтернатива tmux</li>
  </ul>
  <h2 id="n98Q">Сети</h2>
  <ul id="4Lbc">
    <li id="n6Px"><a href="https://github.com/rconfig/rconfig" target="_blank">rconfig core</a> - open source инструмент, позволяющий массово управлять конфигурацией сетевых устройств (snapshot, deploy, etc)</li>
    <li id="8sMO"><a href="https://github.com/netbox-community/netbox" target="_blank">netbox</a> - решение по автоматизации настройки сети в датацентрах</li>
    <li id="5htR"><a href="https://github.com/microsoft/routeros-scanner" target="_blank">RouterOS Scanner</a> - сканер подозрительных настроек на устройствах Microtik</li>
    <li id="LnBG"><a href="https://github.com/v-byte-cpu/sx" target="_blank">sx</a> - сетевой сканер, альтернатива nmap</li>
    <li id="gbR5"><a href="https://github.com/orf/gping" target="_blank">gping</a> - ping с графиками</li>
  </ul>
  <h2 id="RNUZ">Данные</h2>
  <ul id="TX8I">
    <li id="pm5y"><a href="https://github.com/treeverse/lakeFS" target="_blank">lakeFS</a> - Git для данных. Например, версионирование данных в S3.</li>
    <li id="qMHB"><a href="https://github.com/dani-garcia/vaultwarden" target="_blank">Vaultwarden</a> - альтернатива Bitwarden, написанная на Rust</li>
    <li id="2c6L"><a href="https://postgrespro.ru/education/courses/DBA1" target="_blank">DBA1</a> - базовый курс по администрированию PostgreSQL 13 от postgrespro</li>
    <li id="Xi8E"><a href="https://www.crunchydata.com/blog/five-tips-for-a-healthier-postgres-database-in-the-new-year" target="_blank">Postgres tips</a> - 5 советов по настройке PostgreSQL</li>
    <li id="1PeT"><a href="https://rclone.org/" target="_blank">rclone</a> - утилита для синхронизации данных с облаками</li>
    <li id="Rksz"><a href="https://github.com/antonmedv/fx" target="_blank">fx</a> - консольная утилита для работы с json</li>
    <li id="S9sn"><a href="https://www.prequel.co/blog/sql-maxis-why-we-ditched-rabbitmq-and-replaced-it-with-a-postgres-queue" target="_blank">Replace RabbitMQ with a Postgres Queue</a> - мысли о том, почему команда отказалась от RabbitMQ в своём проекте</li>
    <li id="Qf5H"><a href="https://www.yugabyte.com/postgresql/postgresql-high-availability/" target="_blank">PostgreSQL HA</a> - как собрать высокодоступный Posgres</li>
    <li id="cWB4"><a href="https://github.com/shayonj/pg_easy_replicate" target="_blank">pg_easy_replicate</a> - утилита для упрощения логической репликации в Postgres</li>
  </ul>
  <h2 id="IZQh">Мониторинг</h2>
  <ul id="8pSc">
    <li id="GNj2"><a href="https://www.parseable.io/" target="_blank">parseable</a> - легковесный логгер для cloud native приложений</li>
    <li id="sa8C"><a href="https://manticoresearch.com/" target="_blank">manticoresearch</a> - быстрая альтернатива elasticsearch</li>
    <li id="fdin"><a href="https://github.com/openobserve/openobserve" target="_blank">openobserve</a> - ещё одна альтернатива elasticsearch</li>
    <li id="TTxP"><a href="https://cloud.google.com/blog/products/devops-sre/ensure-the-uptime-of-your-google-cloud-resources" target="_blank">Uptime checks for availability</a> - статья о том, как с помощью аптайма проверять доступность</li>
  </ul>
  <h2 id="YNFb">Безопасность</h2>
  <ul id="Bv9I">
    <li id="h2OJ"><a href="https://media.defense.gov/2022/Aug/29/2003066362/-1/-1/0/CTR_KUBERNETES_HARDENING_GUIDANCE_1.2_20220829.PDF" target="_blank">CTR Kubernetes Hardening Guide</a> - Годный PDF по безопасной настройке кубера от NSA CISA</li>
    <li id="Jduk"><a href="https://github.com/0xsyr0/OSCP" target="_blank">OSCP</a> - шпаргалка по Offensive Security Certified Professionsl Certification</li>
    <li id="t1xk"><a href="https://github.com/sshlog/agent" target="_blank">sshlog</a> - пассивный мониторинг ssh-сервера</li>
  </ul>
  <h2 id="BxqJ">Железо</h2>
  <ul id="lkTP">
    <li id="J6kq"><a href="https://psref.lenovo.com/" target="_blank">psref.lenovo.com</a> - ресурс, на котором можно найти по артикулу ноутбук и проверить, например, напаяна в нём оперативная память или имеет отдельные слоты расширения.</li>
    <li id="j7oJ"><a href="https://github.com/ventoy/Ventoy" target="_blank">ventoy</a> - утилита для создания загрузочных флешек, с помощью которой можно грузиться с любых ISO, закинутых в специальную директорию. Суть та же, что у аппаратных решений IODD и Zalman</li>
  </ul>
  <h2 id="zsKL">Подборки</h2>
  <ul id="1TKu">
    <li id="YWHZ"><a href="https://free-for.dev/" target="_blank">free-for.dev</a> - очень годный каталог сервисов и софта, который может быть полезен при разработке своего приложения или разворачивания инфраструктуры</li>
    <li id="HzTk"><a href="https://thevaluable.dev/vim-commands-beginner/" target="_blank">vim для всех уровней погружения</a> - цикл статей по использованию Vim от новичка до ветерана</li>
  </ul>
  <h2 id="BgX7">Забавное</h2>
  <ul id="ykCp">
    <li id="KUGr"><a href="https://github.com/nvbn/thefuck" target="_blank">thefuck</a> - утилита, корректирующая предыдущую неправильно набранную команду</li>
    <li id="YLeK"><a href="https://telegra.ph/Zadushi-v-sebe-zhabu-neehffektivnosti-07-24" target="_blank">Душим жабу неэффективности</a> - очередная статья про GTD, успешный успех и прочий культ эффективности</li>
    <li id="axaL"><a href="https://github.com/fathyb/carbonyl" target="_blank">carbonyl</a> - браузер chromium в консоли</li>
    <li id="Jg8H"><a href="https://dmitry.gr/?r=05.Projects&proj=27.%20rePalm" target="_blank">rePalm</a> - история и попытки воскресить PalmOS на современном железе</li>
    <li id="QRM5"><a href="https://davestewart.co.uk/blog/the-work-is-never-just-the-work/" target="_blank">the work</a> - статья о том, почему работа над задачей не про выполнение непосредственно самой задачи, а про предшествующие и последующие задаче действия, которые стоит учитывать при планировании</li>
  </ul>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.ionice.ru/platform-engineering-wtf</guid><link>https://blog.ionice.ru/platform-engineering-wtf?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devnull</link><comments>https://blog.ionice.ru/platform-engineering-wtf?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devnull#comments</comments><dc:creator>devnull</dc:creator><title>Platform engineering - замена DevOps, SRE, Cloud. Разбираемся</title><pubDate>Sun, 02 Jul 2023 23:17:20 GMT</pubDate><description><![CDATA[Мир только-только пришёл к пониманию того, для чего нужны инженеры, отвечающие за деплой, доступность и облака, к которым попутно прибегали и убегали мониторщики, безопасники, сетевики, любители чатов и искусственного интеллекта, как вдруг появляется новая сущность - инженер платформ. Что он делает, куда его применять и что делать со старыми инженерами?]]></description><content:encoded><![CDATA[
  <p id="rI2u">Мир только-только пришёл к пониманию того, для чего нужны инженеры, отвечающие за деплой, доступность и облака, к которым попутно прибегали и убегали мониторщики, безопасники, сетевики, любители чатов и искусственного интеллекта, как вдруг появляется новая сущность - инженер платформ. Что он делает, куда его применять и что делать со старыми инженерами?</p>
  <h2 id="sRYm">Немного истории.</h2>
  <p id="Yyw0">В дикие времена существовали разработчики (Dev) и админы (Ops). Первые писали код продукта, вторые эту поделку эксплуатировали. Часто между командами случались баталии на тему того, с чьей стороны проблема, у кого кривые руки и кому надо было буквально убиться об стену. Релизы зачастую передавались на физических носителях, иногда по сети, в редких случаях даже использовались пайплайны, но раскатка билдов отнимала столько времени и сил, что в какой-то момент пришлось сесть за стол переговоров и придумать как оптимизировать процесс. Так появился DevOps, разрушивший стену между Dev и Ops. Подход настолько ускорил разработку продуктов за счёт непрерывности циклов, позволяющих максимально быстро внедрять фичи и фиксить баги, что вопроса о целесообразности его внедрения ни у кого не вставало.</p>
  <p id="jK6W">DevOps-инженеры стали отвечать за подготовку среды в которой запускается приложение - писать пайплайны, terraform-инфраструктуру, ansible-скрипты, docker-образы, k8s-деплойменты, подключать мониторинги, логирование, сканеры безопасности, хранение секретов и прочую автоматизацию для создания единообразной среды разработки и эксплуатации, позволяющей минимизировать ущерб в случае багов и доставлять фиксы и фичи в максимально короткий срок.</p>
  <p id="Pqlo">Выглядит круто. Но появляется новая проблема. Благодаря ускорению разработки, теперь можно увеличить количество проектов. В каждом проекте сидят свои DevOps-инженеры и пишут свои пайплайны, используя актуальный для проекта стек. Где-то это managed k8s, где-то aws, где-то gcp и так далее. И вот уже получается так, что управление всей этой инфраструктурой становится процессом чуть ли не более сложным, чем разработка продукта - скорость написания качественного deployment для k8s не будет поспевать за разработкой и та начнёт простаивать. К тому же DevOps-инженер должен обладать достаточно высокой квалификацией чтобы не тащить на дно процесс разработки, а это дорого. Проблема примерно та же, что была в начале - бизнес начинает недополучать прибыль на которую рассчитывал. А раз аппетиты растут, а чувство голода не проходит, надо снова сесть за стол переговоров и разобраться с процессами. Где может быть бутылочное горлышко? Правильно - в инструментах, требующих настройки. Потому что писать пайплайны может каждый, кто прошёл инфоцыганские курсы, а поднять кластер k8s, настроить сети и прочую инфраструктурную периферию - уже нужен опыт, которого зачастую может не хватать. А раз в каждой команде очередного проекта своя атмосфера, значит все вспомогательные команды (те же безопасники и мониторщики), тратят время на понимание того, что от них требуется в каждом проекте. То есть масштабирование проектов становится затыком из-за отсутствия внутренних стандартов. И вообще жизнь превратилась в ад, потому что если раньше подход &quot;You build it, you run it&quot; работал, то теперь мир изменился - приложение, состоящее из сотни-другой микросервисов, плюс пары десятков инфраструктурных сервисов, запускается в multi-cloud архитектуре, размазанное по aws, gcp и azure. Ни один здравомыслящий человек уже не разберётся что тут к чему. И в этом не должно быть необходимости - backend-разработчику платят за разработку api, frontend-разработчик пилит красивый интерфейс и никто из них не должен тратить своё время на подготовку инфрастркутуры, поднятие k8s-кластеров и тому подобного - это слишком расточительно. Этим занимается команда DevOps, но и у них случается проблема в стиле &quot;вас много, а я одна&quot; (растёт ответственность и нагрузка, к тому же возникает несогласованность процессов от проекта к проекту) , из-за чего страдает общее качество работы.</p>
  <p id="t7Ew">И вот тут на помощь приходит подход Platform engineering, отвечающий, по сути, за создание фреймворка разработки.</p>
  <h2 id="rpAR">Platform engineering</h2>
  <p id="9Cs0">Суть подхода заключается в следующих принципах:</p>
  <ul id="KtDo">
    <li id="WBqB"><strong>Стандартизация использования инструментов</strong> - берём инструменты для деплоя и запуска приложений и стандартизируем подход к их использованию на все команды. Если команды используют разные инструменты CI/CD, предлагаем им перейти на единую платформу. Если на проектах используется k8s, пишем стандарты его применения. То есть всё, что не отвечает за бизнес-логику приложения, должно быть стандартизировано и оптимизировано (VCS, CI/CD, Runtime, Provision, Observing, Securing, etc)</li>
    <li id="2LgP"><strong>Разделение ответственности</strong>. Каждый инструмент имеет базовую ролевую модель Admin-User. Админы отвечают за настройку инструмента, его безопасность, плагины, бэкапы и т.п., пользователи - за свою работу с этим инструментом. То есть одни управляют, другие используют. Это позволяет разделить ответственность. Как я писал раньше - настроить кластер k8s и писать deployment для него - это скиллы разного уровня, но обычно в DevOps командах всё ложится на плечи простого инженера, квалификация которого страдает от проекта к проекту. Таким образом можно переопределить команды DevOps-инженеров, отправив часть на поддержку платформенных сервисов, а часть оставить на настройку пайплайнов. Таким образом экспертиза в целом будет повышена, т.к. каждая команда наконец-то займётся каким-то одним делом.</li>
  </ul>
  <p id="qoLn">Что получается? Получается, что мы опять создали модель, с которой всё начиналось, только теперь в качестве Dev - инженеры, отвечающие за написание пайплайнов, а роль Ops выполняют люди, отвечающие за настройку инструментов. Будут ли у них в итоге те же проблемы? Наверняка ожидание доступов или добавление новых плагинов в сервисы станет бутылочным горлышком. Но (!) подход platform engineering здесь добавляет новый принцип:</p>
  <ul id="NR7C">
    <li id="UYcH"><strong>Создание пользовательского интерфейса для взаимодействия с услугами</strong>. То есть инженеры платформы пилят сервис с UI или API для заказа тех самых provisioned, up-to-date, secured сервисов, за которые раньше у всех болела голова.</li>
  </ul>
  <p id="xoqN">То есть команда разработки не ходит к инженерам платформы, для них сделан PaaS сервис, где они сами вольны выбрать всё что им нужно. Называется он <strong>Internal Developer Platform</strong> (<strong>IDP</strong>) Так что цель инженеров платформы - пилить стандартные решения, которые можно заказать через этот сервис. То есть теперь разработчик не идёт заказывать на aws кластер eks, а жмёт кнопку в интерфейсе IDP, который сам закажет кластер, настроит доступы, бэкапы, мониторинг и логирование. И это занимает минуты в отличие от стандартного подхода, когда подобные задачи выполнялись командами DevOps в течение дней. </p>
  <p id="YUIu">В теории выглядит круто. Я даже встречал вживую компании, где подобный подход начинал внедряться, но вживую всё равно возникают нюансы.</p>
  <p id="uPQR">Например, одной команде хватает gitlab-ci, другой привычнее работать с jenkins, третья хочет circleci, четвёртая - argo-ci. Зачастую возникает ситуация, когда компания говорит что &quot;у нас стандартом является только одна CI, кому не нравится - нас не волнует&quot;. Задача platform engineering заключается в том, чтобы этот барьер пробивать и находить решения, способные всех удовлетворить. То есть инженеры платформы приходят к команде и говорят &quot;Вы хотите использовать CircleCI? Ок, давайте мы вам настроим её с учётом всех best-practices, а потом интегрируем в нашу платформу чтобы и остальные могли использовать этот инструмент, если в нём возникнет потребность&quot;. То есть инженеры платформы вместо ограничений замотивированы на расширение возможностей своего продукта. В реальности, конечно, будет так, что какая-то команда использует маргинальные решения, внедрять которые в платформу не имеет смысла, тогда придётся обслуживать это решение по старинке.</p>
  <p id="PKgd">Ещё один момент - инженеры платформы не должны ограничивать возможность конфигурирования сервисов в IDP под себя. Вместо этого они должны предусмотреть возможность гибкой настройки этих сервисов. То есть вместо прибивания всего гвоздями, инженеры должны использовать лучшие практики, такие как Infrastructure as Code (IaC) для создания шаблонов, в которые можно вносить изменения, при этом не нарушая общую безопасность и стабильность.</p>
  <h2 id="Iq6o">Внедрение platform engineering</h2>
  <p id="0e1R">Процесс внедрения такого подхода, конечно же, невозможно сделать одним днём или одним усилием. Потому что одна команда может использовать дикое легаси, вторая - специфичную версию инструмента, третья придумает какие-нибудь организационные причины. Поэтому задача инженеров - обеспечить каждой команде гибкий подход к переходу с существующей инфраструктуры на новую.</p>
  <p id="thJx">Вообще IDP - это постоянно развивающийся продукт, у которого нет конечной достигаемой точки. Инженеры должны постоянно пилить фичи, фиксить баги, взаимодействовать с командами разработки, релизить новые версии платформы и т.п.</p>
  <p id="DfKh">Начинать процесс внедрения платформы необходимо с реализации самых востребованных сервисов. Для этого надо собрать статистику, опросить каждую команду, выслушать их головные боли и предложить решение, которое всех удовлетворит. Такой подход позволит показать командам разработки что ваша платформа умеет решать проблемы эффективно. После пары успешных кейсов, когда у разработчиков появится доверие к платформе, можно будет переходить к этапу презентации стандартов и склонению команд к использованию платформенных решений, которые в конечном итоге сократят количество инфраструктурного ада и уменьшат нагрузку на команды.</p>
  <h2 id="hyxm">Platform vs DevOps</h2>
  <p id="HFS9">Одно не заменяет другое. Да, инженеры платформы забирают себе экспертизу по настройке инфраструктуры, готовят шаблоны для безопасной сборки приложений, развёртывания кластеров и прочего, но они не берут на себя задачи по деплою самого приложения, которое выполняет задачи бизнеса. То есть DevOps-инженеры по-прежнему пишут пайплайны по раскатке приложений и манифесты k8s, но теперь им не надо грузить голову вопросами раскатки инфраструктуры. Второй важный момент - разработка платформы использует внутри себя те же DevOps-процессы (добавление фич, фикс багов, тестирование, сбор требований, обратная связь и т.п.). То есть в конечном итоге никто не останется без работы, просто произойдёт перераспределение по интересам.</p>
  <p id="oIPy">Лично моё мнение - исходя из таких реалий ближайшего будущего, всё равно стоит разбираться в обоих типах задач - настройке и использованию инструментов, поскольку проекты, как обычно, разные и требуют погружения в различные аспекты. Команды инженеров платформы будут формироваться как из облачных инженеров, так и из инженеров devops, где-то просто переименуют позиции, где-то платформенные инженеры вытеснят devops. Но, как показывает опыт, Dev и Ops - это две стороны одной монеты. Кто-то любит разрабатывать, кто-то любит поддерживать, но жить друг без друга у них не получается.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.ionice.ru/ghk-multitools</guid><link>https://blog.ionice.ru/ghk-multitools?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devnull</link><comments>https://blog.ionice.ru/ghk-multitools?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devnull#comments</comments><dc:creator>devnull</dc:creator><title>Сравниваем мультитулы Grand Harvest GHK-6 pro и GHK-9</title><pubDate>Sat, 24 Jun 2023 22:48:05 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/2d/d2/2dd2fadf-8a6d-42c5-a7de-5945387fc4c6.png"></media:content><category>edc</category><description><![CDATA[<img src="https://img3.teletype.in/files/23/a2/23a224f9-a3cf-4447-a2fe-84b83f7c11eb.png"></img>Бюджетные китайские мультитулы за $15-$30 - это, как мне кажется, идеальное попадание в среднестатистического потребителя, для кого работа руками - хобби, а не профессиональная необходимость. Они, конечно же, скажут что нормальный мультитул стоит $150-300, имеет пожизненную гарантию, используется в армии и у спасателей, история бренда насчитывает много десятков лет, патентов и так далее. В секту таких фанатиков легко попасть и очень трудно оттуда выйти. Я же расскажу про мультитулы, назначение которых - лежать в бардачке машины или в тумбочке, откуда они будут доставаться, в лучшем случае, пару раз в год, когда лениво идти за нормальным набором инструментов, а не висеть постоянно на ремне или разгрузке.]]></description><content:encoded><![CDATA[
  <p id="mBWZ">Бюджетные китайские мультитулы за $15-$30 - это, как мне кажется, идеальное попадание в среднестатистического потребителя, для кого работа руками - хобби, а не профессиональная необходимость. Они, конечно же, скажут что нормальный мультитул стоит $150-300, имеет пожизненную гарантию, используется в армии и у спасателей, история бренда насчитывает много десятков лет, патентов и так далее. В секту таких фанатиков легко попасть и очень трудно оттуда выйти. Я же расскажу про мультитулы, назначение которых - лежать в бардачке машины или в тумбочке, откуда они будут доставаться, в лучшем случае, пару раз в год, когда лениво идти за нормальным набором инструментов, а не висеть постоянно на ремне или разгрузке.</p>
  <p id="kIfy">С такой философией идём смотреть на мультитулы:</p>
  <ul id="UHYF">
    <li id="dPFz"><strong>GHK-9</strong> куплен мной в начале весны в качестве вспомогательного инструмента на загородном участке.</li>
    <li id="izWO"><strong>GHK-6 pro</strong> был приобретён в подарок знакомым, чтобы сложить в машину.</li>
  </ul>
  <h2 id="7qGD">Чехлы</h2>
  <p id="4Eji">Оба мультитула живут в одинаковых чехлах без опознавательных знаков, внутри два отсека - основной и под биты. На задней части пришита петля для крепления на ремне. Потенциал чехла позволяет добавить в него что-нибудь ещё. Например, я сложил туда небольшой магнит. Можно уместить удлиннитель для бит.</p>
  <figure id="KRH4" class="m_column">
    <img src="https://img3.teletype.in/files/23/a2/23a224f9-a3cf-4447-a2fe-84b83f7c11eb.png" width="1280" />
    <figcaption>Чехлы GHK-6 pro и GHK-9 идентичны</figcaption>
  </figure>
  <p id="b2vr">Кстати, таскать мультитул в чехле на ремне достаточно удобно.</p>
  <h2 id="0vuC">Общий вид</h2>
  <p id="gZfk">По сути перед нами два мультитула, построенных на единой платформе, различие в которых только в накладках ручек и наличии карабина в GHK-9. Рама и основные компоненты практически идентичны.</p>
  <figure id="NvMp" class="m_column">
    <img src="https://img1.teletype.in/files/cb/26/cb26ad03-9e99-4905-83ac-980b76a43d58.png" width="1280" />
    <figcaption>GHK-6 pro слева и GHK-9 справа</figcaption>
  </figure>
  <p id="xbZh">С одного бока мультитулы невозможно различить</p>
  <figure id="Xv5H" class="m_column">
    <img src="https://img1.teletype.in/files/0d/2a/0d2adf2a-c40d-46ce-8a40-821a17d9ca2b.png" width="1280" />
    <figcaption>GHK-6 pro слева и GHK-9 справа</figcaption>
  </figure>
  <p id="rVec">С другого бока отличия более выражены</p>
  <figure id="zucO" class="m_column">
    <img src="https://img4.teletype.in/files/7c/25/7c25c98f-7a77-487f-b21a-29e461e1ea25.png" width="1280" />
    <figcaption>GHK-6 pro слева и GHK-9 справа</figcaption>
  </figure>
  <h2 id="DNl0">Основной инструментарий</h2>
  <p id="67sp">На каждой ручке с наружной стороны есть по два инструмента, фиксирующихся лайнер-локами</p>
  <p id="03LL">GHK-6 pro:</p>
  <ul id="fCw2">
    <li id="9eXN">Нож</li>
    <li id="wzL9">Пила</li>
    <li id="BdSs">Ножницы</li>
    <li id="eKqx">Напильник-линейка</li>
  </ul>
  <p id="i5dp">GHK-9:</p>
  <ul id="oCkY">
    <li id="QpT3">Нож</li>
    <li id="Mi12">Короткая пила</li>
    <li id="H4ox">Ножницы</li>
    <li id="pfNp">Короткий двусторонний напильник</li>
  </ul>
  <figure id="oCLo" class="m_column">
    <img src="https://img3.teletype.in/files/e0/91/e0910c29-c211-47dd-a964-a812459495f4.png" width="1280" />
    <figcaption>GHK-6 pro слева и GHK-9 справа</figcaption>
  </figure>
  <figure id="oRVj" class="m_column">
    <img src="https://img2.teletype.in/files/13/f2/13f27719-f2d2-4ff1-97e0-2d7b4dd8637f.png" width="1280" />
    <figcaption>GHK-6 pro слева и GHK-9 справа</figcaption>
  </figure>
  <p id="0fB6">Лезвие ножа и ножницы отличные. Ножом я срезал ветки с кустов и затачивал колышки, а ножницы спокойно режут и плотный картон, и ногти</p>
  <p id="VoXj">Пила на GHK-9 имеет более острый зуб, но полотно короткое - толстые ветки пилить не очень удобно. В GHK-6 pro полотно больше, но заточка зубов тупее. Так что на деле обе пилы больше аварийные, чем рабочие.</p>
  <figure id="bQvj" class="m_column">
    <img src="https://img4.teletype.in/files/b4/e9/b4e91ada-be0d-40a1-87d5-943ec06969cd.png" width="960" />
    <figcaption>Сравнение полотен ножовок GHK-6 pro (слева) и GHK-9 справа</figcaption>
  </figure>
  <p id="xnza">Напильник на GHK-9 мне нравится больше, потому что имеет два вида зернистости. Один подходит для обработки твёрдых поверхностей, вторым можно подправить ногти. У GHK-6 pro только грубый напильник, а с другой стороны линейка. Раньше я думал что это глупость, но по факту ей удобно измерять размеры крепежа, диаметры отверстий и прочую мелочёвку. Оба напильника на конце имеют плоскую отвёртку, которую удобно использовать для подковыривания  гвоздей или скоб.</p>
  <h2 id="eWK0">Пассатижи</h2>
  <p id="8gii">На обоих мультитулах стоят идентичные универсальные пассатижи. Они подпружинены, пружина скрыта в корпусе. Что касается удобства - в GHK-6 pro обе ручки симметричны, это позволяет хватать их из любой позиции, на GHK-9 придётся подбирать &quot;любимую&quot; сторону под свой хват. Люфты ручек на GHK-6 pro больше.</p>
  <figure id="W2kU" class="m_column">
    <img src="https://img3.teletype.in/files/a3/e3/a3e38d2a-ed78-4a8e-b531-3737c92dc190.png" width="1280" />
    <figcaption>Пассатижи у мультитулов идентичны</figcaption>
  </figure>
  <h2 id="xMWX">Дополнительный инструментарий</h2>
  <p id="amaT">GHK-6 pro:</p>
  <ul id="jdln">
    <li id="r80t">Крестовая отвертка</li>
    <li id="pDNQ">Шило</li>
    <li id="zA9W">Стропорез</li>
    <li id="tm5t">Бутылочная открывашка с плоской отверткой</li>
    <li id="y9VM">Консервный нож</li>
  </ul>
  <p id="5UMk">GHK-9</p>
  <ul id="Q1Hr">
    <li id="qL4v">Крестовая отвертка</li>
    <li id="3Fla">Консервный нож</li>
    <li id="d8f2">Карабин с бутылочной открывашкой</li>
  </ul>
  <p id="jV1J">Также в комплекте идут идентичные адаптеры с битами</p>
  <figure id="GoLc" class="m_column">
    <img src="https://img1.teletype.in/files/8a/b9/8ab9921a-5759-43d0-8f3f-f629faab9486.png" width="1280" />
    <figcaption>Дополнительные инструменты в ручках</figcaption>
  </figure>
  <figure id="gj9j" class="m_column">
    <img src="https://img4.teletype.in/files/fb/08/fb083562-b3a4-4595-84fb-0bb26fdc0eae.png" width="1280" />
    <figcaption>Отвёртки phillips</figcaption>
  </figure>
  <figure id="BejG" class="m_column">
    <img src="https://img1.teletype.in/files/cb/28/cb28443b-18f1-48cb-9563-e480bc4cab8b.png" width="1280" />
    <figcaption>Битодержатель</figcaption>
  </figure>
  <h2 id="9Dsj">Общие впечатления</h2>
  <p id="XaFH">Мне нравится функциональный набор этих мультитулов - для дачного отдыха и кратковременных походов на природу они идеальны. Я бы сказал что это бушкрафтерский набор на минималках - для себя конуру сделать не получится, но скворечник - вполне.</p>
  <p id="ruch">Недостатки</p>
  <ul id="Bmdj">
    <li id="QsHr">Грубая обработка ручек. Стоит посильнее сжать мультитул в ладони, как он начинает впиваться в неё и заставляет испытывать боль. Для комфортной работы неплохо иметь перчатки</li>
    <li id="jygd">Посредственные биты. Даже в наборах из FixPrice можно найти что-то посерьёзнее. Но по факту пользоваться этими битами придётся в очень редких случаях.</li>
    <li id="JKFK">Болтающийся битодержатель. Хоть во втулке и есть прямоугольное отверстие, люфты всё равно достаточно существенные. Тут либо терпеть, либо дорабатывать напильником.</li>
  </ul>
  <p id="NFC9">Достоинства</p>
  <ul id="FBPx">
    <li id="7WMX">Фиксаторы на всех инструментах</li>
    <li id="xDzY">Подпружиненные пассатижи</li>
    <li id="CpVN">Сменные губки кусачек</li>
    <li id="vgbf">Сбалансированный набор инструментов</li>
    <li id="IG3q">Цена, позволяющая не переживать насчёт гарантий</li>
    <li id="54En">Стандартные биты, которые не страшно потерять</li>
    <li id="ughi">Хорошая заточка</li>
    <li id="Xli0">Достаточная износоустойчивость в бытовых задачах</li>
  </ul>
  <p id="Ydlu">Своим GHK-9 за несколько месяцев я делал разные задачи - прикручивал гардины для штор, собирал стеллажи, пилил сучки, затачивал колышки, резал картонные коробки и стриг ногти. Мне пригодились все присутствующие инструменты кроме открывашек - это рекорд среди моих мультитулов. Ну и развеял для себя миф о том, что китайские noname инструменты одноразовые.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.ionice.ru/iVn0VrbaILp</guid><link>https://blog.ionice.ru/iVn0VrbaILp?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devnull</link><comments>https://blog.ionice.ru/iVn0VrbaILp?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devnull#comments</comments><dc:creator>devnull</dc:creator><title>Рассматриваем мультитул-секатор Makita PGC-200190</title><pubDate>Sun, 28 May 2023 20:13:30 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/9c/29/9c297bf0-c009-44a0-81a3-4bfe8780a28c.png"></media:content><category>edc</category><description><![CDATA[<img src="https://img1.teletype.in/files/0b/b0/0bb09fa4-ec9c-4c8f-ab82-fb5a20684ea3.jpeg"></img>На правах единственного владельца (судя по отсутствию каких либо отзывов), расскажу про мультитул Makita PGC-200190.]]></description><content:encoded><![CDATA[
  <p id="qkA7">На правах единственного владельца (судя по отсутствию каких либо отзывов), расскажу про мультитул Makita PGC-200190.</p>
  <p id="Ts02">В садовом инвентаре я не особо силён, поэтому просто поделюсь фотографиями и своим мнением о секаторе.</p>
  <p id="XUih">Мультитул поставляется в чёрной коробочке. Коробочка неожиданно тяжёлая для своего размера.</p>
  <figure id="PZ22" class="m_original">
    <img src="https://img1.teletype.in/files/0b/b0/0bb09fa4-ec9c-4c8f-ab82-fb5a20684ea3.jpeg" width="4000" />
    <figcaption>Упаковка Makita</figcaption>
  </figure>
  <p id="Xlyu">Извлекаем содержимое и любуемся изделием в сложенном виде. Сразу обращаем внимание на пару моментов:</p>
  <ul id="WuYI">
    <li id="kD9B">Накладки ручек выполнены из чёрного и зелёного пластика, при этом линии перехода у них в сложенном виде не совпадают</li>
    <li id="bGeL">Надпись бренда просто нанесена краской, что косвенно подтверждает факт, что Makita заказала производство мультитула на стороне</li>
    <li id="XGCe">Ручки скользкие, поэтому пользоваться мультитулом предпочтительно в перчатках</li>
    <li id="byWU">Все инструменты спрятаны внутри мультитула</li>
    <li id="gB34">В комплекте нет чехла. Ровно как и клипсы или подвесного кольца. То есть носить его предполагается в кармане, а хранить в ящике с инструментом.</li>
  </ul>
  <figure id="wdz5" class="m_original">
    <img src="https://img2.teletype.in/files/1f/aa/1faa7b04-20ba-4820-9b5a-84fd627ad019.jpeg" width="4000" />
    <figcaption>Сравнение размеров Makita и Victorinox Hiker 91 mm</figcaption>
  </figure>
  <p id="UsyJ">Если посмотреть на мультитул сбоку, то нам открывается штампованный металлический корпус, накладки на котором расположены не очень аккуратно.</p>
  <figure id="tMac" class="m_original">
    <img src="https://img1.teletype.in/files/8a/3b/8a3b7215-1fa3-4650-b8f3-0a4e73adbba9.jpeg" width="4000" />
  </figure>
  <p id="MP88">Раскрываем мультитул и смотрим что он может:</p>
  <ul id="G1tT">
    <li id="CKth">Секатор - основная функция мультитула. Снабжён замком и подпружинен. Заточка отличная. Подрезать кусты таким инструментом можно, но обычный секатор справится с более толстыми ветками.</li>
    <li id="qz5q">Ножовка по дереву. Полотно с двойными зубьями, короткое, но заточено хорошо. Ветки толще трёх сантиметров таким спилить будет очень трудно (и зачем?)</li>
    <li id="6B1Z">Серрейтор. Спорная опция, но лезвие заточено хорошо.</li>
    <li id="AYib">Окулировочный нож. Режущая часть лезвия больше на полсантиметра по сравнению с 91 мм швейцарским ножом. </li>
    <li id="XpUJ">Нож для снятия коры. Честно, не знаю как пользоваться этим инструментом, но заточка, как и на предыдущих опцияз, отличная.</li>
  </ul>
  <p id="HfFO">Мне не понравилось что раскладные инструменты не фиксируются замком в разложенном состоянии, но их расположение не должно давать травмироваться или закрываться на руку. Хотя доставать их из-за этого не очень удобно.</p>
  <figure id="LLCn" class="m_original">
    <img src="https://img1.teletype.in/files/81/f5/81f5b671-f0b4-4877-a47c-11f3451c2c40.jpeg" width="4000" />
    <figcaption>Секатор с открытым замком</figcaption>
  </figure>
  <figure id="Xd5G" class="m_original">
    <img src="https://img4.teletype.in/files/75/cb/75cb8b95-6182-4385-9d42-5c096bc2b175.jpeg" width="4000" />
    <figcaption>Опции мультитула</figcaption>
  </figure>
  <p id="7mVp">Попользоваться этим инструментом мне, к сожалению, не удалось, но выводы могу сделать следующие:</p>
  <ul id="jSen">
    <li id="UC5S">Инструменты хорошо заточены и функциональны</li>
    <li id="TSXw">Секатор свою основную функцию будет выполнять на достойном уровне, если не усердствовать на ветках, которым больше подходит веткорез</li>
    <li id="S6WL">Люфты есть, но незначительные</li>
    <li id="nwH3">Нет чехла или любого другого способа носить мультитул в быстром доступе</li>
    <li id="CID7">Нет главного признака мультитула - бутылочной открывашки</li>
  </ul>
  <p id="cAR2">Теперь про бренд Makita. Я так и не смог найти упоминание об этой модели (кстати, так и не понял как правильно - PGC-200190 или PCG-200190) на официальном сайте или в каких-либо новостях, кроме <a href="https://vk.com/wall-87250206_2431" target="_blank">одной</a>, что она является подарочной промо-продукцией. На самом деле этот мультитул выпускался и под другими брендами, например, Draper PS6 или Zenport MFT45.</p>
  <figure id="eRtU" class="m_original">
    <img src="https://img2.teletype.in/files/55/c6/55c60a4f-09ca-4dff-9608-f5f340755f41.png" width="700" />
    <figcaption>Draper PS6</figcaption>
  </figure>
  <p id="hc5l">Эти модели, ко всему прочему, имели ещё и чехол. Конфигурация мультитула позволяет изменять форму накладок, так что вариаций может быть сколько угодно.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.ionice.ru/qemu-guest-agent</guid><link>https://blog.ionice.ru/qemu-guest-agent?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devnull</link><comments>https://blog.ionice.ru/qemu-guest-agent?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devnull#comments</comments><dc:creator>devnull</dc:creator><title>Управляем виртуальной машиной через QEMU Guest Agent</title><pubDate>Thu, 27 Apr 2023 20:35:37 GMT</pubDate><category>devops</category><description><![CDATA[Имея гипервизор и запущенные на нём виртуальные машины, скорее всего, рано или поздно, возникнет необходимость что-то пнуть, взять или запустить внутри гостевой системы, не прибегая к доступу по SSH. Как? С помощью qemu-guest-agent. Посмотрим как всё это работает.]]></description><content:encoded><![CDATA[
  <p id="zHaW">Имея гипервизор и запущенные на нём виртуальные машины, скорее всего, рано или поздно, возникнет необходимость что-то пнуть, взять или запустить внутри гостевой системы, не прибегая к доступу по SSH. Как? С помощью qemu-guest-agent. Посмотрим как всё это работает.</p>
  <h2 id="OfgV">Собираем стенд</h2>
  <h3 id="HBb6">Окружение</h3>
  <p id="RlZE">Собственно, нам много не надо - сервер с qemu-kvm и какая-нибудь виртуалка с не самым маргинальным дистрибутивом. В моём случае qemu-kvm развёрнут прямо на лаптопе, в виртуальной машине крутится Ubuntu Jammy:</p>
  <pre id="l58J" data-lang="bash">andrey@ionice:~$ virsh list

 Id   Name                      State
-----------------------------------------
 7    ubuntu22.04-guest-agent   running
</pre>
  <h3 id="EP0k">Установка qemu-guest-agent</h3>
  <p id="CHHG">Установка агента тривиальна и скучна - всё есть в репозиториях, устанавливаем и стартуем службу</p>
  <pre id="9k4Q" data-lang="bash">andrey@ionice:~$ virsh console ubuntu22.04-guest-agent

qga login: server
Password: 
Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-71-generic x86_64)

server@qga:~$ sudo apt install qemu-guest-agent
server@qga:~$ sudo systemctl enable --now qemu-guest-agent
server@qga:~$ sudo systemctl status qemu-guest-agent
● qemu-guest-agent.service - QEMU Guest Agent
     Loaded: loaded (/lib/systemd/system/qemu-guest-agent.service; static)
     Active: active (running) since Thu 2023-04-27 18:03:54 UTC; 1min 19s ago
   Main PID: 1039 (qemu-ga)
      Tasks: 2 (limit: 4572)
     Memory: 380.0K
        CPU: 1ms
     CGroup: /system.slice/qemu-guest-agent.service
             └─1039 /usr/sbin/qemu-ga

Apr 27 18:03:54 qga systemd[1]: Started QEMU Guest Agent.

^[</pre>
  <p id="JeBq">Всё, основную часть задачи выполнили. Теперь убедимся что наша виртуалка имеет устройство qemu-ga:</p>
  <pre id="66xt" data-lang="bash">andrey@ionice:~$ virsh dumpxml ubuntu22.04-guest-agent
...
    &lt;channel type=&#x27;unix&#x27;&gt;
      &lt;target type=&#x27;virtio&#x27; name=&#x27;org.qemu.guest_agent.0&#x27;/&gt;
      &lt;address type=&#x27;virtio-serial&#x27; controller=&#x27;0&#x27; bus=&#x27;0&#x27; port=&#x27;1&#x27;/&gt;
    &lt;/channel&gt;
...</pre>
  <p id="8aew">Если такой секции нет, можем дописать с помощью команды <code>virsh edit ubuntu22.04-guest-agent</code>. Желательно перезагрузить виртуалку после таких манипуляций командой <code>virsh reboot ubuntu22.04-guest-agent</code>.</p>
  <h3 id="z3Fm">Проверка связи</h3>
  <p id="OZ9c">Теперь самое интересное - обратимся к виртуальной машине через агента:</p>
  <pre id="FTB5" data-lang="bash">andrey@ionice:~$ virsh qemu-agent-command ubuntu22.04-guest-agent &#x27;{&quot;execute&quot;: &quot;guest-ping&quot;}&#x27;
{&quot;return&quot;:{}}</pre>
  <p id="aalj">Ну... как-то не впечатляем. Дубль два:</p>
  <pre id="xBwU" data-lang="bash">andrey@ionice:~$ virsh qemu-agent-command ubuntu22.04-guest-agent &#x27;{&quot;execute&quot;: &quot;guest-get-time&quot;}&#x27; --pretty
{
  &quot;return&quot;: 1682620143771430000
}</pre>
  <p id="GAgR">Сделаем поправку на ветер:</p>
  <pre id="JOAM" data-lang="bash">andrey@ionice:~$ virsh qemu-agent-command ubuntu22.04-guest-agent &#x27;{&quot;execute&quot;: &quot;guest-get-time&quot;}&#x27; --pretty | jq .return | date -d -
Чт 27 апр 2023 00:00:00 UTC</pre>
  <p id="Wq4j">Более-менее информация о дате соответствует действительности, но почему-то таймштамп не вернул нам время. Где-то нас обворовали. Тем не менее, самое главное - информацию мы получили не прибегая к протоколам удалённого доступа. Разбираемся дальше.</p>
  <h2 id="RKUd">Обзор протокола QMP</h2>
  <p id="dTL6">Общение с виртаульной машиной осуществляется по протоколу <a href="https://wiki.qemu.org/Documentation/QMP" target="_blank">QMP</a> (QEMU Machine Protocol) через локальный сокет на гипервизоре (то самое виртуальное устройство, которое мы настраивали ранее). Протокол поддерживает весьма обширный набор команд как GET, так и POST. Формат данных протокола - JSON.</p>
  <p id="4O75">Посмотрим, какие команды поддерживает наш qemu-guest-agent в виртуалке:</p>
  <pre id="48Vc" data-lang="bash">andrey@ionice:~$ virsh qemu-agent-command ubuntu22.04-guest-agent &#x27;{&quot;execute&quot;: &quot;guest-info&quot;}&#x27; --pretty | jq -r &#x27;.return.supported_commands[] | select(.enabled==true) | .name&#x27;

guest-ssh-remove-authorized-keys
guest-ssh-add-authorized-keys
guest-ssh-get-authorized-keys
guest-get-osinfo
guest-get-timezone
guest-get-users
guest-get-host-name
guest-exec
guest-exec-status
guest-get-memory-block-info
guest-set-memory-blocks
guest-get-memory-blocks
guest-set-user-password
guest-get-fsinfo
guest-get-disks
guest-set-vcpus
guest-get-vcpus
guest-network-get-interfaces
guest-suspend-hybrid
guest-suspend-ram
guest-suspend-disk
guest-fstrim
guest-fsfreeze-thaw
guest-fsfreeze-freeze-list
guest-fsfreeze-freeze
guest-fsfreeze-status
guest-file-flush
guest-file-seek
guest-file-write
guest-file-read
guest-file-close
guest-file-open
guest-shutdown
guest-info
guest-set-time
guest-get-time
guest-ping
guest-sync
guest-sync-delimited
</pre>
  <p id="wjAV">Впечатляет? Ваш внутренний безопасник уже истерично лупит по кнопке &quot;Запретить&quot;? Мозг рисует безграничные возможности управления инфраструктурой? Чтобы понимать что к чему, сначала рекомендую почитать <a href="https://manpages.ubuntu.com/manpages/jammy/man7/qemu-ga-ref.7.html" target="_blank">референс протокола</a> и двигаться дальше.</p>
  <h2 id="tcvo">Примеры выполнения команд</h2>
  <ul id="H1RI">
    <li id="IpbT">Данные об операционной системе:</li>
  </ul>
  <pre id="lZcd" data-lang="bash">andrey@ionice:~$ virsh qemu-agent-command ubuntu22.04-guest-agent &#x27;{&quot;execute&quot;: &quot;guest-get-osinfo&quot;}&#x27; --pretty | jq

{
  &quot;return&quot;: {
    &quot;name&quot;: &quot;Ubuntu&quot;,
    &quot;kernel-release&quot;: &quot;5.15.0-71-generic&quot;,
    &quot;version&quot;: &quot;22.04.1 LTS (Jammy Jellyfish)&quot;,
    &quot;pretty-name&quot;: &quot;Ubuntu 22.04.1 LTS&quot;,
    &quot;version-id&quot;: &quot;22.04&quot;,
    &quot;kernel-version&quot;: &quot;#78-Ubuntu SMP Tue Apr 18 09:00:29 UTC 2023&quot;,
    &quot;machine&quot;: &quot;x86_64&quot;,
    &quot;id&quot;: &quot;ubuntu&quot;
  }
}</pre>
  <ul id="z5GS">
    <li id="XFKL">Список IPv4 адресов:</li>
  </ul>
  <pre id="qAqh" data-lang="bash">andrey@ionice:~$ virsh qemu-agent-command ubuntu22.04-guest-agent &#x27;{&quot;execute&quot;: &quot;guest-network-get-interfaces&quot;}&#x27; --pretty | jq -r &#x27;.return[].&quot;ip-addresses&quot;[] | select(.&quot;ip-address-type&quot;==&quot;ipv4&quot; and .&quot;ip-address&quot;!=&quot;127.0.0.1&quot;) | .&quot;ip-address&quot;&#x27;

192.168.122.17</pre>
  <ul id="TGxZ">
    <li id="nsd2">Список несистемных пользователей</li>
  </ul>
  <pre id="iuXZ" data-lang="bash">andrey@ionice:~$ virsh qemu-agent-command ubuntu22.04-guest-agent &#x27;{&quot;execute&quot;: &quot;guest-get-users&quot;}&#x27; --pretty | jq -r .return[].user

server</pre>
  <ul id="XIt3">
    <li id="EdWI">Добавим пользователю <code>server</code> публичный ключ для доступа по SSH</li>
  </ul>
  <pre id="O4eS" data-lang="bash">andrey@ionice:~$ virsh qemu-agent-command ubuntu22.04-guest-agent &#x27;{&quot;execute&quot;: &quot;guest-ssh-add-authorized-keys&quot;, &quot;arguments&quot;: {&quot;username&quot;: &quot;server&quot;, &quot;keys&quot;: [ &quot;ssh-rsa xxxxx&quot; ] }}&#x27; --pretty</pre>
  <ul id="kDFj">
    <li id="C0Fb">Убедимся, что ключ был добавлен</li>
  </ul>
  <pre id="B8Be" data-lang="bash">andrey@ionice:~$ virsh qemu-agent-command ubuntu22.04-guest-agent &#x27;{&quot;execute&quot;: &quot;guest-ssh-get-authorized-keys&quot;, &quot;arguments&quot;: {&quot;username&quot;: &quot;server&quot; }}&#x27; --pretty
{
  &quot;return&quot;: {
    &quot;keys&quot;: [
      &quot;ssh-rsa xxxxx&quot;
    ]
  }
}</pre>
  <ul id="y3kz">
    <li id="869W">Выполним какую-нибудь shell-команду и получим её выхлоп. Для этого нам потребуются две команды - guest-exec, чтобы запустить процесс и получить его PID, и guest-exec-status, чтобы узнать чем завершилось выполнение процесса. Выхлоп будет в формате base64</li>
  </ul>
  <pre id="mzN1" data-lang="bash">andrey@ionice:~$ virsh qemu-agent-command ubuntu22.04-guest-agent &#x27;{&quot;execute&quot;: &quot;guest-exec&quot;, &quot;arguments&quot;: { &quot;path&quot;: &quot;/usr/bin/lsb_release&quot;, &quot;arg&quot;: [ &quot;-a&quot; ], &quot;capture-output&quot;: true }}&#x27; --pretty | jq &quot;.return.pid&quot;
832
andrey@ionice:~$ virsh qemu-agent-command ubuntu22.04-guest-agent &#x27;{&quot;execute&quot;: &quot;guest-exec-status&quot;, &quot;arguments&quot;: { &quot;pid&quot;: 832 }}&#x27; --pretty | jq
{
  &quot;return&quot;: {
    &quot;exitcode&quot;: 0,
    &quot;err-data&quot;: &quot;Tm8gTFNCIG1vZHVsZXMgYXJlIGF2YWlsYWJsZS4K&quot;,
    &quot;out-data&quot;: &quot;RGlzdHJpYnV0b3IgSUQ6CVVidW50dQpEZXNjcmlwdGlvbjoJVWJ1bnR1IDIyLjA0LjEgTFRTClJlbGVhc2U6CTIyLjA0CkNvZGVuYW1lOglqYW1teQo=&quot;,
    &quot;exited&quot;: true
  }
}

andrey@ionice:~$ echo RGlzdHJpYnV0b3IgSUQ6CVVidW50dQpEZXNjcmlwdGlvbjoJVWJ1bnR1IDIyLjA0LjEgTFRTClJlbGVhc2U6CTIyLjA0CkNvZGVuYW1lOglqYW1teQo= | base64 --decode 
Distributor ID:	Ubuntu
Description:	Ubuntu 22.04.1 LTS
Release:	22.04
Codename:	jammy

andrey@ionice:~$ echo Tm8gTFNCIG1vZHVsZXMgYXJlIGF2YWlsYWJsZS4K | base64 --decode 
No LSB modules are available.</pre>
  <ul id="cGba">
    <li id="g949">Прочитаем что-нибудь из файла. Для этого сначала откроем его на чтение, получив его ID, затем прочитаем данные из файла (они будут в base64), а потом закроем файл, чтобы не держать лишние процессы и дескрипторы:</li>
  </ul>
  <pre id="c4Fd" data-lang="bash">andrey@ionice:~$ virsh qemu-agent-command ubuntu22.04-guest-agent &#x27;{&quot;execute&quot;: &quot;guest-file-open&quot;, &quot;arguments&quot;: { &quot;path&quot;: &quot;/etc/hosts&quot;, &quot;mode&quot; : &quot;r&quot; }}&#x27; --pretty
{
  &quot;return&quot;: 1000
}

andrey@ionice:~$ virsh qemu-agent-command ubuntu22.04-guest-agent &#x27;{&quot;execute&quot;: &quot;guest-file-read&quot;, &quot;arguments&quot;: { &quot;handle&quot;: 1000 }}&#x27; --pretty
{
  &quot;return&quot;: {
    &quot;count&quot;: 218,
    &quot;buf-b64&quot;: &quot;MTI3LjAuMC4xIGxvY2FsaG9zdAoxMjcuMC4xLjEgcWdhCgojIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGRlc2lyYWJsZSBmb3IgSVB2NiBjYXBhYmxlIGhvc3RzCjo6MSAgICAgaXA2LWxvY2FsaG9zdCBpcDYtbG9vcGJhY2sKZmUwMDo6MCBpcDYtbG9jYWxuZXQKZmYwMDo6MCBpcDYtbWNhc3RwcmVmaXgKZmYwMjo6MSBpcDYtYWxsbm9kZXMKZmYwMjo6MiBpcDYtYWxscm91dGVycwo=&quot;,
    &quot;eof&quot;: true
  }
}

andrey@ionice:~$ echo MTI3LjAuMC4xIGxvY2FsaG9zdAoxMjcuMC4xLjEgcWdhCgojIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGRlc2lyYWJsZSBmb3IgSVB2NiBjYXBhYmxlIGhvc3RzCjo6MSAgICAgaXA2LWxvY2FsaG9zdCBpcDYtbG9vcGJhY2sKZmUwMDo6MCBpcDYtbG9jYWxuZXQKZmYwMDo6MCBpcDYtbWNhc3RwcmVmaXgKZmYwMjo6MSBpcDYtYWxsbm9kZXMKZmYwMjo6MiBpcDYtYWxscm91dGVycwo= | base64 --decode 
127.0.0.1 localhost
127.0.1.1 qga

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

andrey@ionice:~$ virsh qemu-agent-command ubuntu22.04-guest-agent &#x27;{&quot;execute&quot;: &quot;guest-file-close&quot;, &quot;arguments&quot;: { &quot;handle&quot;: 1000 }}&#x27; --pretty
{
  &quot;return&quot;: {

  }
}</pre>
  <h2 id="6OR0">Следы</h2>
  <p id="M3VT">Хоть мой внутренний автоматизатор ликует, параноик всё равно немного параноит. Как минимум, ему хотелось бы понимать как пользователю гостевой ОС контролировать происходящее с его системой. Посмотрим логи с виртуалки:</p>
  <pre id="Cpxp" data-lang="bash">root@qga:~# journalctl -u qemu-guest-agent

Apr 27 18:22:54 qga systemd[1]: Started QEMU Guest Agent.
Apr 27 18:28:40 qga qemu-ga[624]: info: guest-ping called
Apr 27 18:29:17 qga qemu-ga[624]: info: guest-ping called
Apr 27 19:55:41 qga qemu-ga[624]: info: guest-exec called: &quot;/usr/bin/lsb_release -a&quot;
Apr 27 19:56:45 qga qemu-ga[624]: info: guest-exec-status called, pid: 832
Apr 27 20:07:06 qga qemu-ga[624]: info: guest-file-open called, filepath: /etc/hosts, mode: r
Apr 27 20:07:06 qga qemu-ga[624]: info: guest-file-open, handle: 1000
Apr 27 20:14:12 qga qemu-ga[624]: info: guest-file-close called, handle: 1000</pre>
  <p id="BL3s">Как видим, ключевые команды в логе отображаются. Можно выдохнуть.</p>
  <h2 id="B4Ia">Выводы</h2>
  <p id="Tkfz">QEMU Guest Agent - очень интересный способ контроля и управления виртуальными машинами, который уже давно используется в продуктовых средах. Если вы заранее подготовите образы ОС, напишете скрипты или сервисы управления, то сможете облегчить себе обслуживание инфраструктуры &quot;без рук&quot;. Следует однако помнить, что применение инструмента потребует пересмотра политик безопасности. Ну и классическое - with great power comes great responsibility</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.ionice.ru/msi-sword-ram-upgrade</guid><link>https://blog.ionice.ru/msi-sword-ram-upgrade?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devnull</link><comments>https://blog.ionice.ru/msi-sword-ram-upgrade?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devnull#comments</comments><dc:creator>devnull</dc:creator><title>Апгрейд памяти MSI Sword 15 A12UE до 64 Гб</title><pubDate>Fri, 24 Feb 2023 16:30:20 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/3b/15/3b1502b3-c607-4d3b-b15c-5d2121a0bed3.png"></media:content><category>slice of life</category><description><![CDATA[<img src="https://asset.msi.com/resize/image/global/product/product_1639546799ff78a0e885b9e818a2efcc267aa613af.png62405b38c58fe0f07fcef2367d8a9ba1/1024.png"></img>Перед Новым годом нашёл себе ноутбук с возможностью разместить внутри 64 Гб памяти и пару дисков - MSI Sword 15 A12UE-486XRU. Ноутбук купил, а апгрейд отложил на пару месяцев. Когда настало время, изучил внимательно спецификацию и не нашёл никакого криминала в ограничениях по железу - ноутбук имеет 2 слота в которые можно воткнуть планки DDR4 по 32 гигабайта со скоростью 3200 МГц.]]></description><content:encoded><![CDATA[
  <figure id="mL5r" class="m_column">
    <img src="https://asset.msi.com/resize/image/global/product/product_1639546799ff78a0e885b9e818a2efcc267aa613af.png62405b38c58fe0f07fcef2367d8a9ba1/1024.png" width="1024" />
    <figcaption>MSI Sword. Изображение авторства MSI</figcaption>
  </figure>
  <p id="Vqty">Перед Новым годом нашёл себе ноутбук с возможностью разместить внутри 64 Гб памяти и пару дисков - <a href="https://www.msi.com/Laptop/Sword-15-A12UX/Overview" target="_blank">MSI Sword 15 A12UE-486XRU</a>. Ноутбук купил, а апгрейд отложил на пару месяцев. Когда настало время, изучил внимательно <a href="https://www.msi.com/Laptop/Sword-15-A12UX/support?sub_product=Sword-15-A12UE#manual" target="_blank">спецификацию</a> и не нашёл никакого криминала в ограничениях по железу - ноутбук имеет 2 слота в которые можно воткнуть планки DDR4 по 32 гигабайта со скоростью 3200 МГц.</p>
  <figure id="dvTq" class="m_column">
    <img src="https://media.kingston.com/kingston/product/ktc-product-memory-impact-ddr4-single-kit2-1-zm-lg.jpg" width="2048" />
    <figcaption>Kingston Fury Impact. Изображение авторства Kingston</figcaption>
  </figure>
  <p id="hDhC">Раз ограничений нет, купил две планки <strong>Kingston Fury Impact</strong> (<a href="https://www.kingston.com/datasheets/KF432S20IB_32.pdf" target="_blank">KF432S20IB/32</a>). Воткнул в ноутбук, в BIOS всё определилось корректно, скорость 3200 мГц, тайминги 20-22-22-48, напряжение 1,2 В, dual channel. Однако загрузившись в ОС, обнаружил что при работе от сети ноутбук начал перезагружаться. Стал копать, однако никакой возможности переключить XMP-профили, поменять частоту или вольтаж не удалось. Конечно же я обновил BIOS и зашёл в Advanced режим (Необходимо одновременно зажать Left Alt + Right Ctrl + Right Shift + F2), но без толку. По отдельности каждый модуль в любом слоте работал идеально, но работая в паре они приводили к циклической перезагрузке. От версии ядра или ОС тоже не было обнаружено зависимости.</p>
  <pre id="jdn5"># dmidecode 3.3
Getting SMBIOS data from sysfs.
SMBIOS 3.4.0 present.

Handle 0x003B, DMI type 16, 23 bytes
Physical Memory Array
	Location: System Board Or Motherboard
	Use: System Memory
	Error Correction Type: None
	Maximum Capacity: 32 GB
	Error Information Handle: Not Provided
	Number Of Devices: 2

Handle 0x003C, DMI type 17, 92 bytes
Memory Device
	Array Handle: 0x003B
	Error Information Handle: Not Provided
	Total Width: 64 bits
	Data Width: 64 bits
	Size: 32 GB
	Form Factor: SODIMM
	Set: None
	Locator: Controller0-ChannelA-DIMM0
	Bank Locator: BANK 0
	Type: DDR4
	Type Detail: Synchronous
	Speed: 3200 MT/s
	Manufacturer: Kingston
	Serial Number: BF8F2D6C
	Asset Tag: 9876543210
	Part Number: KF3200C20S4/32GX    
	Rank: 2
	Configured Memory Speed: 3200 MT/s
	Minimum Voltage: 1.2 V
	Maximum Voltage: 1.2 V
	Configured Voltage: 1.2 V
	Memory Technology: DRAM
	Memory Operating Mode Capability: Volatile memory
	Firmware Version: Not Specified
	Module Manufacturer ID: Bank 2, Hex 0x98
	Module Product ID: Unknown
	Memory Subsystem Controller Manufacturer ID: Unknown
	Memory Subsystem Controller Product ID: Unknown
	Non-Volatile Size: None
	Volatile Size: 32 GB
	Cache Size: None
	Logical Size: None

Handle 0x003D, DMI type 17, 92 bytes
Memory Device
	Array Handle: 0x003B
	Error Information Handle: Not Provided
	Total Width: 64 bits
	Data Width: 64 bits
	Size: 32 GB
	Form Factor: SODIMM
	Set: None
	Locator: Controller1-ChannelA-DIMM0
	Bank Locator: BANK 0
	Type: DDR4
	Type Detail: Synchronous
	Speed: 3200 MT/s
	Manufacturer: Kingston
	Serial Number: E48F37DC
	Asset Tag: 9876543210
	Part Number: KF3200C20S4/32GX    
	Rank: 2
	Configured Memory Speed: 3200 MT/s
	Minimum Voltage: 1.2 V
	Maximum Voltage: 1.2 V
	Configured Voltage: 1.2 V
	Memory Technology: DRAM
	Memory Operating Mode Capability: Volatile memory
	Firmware Version: Not Specified
	Module Manufacturer ID: Bank 2, Hex 0x98
	Module Product ID: Unknown
	Memory Subsystem Controller Manufacturer ID: Unknown
	Memory Subsystem Controller Product ID: Unknown
	Non-Volatile Size: None
	Volatile Size: 32 GB
	Cache Size: None
	Logical Size: None</pre>
  <p id="BCWq">В процессе поиска информации, нашёл <a href="https://forum-en.msi.com/index.php?threads/msi-crosshair-15-b12ugz-keeps-restarting-when-using-both-dimms-runs-fine-on-1-only.381802/" target="_blank">интересный тред</a> на форуме MSI. Оказывается проблема с перезагрузкой обнаружилась не только у меня. Там я нашёл трогательную <a href="https://forum-en.msi.com/index.php?threads/msi-crosshair-15-b12ugz-keeps-restarting-when-using-both-dimms-runs-fine-on-1-only.381802/post-2167926" target="_blank">историю</a> о том, как пользователь смог наладить стабильную работу, вставив планки памяти <strong>ADATA Premier</strong> (<a href="https://www.adata.com/upload/downloadfile/datasheet_premier_ddr4_3200_so_dimm_20210514.pdf" target="_blank">AD4S320032G22-SGN</a>, именно <strong>SGN</strong>).</p>
  <figure id="Josd" class="m_retina">
    <img src="https://webapi3.adata.com/storage/product/pk_ad4s320032g22_sgn_32g_x16_s_so_dimmx8_bk_1000x1000_w.jpg" width="500" />
    <figcaption>Adata Premier. Изображение авторства ADATA.</figcaption>
  </figure>
  <p id="NEP6">Пришлось обменять Kingston на ADATA. Процедура заняла у меня целый день, благо покупал я всё в оффлайн магазинах и сдать память проблем не составило, а вот чтобы купить новую - пришлось съездить в соседний город на склад, поскольку в розничном магазине мне пытались продать какое-то бывшее в употреблении недоразумение в коробке из под оригинальной памяти. Приехав наконец-то домой и воткнув планки в нотубук, стал гонять тесты. Система не перезагружалась, работала и от батареи, и от сети. Разница с Kingston оказалась лишь в таймингах (и цене) - новые были 22-22-22-52, скорость, напряжение, rank - идентичные. Память не такая производительная, однако с ней работа стала действительно стабильной.</p>
  <pre id="uOTI"># dmidecode 3.3
Getting SMBIOS data from sysfs.
SMBIOS 3.4.0 present.

Handle 0x003B, DMI type 16, 23 bytes
Physical Memory Array
	Location: System Board Or Motherboard
	Use: System Memory
	Error Correction Type: None
	Maximum Capacity: 32 GB
	Error Information Handle: Not Provided
	Number Of Devices: 2

Handle 0x003C, DMI type 17, 92 bytes
Memory Device
	Array Handle: 0x003B
	Error Information Handle: Not Provided
	Total Width: 64 bits
	Data Width: 64 bits
	Size: 32 GB
	Form Factor: SODIMM
	Set: None
	Locator: Controller0-ChannelA-DIMM0
	Bank Locator: BANK 0
	Type: DDR4
	Type Detail: Synchronous
	Speed: 3200 MT/s
	Manufacturer: A-DATA Technology
	Serial Number: F74F0000
	Asset Tag: 9876543210
	Part Number:                     
	Rank: 2
	Configured Memory Speed: 3200 MT/s
	Minimum Voltage: 1.2 V
	Maximum Voltage: 1.2 V
	Configured Voltage: 1.2 V
	Memory Technology: DRAM
	Memory Operating Mode Capability: Volatile memory
	Firmware Version: Not Specified
	Module Manufacturer ID: Bank 5, Hex 0xCB
	Module Product ID: Unknown
	Memory Subsystem Controller Manufacturer ID: Unknown
	Memory Subsystem Controller Product ID: Unknown
	Non-Volatile Size: None
	Volatile Size: 32 GB
	Cache Size: None
	Logical Size: None

Handle 0x003D, DMI type 17, 92 bytes
Memory Device
	Array Handle: 0x003B
	Error Information Handle: Not Provided
	Total Width: 64 bits
	Data Width: 64 bits
	Size: 32 GB
	Form Factor: SODIMM
	Set: None
	Locator: Controller1-ChannelA-DIMM0
	Bank Locator: BANK 0
	Type: DDR4
	Type Detail: Synchronous
	Speed: 3200 MT/s
	Manufacturer: A-DATA Technology
	Serial Number: 244D0000
	Asset Tag: 9876543210
	Part Number:                     
	Rank: 2
	Configured Memory Speed: 3200 MT/s
	Minimum Voltage: 1.2 V
	Maximum Voltage: 1.2 V
	Configured Voltage: 1.2 V
	Memory Technology: DRAM
	Memory Operating Mode Capability: Volatile memory
	Firmware Version: Not Specified
	Module Manufacturer ID: Bank 5, Hex 0xCB
	Module Product ID: Unknown
	Memory Subsystem Controller Manufacturer ID: Unknown
	Memory Subsystem Controller Product ID: Unknown
	Non-Volatile Size: None
	Volatile Size: 32 GB
	Cache Size: None
	Logical Size: None</pre>
  <p id="O9yr">Для наглядности - результаты тестов Basemark GPU. Хоть этот бенчмарк и расчитан на тестирование производительности графики, однако разница в 100 попугаев между ADATA и Kingston присутствет:</p>
  <figure id="L80f" class="m_column">
    <img src="https://img3.teletype.in/files/60/0b/600b2105-b4df-4787-a961-ca695a906812.png" width="787" />
    <figcaption>Basemark GPU. Верхняя строка - ADATA, нижняя - Kingston.</figcaption>
  </figure>
  <p id="ahmI">По субъективным ощущениям - c Kingston система гораздо более отзывчива, однако с ADATA охлаждение работает гораздо тише в простое.</p>
  <p id="C9jZ">Выводы сделаны следующие:</p>
  <ul id="0TQL">
    <li id="YSUH">MSI вводит пользователей в заблуждение своими маркетинговыми заявлениями</li>
    <li id="f0fH">MSI не предоставляет список совместимого оборудования</li>
    <li id="62mS">MSI не заинтересован в помощи пользователям - по заявлению вендора, хоть проблема и есть, но проявляется у слишком малого количества людей и это не повод пилить апгрейды для BIOS</li>
  </ul>
  <p id="F1JN">Следующим этапом буду менять диски и, подозреваю, с этим тоже могут возникнуть какие-то сложности.</p>

]]></content:encoded></item></channel></rss>