LINUX.ORG.RU

Избранные сообщения imul

Посоветуйте 2.5" SATA HDD enclosure

Форум — Talks

Посоветуйте 2.5" SATA HDD enclosure, поддерживающий uas фактически, т.е. которым вы сами пользовались. На днях купил нечто с заявленной, но криво реализованной поддержкой, пришлось переключить в USB Mass Storage.

Желательно еще, чтобы его не страшно было в T14s пихать.

@intelfx

 , ,

i586 ()

Немонстроузный web-проигрыватель бесконечного DASH потока с IP камеры.

Форум — Web-development

Все говнобраузеры до сих пор не умеют в RTSP и даже не умеют нормально проигрывать бесконечный поток. Какое-то позорище натуральное. Бесконечный поток с камеры, например, поставленный на паузу вообще ни разу не должен продолжаться с той самой секунды когда его остановили. Внезапно. А должен продолжаться при снятии с паузы с самого последнего принятого keyframe. И браузеру нахер не нужно сжирать всю память пытаясь сохранить всё, что было передано с момента нажатия на паузу. Но, видимо, для браузерописцев эти элементарные вещи совершенно недоступны для понимания, и в результате реализация HTMLVideoElement’а, что в хроме, что в фаерфоксе является полным говном.

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

Оказалось что самый маленький плеер умеющий проигрывать multiple-file-DASH видео (openplayer.js) весит 167 килобайт, сцуко! И это минифицированный вариант! Чему там можно столько весить я нихрена не понял. Про «референсный» dash.js я вообще молчу. Это лютейший звездец размером больше полмегабайта в минифицированном виде. Мелкософтовский пример жабоскриптного DASH-плеера заточен на single-file-DASH. А ffmpeg c -single_file 1 пишет поток на диск бесконечно, засирая диск далеко не всегда нужным видеомусором.

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

Вот велосипед:

Жабоскрипт:

'use strict'

function Dash( id )
{
    var _ = this;
    _.v = document.getElementById( id );
    var url = _.v.src;
    _.v.src = undefined;
    var slash = url.lastIndexOf("/");
    _.path = url.substring( 0, slash + 1 );
    _.mpd = url.substring( slash + 1 );
    _.init = true;
    _.xhr = [];
    _.load_mpd( false );
    _.video_update  = function() { _._video_update(); };
    _.video_updated = function() { _._video_updated(); };
    _.video_updating = false;

    _.v.addEventListener( 'click', _.toggle.bind(_), false );

    _.v.addEventListener( 'pause', function ()
    {
        console.log( 'paused' );
        this.removeEventListener( 'timeupdate', _.video_update );
        if( _.videoSource.updating ) _.videoSource.abort();
        _.xhr.forEach( function ( xhr ) { xhr.abort(); } );
    }, false);

    _.v.addEventListener( 'play', function()
    {
        console.log( 'playing' ); 
        this.addEventListener( 'timeupdate', _.video_update, false );
    }, false);

    _.v.addEventListener( 'ended', function()
    {
        console.log( 'ended' );
        this.removeEventListener( 'timeupdate', _.video_update );
    }, false);

    _.v.addEventListener( 'error', function(e) { console.log( 'video error: ' + e ); }, false );
    _.v.addEventListener( 'emptied', function() { console.log( 'emptied' ); }, false );
}

Dash.prototype.play = function() { this.load_mpd( true ); }
Dash.prototype.stop = function() { this.v.pause(); }
Dash.prototype.toggle = function()
{
    if( this.v.paused == true ) this.play();
    else                        this.stop();
}

Dash.prototype.mpd_parse = function( data )
{
    var _ = this, e, g;
    e = data.querySelectorAll("Representation")[0];
    g = e.getAttribute.bind( e );
    _.id        = g( 'id' );
    _.mimetype  = g( 'mimeType' );
    _.codecs    = g( 'codecs' );
    _.width     = g( 'width' );
    _.height    = g( 'height' );

    e = data.querySelectorAll( 'SegmentTemplate' )[0];
    g = e.getAttribute.bind( e );
    _.timescale = g( 'timescale' );
    _.ini       = g( 'initialization' );
    _.seg       = g( 'media' );
    _.start     = g( 'startNumber' );

    _.ini = _.ini.replace( '$RepresentationID$', _.id );
    _.seg = _.seg.replace( '$RepresentationID$', _.id );

    _.duration = [];

    data.querySelectorAll("S").forEach( function( v, i )
    {
        _.duration[i] = v.getAttribute( 'd' ) / _.timescale;
        if( i == 0 ) _.ts = v.getAttribute( 't' );
    } );
}

Dash.prototype.load_mpd = function( start )
{
    var _ = this;
    _.xhr[0] = new XMLHttpRequest();
    _.xhr[0].onreadystatechange = function ()
    {
        if( this.readyState != this.DONE ) return;
        if( this.status != 200 ) return;

        var parser = new DOMParser();
        var xmlData = parser.parseFromString( this.response, 'text/xml' );

        _.mpd_parse( xmlData );

        if( start )
        {
            _.video_updating = false;
            _.num = parseInt( _.start ) + 1;
            _.ts_current = _.v.currentTime;
            _.load_seg();
        }

        if( _.init )
        {
            _.v.width  = _.width;
            _.v.height = _.height;
            _.mediaSource = new window.MediaSource();
            _.mediaSource.addEventListener( 'sourceopen', function (e) {
                _.videoSource = _.mediaSource.addSourceBuffer( _.mimetype + '; codecs="' + _.codecs + '"' );
                _.videoSource.mode = 'sequence';
                _.videoSource.addEventListener( 'updateend', _.video_updated, false );
                _.load_ini();
            }, false );
            _.v.src = URL.createObjectURL( _.mediaSource );
        }
    }
    _.xhr[0].open( 'GET', _.path + _.mpd );
    _.xhr[0].send();
}

Dash.prototype.append = function( f )
{
    var _ = this;
    _.xhr[1] = new XMLHttpRequest();
    _.xhr[1].responseType = 'arraybuffer';
    _.xhr[1].onreadystatechange = function ()
    {
        if( this.readyState != this.DONE ) return;
        if( this.status != 200 ) return;
        _.videoSource.appendBuffer( new Uint8Array( this.response ) );
    };
    _.xhr[1].open( 'GET', _.path + f );
    _.xhr[1].send();
}

Dash.prototype.load_ini = function()
{
    this.append( this.ini );
}

Dash.prototype.load_seg = function()
{
    var n = this.num.toString();
    if( n.length < 5 ) n = ( '0000' + n ).slice( -5 );
    this.append( this.seg.replace( '$Number%05d$', n ) );
}

Dash.prototype._video_update = function()
{
    var _ = this;
    if( _.video_updating ) return;
    var i = _.num - _.start;
    if( _.v.currentTime >= _.ts_current - _.duration[i] * 0.5 )
    {
        _.video_updating = true;
        _.load_seg();
    }
}

Dash.prototype._video_updated = function()
{
    var _ = this;

    if( _.init ) { _.init = false; return; }

    if( _.v.paused == true )
    {
        _.v.currentTime = _.ts_current;
        _.v.play();
    }
    _.ts_current += _.duration[ _.num - _.start ];
    _.num++;
    if( _.num - _.start >= _.duration.length - 1 ) _.load_mpd( false );
    _.video_updating = false;
}

Страничка:

<HTML>
<HEAD>
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" content="no-cache">
<META HTTP-EQUIV="Content-Type" content="text/html; charset=utf-8">
<SCRIPT src="tiny-dash.js" type="text/javascript"></SCRIPT>
<SCRIPT>
var dash;
window.addEventListener( 'load', function() { dash = new Dash( 'dashvideo' ); }, false );
</SCRIPT>
<TITLE>Camera stream</TITLE>
</HEAD>
<BODY bgcolor="#000000" text="#c0c0c0">
<VIDEO id="dashvideo" src="media/manifest.mpd" preload="none">No video available</video>
</DIV>
</BODY>

На серваке из-под nobody запустить

#!/bin/sh

stream="rtsp://host:port/ch0_264"
target="/где.там.страничка.лежит/media/manifest.mpd"

/usr/bin/ffmpeg \
-probesize 32 \
-loglevel quiet \
-i "${stream}" \
-an \
-c:v copy \
-f dash \
-window_size 4 \
-extra_window_size 1 \
-min_seg_duration 2000000 \
-remove_at_exit 1 \
"${target}"

В /где.там.страничка.лежит/media лучше примонтировать tmpfs - и шустро, и диск не трогает.

Длительность сегмента и размер окна можно подкрутить, если канал убогий.

Для руления плеером из жабоскрипта есть методы Dash.play(), Dash.pause() и Dash.toggle(). Всякие кнопки и украшательства добавляются по вкусу.

Работает в хроме и фаерфоксе. Задержка, разумеется есть, но без неё, увы, при воспроизведении DASH не обойтись.

Решение отлично подходит для камер, которые нафиг не нужно куда-то записывать, но которые хотят смотреть много (и даже очень много) людей одновременно. HTTP сервер всего лишь раздаёт не особо большие файлики из tmpfs, так что нагрузка минимальна.

В принципе, это всё несложно использовать для организации self-hosted zoom при минимальной доработке - нужно только организовать передачу потоков с вебок на сервер (да хоть через netcat), а там их так же раскладывать в сегменты ffmpeg’ом.

Лицензия - WTFPL

ЗЫ: Хотел в теги добавить ещё «копрофилию» но ограничение на 5 тегов испортило всю малину.

ЗЗЫ: Это, кстати, эксклюзив специально для ЛОР. :) Нигде больше публиковать это я не собираюсь.

 , , , ,

Stanson ()

Выпуск minidjvu-mod 0.9m02

Новости — Open Source
Группа Open Source

minidjvu-mod – это кодировщик текстового слоя для создания многостраничных DjVu документов (аналог cjb2 пакета DjVuLibre). Пожалуй, единственный свободный (GPL-3.0) кодировщик на данный момент, способный конкурировать по итоговому размеру файла с коммерческими проприетарными аналогами (documenttodjvum.exe от LizardTech).

minidjvu-mod является форком проекта minidjvu, разработанного Ильёй Межировым и Алексеем Крюковым в 2005-2010 гг. По сравнению с оригиналом, алгоритмы обработки переписаны с использованием битовых операций напрямую над монохромными изображениями, а также добавлена поддержка многопоточной обработки (OpenMP) общих словарей (djbz) документа. Полученный прирост в производительности позволил убрать некоторые эвристики и потратить дополнительные ресурсы на более полную оптимизацию общего словаря, от чего напрямую зависит качество сжатия итогового документа. В результате на современных многоядерных CPU minidjvu-mod уже не критично отстает по скорости работы от коммерческих аналогов, а также стал сравним по качеству сжатия результата.

В новой версии minidjvu-mod 0.9m02 также добавлена возможность передавать параметры кодирования документа через файл настроек. С его помощью можно дополнительно:

  • задавать индивидуальные параметры обработки конкретным изображениям;
  • контролировать, какие изображения попадут в тот или иной общий словарь (djbz);
  • задавать индивидуальные параметры кодирования общих словарей.

>>> Страница проекта на github

 

Truf ()

Настройка Wireguard для доступа к локальной сети

Форум — Admin

Локальная сеть офиса с сервером на Ubuntu 20.04

Надо настроить доступ в эту сеть удаленным клиентам. Wireguard вообще подходит для такой задачи?

Везде инструкции, как настроить Wireguard для доступа клиентов в Интернет. Либо инструкции по настройке туннеля в офис, но почему-то для этого надо два сервера.

А простой доступ к локальной сети - такое вообще возможно, и если возможно, то как?

 

Name2006 ()

73!

Форум — Talks

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

Перемещено Zhbert из general

 

exception13 ()

Релиз OpenIPC 2.1

Новости — Hardware and Drivers
Группа Hardware and Drivers

Вышла новая мажорная версия дистрибутива Linux OpenIPC (изначально основанного на OpenWRT), предназначенного для установки непосредственно в камерах видеонаблюдения для замены оригинальных прошивок, большинство из которых со временем перестают обновляться производителями.

Основные новшества релиза:

  • кроме SoC HiSilicon (60% китайских камер на нашем рынке) заявлена поддержка SigmaStar и Xiongmai;
  • добавлена поддержка протокола HLS, которая позволяет организовать трансляцию видео в любом браузере непосредственно с камеры без использования промежуточного сервера;
  • OSD система (on screen display) имеет возможность выводить произвольные данные шрифтами в Unicode (в том числе на русском языке);
  • поддержка протокола NETIP (также известного на DVRIP) для обновления камер в существующих инсталляциями с китайскими видеорегистраторами.

( читать дальше... )

>>> Сайт проекта

 , ,

widgetii ()

Как работает Nvidia prime?

Форум — Linux-hardware

Стоит значится 465 драйвер. Но при запуске игрулек - запуск идет на IntelHD а не nvdidia я может что-то не понимаю. Или там настраивать что-то надо?

 ,

virussokk93 ()

Улучшаем изображения и видео с помощью нейросетей [увеличение, очистка артефактов сжатия, 60 FPS]

Форум — Talks

(!) Во-первых, если вы хотите сразу, ни в чем не разбираясь, просто сходу нажать пару кнопок и получить результат, то вам нужна графическая программа, которая написана только под Windows -
Waifu2x-Extension-GUI: https://github.com/AaronFeng753/Waifu2x-Extension-GUI/releases
Она уже содержит все необходимое, и позволяет в полностью автоматическом режиме разбить видео на кадры, улучшить их с помощью одной нейросети, увеличить плавность (60 FPS) в другой, и собрать итоговое видео в пару кликов.
Пример такой конверсии: https://www.youtube.com/watch?v=qGk4E9ss95s
Оригинал видео: https://www.youtube.com/watch?v=ht39JUr5wm8

Свободные Vulcan-реализации нейросетей представлены 是 nihui !

Нейросети для улучшения фотографий

Topaz Gigapixel AI - Лучшая нейросеть для улучшения фотографий, дает самое четкое и детальное изображение. Только для Windows и macOS. Может работать как плагин для Photoshop. Встречайте на всех файлопомойках страны.

realsr-ncnn-vulcan - Лучшая-свободная нейросеть для улучшения фотографий, победитель конкурса 2020 года среди собратьев. Скачать: https://github.com/nihui/realsr-ncnn-vulkan


Нейросети для улучшения рисунков

Topaz Gigapixel AI - Также является лучшей и для улучшения рисунков, дает самое четкое и детальное изображение. Только для Windows и macOS. Может работать как плагин для Photoshop. Встречайте на всех файлопомойках страны.

waifu2x-ncnn-vulcan - Лучшая-свободная нейросеть для улучшения рисунков, значительно опережает по качеству всех своих собратьев. Скачать: https://github.com/nihui/waifu2x-ncnn-vulkan


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

Topaz Video Enhance AI - Дает более лучший результат на видео-материале, чем нейросети, обученные на статике. Подходит как для фильмов, так и мультфильмов. Только для Windows и macOS. Встречайте на всех файлопомойках страны.


Нейросети для увеличения плавности видео (60 FPS)

rife-ncnn-vulkan - Лучшая нейросеть для увеличения плавности видео. На голову опережает всех, как по качеству, так и по скорости. Скачать: https://github.com/nihui/rife-ncnn-vulkan


Обзоры и примеры

Обзор RealSR - https://linuxreviews.org/RealSR
Обзор Waifu2x - https://linuxreviews.org/Waifu2x

480p видео, улучшенное при помощи Topaz Gigapixel AI - https://www.youtube.com/watch?v=b-U8CA1yF4U
(Topaz Video Enhance AI даст еще более лучший результат, при использовании модели Gaia-HQ)

Плейлист видео с увеличенной плавностью (60 FPS) - https://www.youtube.com/playlist?list=PLbZqiWS25MmQAJSuE4MbsvzriRfew_kNQ

Moderators ()

$деньги$ Кто возьмётся делать простые проекты хардверные с гитхаба? Большая часть - тупо готовые модули и копипаста. У самого нет времени.

Форум — Talks

Добрый день . Хочу делать мелкие проекты (максимум ЛУТ, остальное из готовых модулей, но с нормальным креплением в корпусе и пайкой проводов). Корпус уровня китай/распачная коробка можно. Количество изделий 1-3 штуки. Кто возьмётся за такие проектики? Часть оборудования сам могу прислать.

https://ibb.co/jbX96hz Вот пример первого простого проекта.

 , , , ,

aafedorov1989 ()

iLoud MTM?

Форум — Talks

Привет, @ergo.

Твоя тема в «рабочих местах» внезапно оказалась в архиве, поэтому вынужден спросить в толксах.

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

Расскажи про iLoud подробнее. Можешь ли ты их абстрактно рекомендовать? Если нет, то почему именно они и чем ты руководствовался при выборе?

Или это просто «хорошие затычки», а для качественного звука у тебя что-то другое? Или наоборот, это какая-то очень специализированная железка, которая не имеет смысла в общем случае?


Заодно скажи пару слов про «пресонус» с наушниками, если не затруднит. Но это уже второстепенный вопрос.

 , , ,

intelfx ()

Реализован способ задействовать «виртуализацию» видеокарт NVIDIA на младших моделях

Новости — Проприетарное ПО
Группа Проприетарное ПО

Группа энтузиастов реализовала хак, отдающий PCI ID «профессиональных» карт-ускорителей проприетарным драйверам от компании NVIDIA для Linux. Хак отрабатывает как на этапе опроса присутствующего в системе оборудования, так и на этапе проверки верификации ID карты через цифровую подпись драйвером.

«Обманутые» таким образом драйвера публикуют интерфейс, необходимый для эмуляции нескольких виртуальных карт на одном физическом устройстве. В частности, это позволяет использовать аппаратные возможности карт в операционных системах, запущенных под управлением qemu-kvm.

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

( читать дальше... )

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

 

LamerOk ()

Защищаем чистый кэш файлов при нехватке памяти для предотвращения пробуксовки и livelock

Форум — Talks

Во-первых, вышла новая линейка для этой самой защиты: https://github.com/hakavlad/le9-patch/tree/main/le9db_patches.

В описании патчей все написано.

Спрашивайте ответы, если еще остались вопросы.

 , , ,

hakavlad ()

Сделал публичный порт-форвардер через SSH, оцените

Форум — General

ssh ssh-j.com

Сервис для проброса SSH-подключения из-за NAT. Никаких доп. программ ни на сервере, ни на клиенте. Никаких регистраций и временных доменов/портов. Одна команда для проброса SSH, одна для подключения.

Хоть ssh-j и позволяет пробрасывать любые сервисы, предлагается публиковать только порты SSH, чтобы не нарушался принцип end-to-end шифрования.

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

Буду рад услышать отзывы.

 , ,

ValdikSS ()

Xilinx открыла исходный код Vitis HLS

Новости — Open Source
Группа Open Source

Компания Xilinx, выпускающая интегральные микросхемы программируемой логики, открыла исходный код Vitis HLS — набора инструментов, который позволяет синтезировать высокоуровневое описание логической структуры FPGA из кода на Си/Си++ (в том числе с использованием OpenCL).

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

Исходный код опубликован на условиях лицензии Apache 2.0 и доступен в репозитории на GitHub.

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

 ,

ymn ()

Proxmox на десктопе

Галерея — Скриншоты

На скриншоте самый обычный проксмокс в кластере с двумя узлами, который развернут у меня дома. KDE установлен на этот же proxmox, в нем запущен firefox, а в firefox открыта веб-морда proxmox. Такая вот рекурсия.

Предыстория

Не так давно собрал себе бюджетный сервер на Xeon e5 2660v2 под хранилище виртуалок и контейнеров. К сожалению, так как потребности в вычислительных мощностях серьезно выросли за последний год, обходится парочкой Odroid-X2, как в старые добрые времена уже не могу, да и старенький HTPC на хасвелле с пассивным охлаждением с нагрузкой не всегда справляется, особенно летом.

Изначально думал собирать на TR4 1950x, но проконсультировавшись с жабой решил собрать бюджетную конфигурацию на LGA2011 и дополнить ее AMD RX580 в виде видео.

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

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

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

Конфигурация десктопа:

  • i7-4560U
  • 16 GB RAM
  • 128GB + 256GB + 256GB SSD

Конфигурация сервера:

  • Материнка X79 PlexHD ~100$
  • Xeon e5 2660v2 ~100$
  • 64GB DDR3 ECC RAM 1866 ~200$
  • 2U корпус от Etegra (подарили, 1U БП с резервированием, бэкплейн и прочее пришлось выкинуть, а сам корпус доработать напильником и 3д-принтером.)
  • 2U тихий блок питания 500W (~6.5к рублей)
  • 16Gb Optane M.2 (~2.8k рублей)

Жесткие диски переместил из NAS’а и старых компов, докупать пришлось только оптанчик.

Хотя по количеству вышел (имхо) небольшой перебор:

1x1 Tb SSD для системы 2x6 Tb зеркальный рейд для данных 2х1 Tb полосатый рейд с bcache на оптане - площадка для сборки разного софта. Только при сборке на нем проектов типа OpenWRT/linux, удается выгрузить все ядра на 100%. Без кеша на оптане все упирается в I/O и больше 30-40% загрузить не выходит.

Также в новости про Stadia интересовались задержками при стриминге через steam. Собственно, дублирую замеры сюда:

На тесте было тупо главное меню subnautica:

  1. Софтварный энкод в 6 тредов + софтовый же декод на хасвелле: 59fps@1920x1080 задержка видео 33 мс.

  2. Софтварный энкод в 6 тредов + декодирование через QSV - 22 мс, те же 59 fps.

  3. Аппаратный AMF энкод + декодирование через QSV - 29(!) мс.

Соединение - гигабитный линк по меди через роутер.

По количеству потоков программного кодирования: 1 поток - неиграбельно 2 потока - 50 мс и 19 fps 3 потока - 30 fps, 35 ms лаг 4 потока - 30 fps, 30 ms лаг 6 потоков - 60 fps и 21 ms лаг

Вывод: программное кодирование в большое (6+) количество потоков даст лучше и по задержкам и по качеству, чем аппаратное.

В общем как-то так. Ядра выжираются почти полностью 67% от 10 ядер судя по веб-морде проксмокса. Дополнительная погрешность от VNC и самой субнаутики.

TODO:

  • Замеры энергопотребления
  • Прикрутить vagrant к контейнерам proxmox
  • Осилить chef
  • Мигрировать все веб-приложения из виртуалок в контейнеры, попутно переписав все развертывание на chef, вместо ручной настройки. Это должно сделать автообновления всего этого добра намного проще в теории. (Сейчас там все в основном на debian stable с автоапдейтами и большей частью живет на автопилоте не требуя вмешательства, кроме ритуального обновления iredmail)

>>> Просмотр (1920x1080, 238 Kb)

 , ,

ncrmnt ()

Осваиваем ZFS: как правильно готовить?

Форум — Admin

Из чистого любопытства, просто для ознакомления, поднял две виртуалки CentOS 8.2 (15 Гб под систему lvm), 4 виртуальных диска такого же размера в ZFS RAID 10.

zfs-0.8.5-1

zfs-kmod-0.8.5-1

В систему говноскриптом поставил LAMP, подмонтировал ZFS-пулл для его файлов.

Стащил скрипт со stackexchange

#!/bin/sh

#Setup/variables:

#Each snapshot name must be unique, timestamp is a good choice.
#You can also use Solaris date, but I don't know the correct syntax.
snapshot_string=DO_NOT_DELETE_remote_replication_
timestamp=$(/usr/bin/date '+%Y%m%d%H%M%S')
source_pool=data
destination_pool=data
new_snap="$source_pool"@"$snapshot_string""$timestamp"
destination_host=hostname

# Initial send:

# Create first recursive snapshot of the whole pool.
zfs snapshot -r "$new_snap"
# Initial replication via SSH.
zfs send -R "$new_snap" | ssh "$destination_host" zfs recv -Fdu "$destination_pool"

# Incremental sends:

# Get old snapshot name.
old_snap=$(zfs list -H -o name -t snapshot -r "$source_pool" | grep "$source_pool"@"$snapshot_string" | tail --lines=1)
# Create new recursive snapshot of the whole pool.
zfs snapshot -r "$new_snap"
# Incremental replication via SSH.
zfs send -R -I "$old_snap" "$new_snap" | ssh "$destination_host" zfs recv -Fdu "$destination_pool"
# Delete older snaps on the local source (grep -v inverts the selection)
delete_from=$(zfs list -H -o name -t snapshot -r "$source_pool" | grep "$snapshot_string" | grep -v "$timestamp")
for snap in $delete_from; do
    zfs destroy "$snap"
done

На ВМ-источнике создаю в подмонтированном каталоге текстовый файл. Запускаю скрипт.

Выхлоп:

cannot receive new filesystem stream: destination has snapshots (eg. data@DO_NOT_DELETE_remote_replication_20201207101336)
must destroy them to overwrite it
cannot create snapshot 'data@DO_NOT_DELETE_remote_replication_20201207103101': dataset already exists
no snapshots were created
WARNING: could not send data@DO_NOT_DELETE_remote_replication_20201207103101:
incremental source (data@DO_NOT_DELETE_remote_replication_20201207103101) is not earlier than it
cannot receive: failed to read from stream

Хотя на целевой ВМ никаких снепшотов, конечно, нет.

ЧЯДНТ?

 , , ,

Twissel ()

SPICE или VNC при старте Xorg

Форум — General

Коротко опишу чего я хочу: из LightDM, выбирая пользователя/wm, запускать spice/vnc клиент на указанный IP. Если такое можно на другом дисплейном менеджере, то не беда.

 , , , ,

Artamudo ()

Bird не принимает маршруты после запуска

Форум — Admin

У меня почему-то bird сегодня все маршруты от пира отфильтровал. Вот фольтр:

gw=bgp_next_hop; if net = ::/0 then reject; else accept;

Самое интересное, что после перезапуска, всё стало работать. Причём сколько я дёргал, так баг воспроизвести не получилось. Bird запускается в netns. Сам netns инициализируется через init скрипт. Вот скрипт инициализации netns:

#!/bin/bash
# Configuration
EXT_INTERFACES="eth1"
NS_NAME="vrouter"
start () {
	if [ -f /opt/bird/var/run/bird.pid ]
	then
		kill `cat /opt/bird/var/run/bird.pid `
	fi
		
	if [ -f /run/netns/${NS_NAME} ]
	then
		for a in $EXT_INTERFACES
		do
			ip -netns $NS_NAME link set dev $a netns 1
		done	
		ip netns del ${NS_NAME}
	else
		true
	fi
	ip netns add ${NS_NAME}
	for a in $EXT_INTERFACES
	do
		ip link set dev $a netns ${NS_NAME}
	done
	ip link add dev vr0p0 type veth peer name vr0p1 
        ip link add dev vr1p0 type veth peer name vr1p1 
	ip link set dev vr0p0 mtu 65535
	ip link set dev vr0p0 up
        ip link set dev vr1p0 mtu 9000
        ip link set dev vr1p0 up
	ip link set dev vr0p1 netns $NS_NAME
	ip -netns $NS_NAME link set dev lo up
	ip -netns $NS_NAME link set dev vr0p1 up
	ip -netns $NS_NAME link set dev vr0p1 mtu 65535
        ip link set dev vr1p1 netns $NS_NAME
        ip -netns $NS_NAME link set dev vr1p1 up
        ip -netns $NS_NAME link set dev vr1p1 mtu 9000
	ip -netns $NS_NAME link add dev phy-net type bridge
	ip -netns $NS_NAME link set dev phy-net up
	ip -netns $NS_NAME link set dev vr1p1 master phy-net
	for a in $EXT_INTERFACES
	do
		ip -netns $NS_NAME link set dev $a up
		ip -netns $NS_NAME link set dev $a master phy-net
	done
	ip -netns $NS_NAME addr add 198.18.120.10/24 brd 198.18.120.255 dev phy-net
	#ip -netns $NS_NAME route add default via 198.18.120.1
	ip -netns $NS_NAME addr add 2a01:d0:c353:82::10/112 dev phy-net
	ip -netns $NS_NAME route add default via 2a01:d0:c353:82::1
	echo 1|ip netns exec $NS_NAME tee /proc/sys/net/ipv4/ip_forward
        echo 1|ip netns exec $NS_NAME tee /proc/sys/net/ipv6/conf/all/forwarding
	
	ip -netns $NS_NAME link add link vr0p1 name vlan101 type vlan id 101
	ip -netns $NS_NAME link set dev vlan101 up
	ip -netns $NS_NAME link set dev vlan101 mtu 9000
	ip -netns $NS_NAME addr add 192.168.254.6/30 brd 192.168.254.7 dev vlan101
	ip -netns $NS_NAME addr add 2001:db8:8:3c::5/126 dev vlan101
	ip -netns $NS_NAME link add link eth1 name vlan72 type vlan id 72
	ip -netns $NS_NAME link set dev vlan72 up
	#ip -netns $NS_NAME link set dev vlan72 mtu 9250
	ip -netns $NS_NAME addr add 198.18.125.25/30 brd 198.18.125.27 dev vlan72
	ip -netns $NS_NAME addr add 2001:db8:8:3c::2/126 dev vlan72
	ip netns exec $NS_NAME iptables -t nat -A PREROUTING -p tcp --dport 179 -j ACCEPT
	ip netns exec $NS_NAME ip6tables -t nat -A PREROUTING -p tcp --dport 179 -j ACCEPT
	ip netns exec $NS_NAME iptables -t nat -A POSTROUTING -p tcp --dport 179 -j ACCEPT
	ip netns exec $NS_NAME ip6tables -t nat -A POSTROUTING -p tcp --dport 179 -j ACCEPT
	ip netns exec $NS_NAME iptables -t nat -A PREROUTING  -d 198.18.120.10/32 -j DNAT --to 192.168.254.1
        ip netns exec $NS_NAME iptables -t nat -A POSTROUTING  -s 192.168.254.0/24 -d 192.168.254.0/24 -j ACCEPT
	ip netns exec $NS_NAME iptables -t nat -A POSTROUTING  -s 192.168.254.1/32 -j SNAT --to 198.18.120.10
	ip netns exec $NS_NAME iptables -t nat -A POSTROUTING -s 192.168.254.5/32 -j SNAT --to 198.18.120.10
	ip netns exec $NS_NAME iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
	ip netns exec $NS_NAME ip6tables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
	ip netns exec $NS_NAME ip6tables -t nat -A PREROUTING  -d 2a01:d0:c353:82::10/128 -j DNAT --to 2001:db8::1
	ip netns exec $NS_NAME ip6tables -t nat -A POSTROUTING  -s 2001:db8::1 -j SNAT --to 2a01:d0:c353:82::10
	ip -netns $NS_NAME rule add from 192.168.254.0/24 to 192.168.254.0/24 table main pref 1
	#ip -netns $NS_NAME rule add to 198.18.120.0/24 table main pref 1
        #ip -6 -netns $NS_NAME rule add to 2a01:d0:c353:82::/64 table main pref 1
        #ip -netns $NS_NAME rule add from 198.18.120.0/24 table main pref 1
        #ip -6 -netns $NS_NAME rule add from 2a01:d0:c353:82::/64 table main pref 1
        ip -6 -netns $NS_NAME rule add from 2001:db8::/112 to 2001:db8:8:3c::/112 table main pref 1
        ip -6 -netns $NS_NAME rule add from 2001:db8::/112 to 2001:db8::/112 table main pref 1
	ip -netns $NS_NAME rule add from 192.168.254.0/30 to 198.18.0.0/15 table main pref 1
	ip -6 -netns $NS_NAME rule add from 2001:db8::/126  to 2a01:d0:c353::/48 table main pref 1
        ip -netns $NS_NAME rule add from 192.168.254.4/30 to 198.18.0.0/15 table main pref 2
        ip -6 -netns $NS_NAME rule add from 2001:db8::4/126  to 2a01:d0:c353::/48 table main pref 2
        ip -netns $NS_NAME rule add from 192.168.254.0/30 table 10 pref 3
        ip -6 -netns $NS_NAME rule add from 2001:db8::/126 table 10 pref 3
	ip -netns $NS_NAME rule add from 192.168.254.4/30  table 10 pref 10
	ip -6 -netns $NS_NAME rule add from 2001:db8::4/126  table 10 pref 10
	#ip -6 -netns $NS_NAME rule add to 2a01:d0:c353:82::/64 iif vlan101 table 12 pref 3
	#ip -netns  $NS_NAME rule add to 198.18.120.0/24 iif vlan101 table 11 pref 3
	ip -netns $NS_NAME route add default via 198.18.125.26 table 11
	ip -6 -netns $NS_NAME route add default via 2001:db8:8:3c::1 table 12
	ip -netns $NS_NAME addr add 192.168.254.2/30 dev vr0p1
	ip -netns $NS_NAME addr add 2001:db8::2/126 dev vr0p1
}
stop () {
		if [ -f /opt/bird/var/run/bird.pid ]
		then
			kill `cat /opt/bird/var/run/bird.pid `
		fi
		for a in $EXT_INTERFACES
		do
			ip -netns $NS_NAME link set dev $a netns 1
		done	
		ip netns del ${NS_NAME}
	
}
exec_bird () {
	if [ -f /run/netns/${NS_NAME} ]
	then
		PATH=$PATH:/opt/bird/sbin
		ip netns exec $NS_NAME bird -c /opt/bird/etc/bird.conf -s /opt/bird/var/run/bird.ctl -u vrouter -g vrouter -P /opt/bird/var/run/bird.pid
	fi
}
stop_bird () {
	if [ -f /opt/bird/var/run/bird.pid ]
	then
		kill `cat /opt/bird/var/run/bird.pid `
	fi		 
}
case $1 in
	start)
		start
		exec_bird
		;;
	stop)
		#stop_bird
		stop
		;;
	bird_exec)
		exec_bird
		;;
	bird_kill)
		stop_bird
		;;
esac

Сам init-скрипт:

#!/bin/bash
### BEGIN INIT INFO
# Provides:          vrouter
# Required-Start:    mountkernfs $local_fs urandom
# Required-Stop:     $local_fs
# Default-Start:     S
# Default-Stop:      0 6
# Short-Description: Virtual router namespace
# Description:       Init virtual router
### END INIT INFO
/scripts/vrouter.sh $1

 , , ,

ne-vlezay ()

Удалённые уроки

Форум — General

А ну-ка спв, помоги решить задачу. Встала потребность учить детей удалённо. При этом им нужно разжевывать всякие формулы и проч. Хорошо писать на бумажке, чтоб он/а видел/а и сопровождать комментариями. Но бумажку по скайпу не передашь. У меня планшет позволяет писать на экранчике. Какой програмулькой лучше сделать так, чтоб студент тоже видел, что ты пишешь, на своём планшете/десктопе/чего у него там есть, и слышать комментарии? У кого есть опыт в организации процесса обучения школьников удалённо? Какие технологии лучше использовать?

Уточнение: нужно решение для школьников, которые хотят поступить в нормальный ВУЗ, и нуждаются в репетиторстве.

 , ,

yvv ()

Запретить выравнивание текста по ширтне в браузере

Форум — General

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

 , ,

j_kotovsky ()