LINUX.ORG.RU

Сообщения vbr

 

TIL: у блютуза безопасность нулевая

Я, конечно, всегда это предполагал, т.к. везде надо вводить в качестве пина 0000 или 1234 или подобную чушь.

Тут понадобилось блютуз устройство сделать, начал разбираться и оказывается любой статический пин ломается перебором за 2 попытки на бит. То бишь можно сказать - моментально. А также извлекается простым прослушиванием эфира. А блютуз, надо сказать, вопреки некоторым ожиданиям, пробивает несколько стен на пару десятков метров.

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

Что при этом делать тем, у кого девайс не предполагает экрана, стандартописатели скромно умалчивают.

 ,

vbr
()

Как использовать less с бесконечным источником?

Есть некая программа, которая выдаёт потенциально бесконечный текст. Ну к примеру любой просмотрщик логов, скажем docker logs -f

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

К примеру я пишу docker logs -f jovial_kori | less

Открывается less с начала файла. Мне нужно перемотать в текущий конец. Если нажать G то ничего не получится, он будет ждать EOF. Если начать F то он перемотает в конец файла и начнёт отслеживать новые данные. Ладно, хорошо. Теперь я хочу временно прекратить отслеживать новые данные и жму Ctrl+C, чтобы выйти из режима F. Пока что всё хорошо. Но на самом деле нет - предыдущая программа в пайпе уже умерла. И хотя я могу смотреть то, что она успела написать до сих пор, новые данные я уже не получу.

Т.е. наверное вопрос можно сформулировать так: как выйти из режима F не «убивая» предыдущую программу в пайпе? Или же как перейти к концу текущего «файла» не используя F?

 

vbr
()

Какие идеальные условия для заряда батареи в ноутбуке, работающем от сети?

У меня ноутбук, в котором есть внутренняя батарея. Практически 100% времени этот ноутбук работает от сети. Тем не менее хочется максимально сохранить жизнь батареи. Это абсолютный приоритет.

В ноутбуке есть возможность настроить два значения - минимальный заряд и максимальный заряд. К примеру сейчас это 45% и 55%. Когда батарея разряжается до 45%, она начинает заряжаться до 55%, после этого заряд останавливается и она опять начинает разряжаться. Разряжается она по ощущениям около недели.

Хочется понять, какие идеальные значения нужно выбрать для такого юз-кейса?

У меня был макбук, там была функция, она кажется держала батарею на 80%, но это не настраивалось и, как я понял, там приоритет был в том, что если мне всё же батарея понадобится - чтобы она если и не на 100% была, то всё же давала достойное время жизни. Сейчас мне это не надо.

 ,

vbr
()

Как правильно отключать USB диск?

RHEL 9, Gnome, Samsung SSD T7 (SSD с USB интерфейсом).

Если отключаю через eject /dev/sda (как всегда делал), то в dmesg появляется кучка ошибок вида

[26929.854633] sd 0:0:0:0: [sda] Media removed, stopped polling
[26929.855329] sd 0:0:0:0: [sda] tag#16 device offline or changed
[26929.855331] blk_print_req_error: 4 callbacks suppressed
[26929.855332] I/O error, dev sda, sector 0 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 2
[26929.855334] buffer_io_error: 3 callbacks suppressed
[26929.855335] Buffer I/O error on dev sda, logical block 0, async page read
[26929.855344] sd 0:0:0:0: [sda] tag#17 device offline or changed
[26929.855345] I/O error, dev sda, sector 0 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 2
[26929.855346] Buffer I/O error on dev sda, logical block 0, async page read
[26929.855350] sd 0:0:0:0: [sda] tag#18 device offline or changed
[26929.855351] I/O error, dev sda, sector 0 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 2
[26929.855352] Buffer I/O error on dev sda, logical block 0, async page read
[26929.855356] sd 0:0:0:0: [sda] tag#19 device offline or changed
[26929.855356] I/O error, dev sda, sector 0 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 2
[26929.855357] Buffer I/O error on dev sda, logical block 0, async page read
[26929.855360] sd 0:0:0:0: [sda] tag#16 device offline or changed
[26929.855361] I/O error, dev sda, sector 0 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 2
[26929.855361] Buffer I/O error on dev sda, logical block 0, async page read
[26929.855365] sd 0:0:0:0: [sda] tag#17 device offline or changed
[26929.855365] I/O error, dev sda, sector 0 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 2
[26929.855366] Buffer I/O error on dev sda, logical block 0, async page read
[26929.855367]  sda: unable to read partition table
[26929.856799] sd 0:0:0:0: [sda] Media removed, stopped polling
[26929.857293] sd 0:0:0:0: [sda] tag#25 device offline or changed
[26929.857294] I/O error, dev sda, sector 0 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 2
[26929.857296] Buffer I/O error on dev sda, logical block 0, async page read
[26929.857305] sd 0:0:0:0: [sda] tag#26 device offline or changed
[26929.857306] I/O error, dev sda, sector 0 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 2
[26929.857307] Buffer I/O error on dev sda, logical block 0, async page read
[26929.857311] sd 0:0:0:0: [sda] tag#27 device offline or changed
[26929.857312] I/O error, dev sda, sector 0 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 2
[26929.857313] Buffer I/O error on dev sda, logical block 0, async page read
[26929.857317] sd 0:0:0:0: [sda] tag#24 device offline or changed
[26929.857317] I/O error, dev sda, sector 0 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 2
[26929.857318] Buffer I/O error on dev sda, logical block 0, async page read
[26929.857322] sd 0:0:0:0: [sda] tag#25 device offline or changed
[26929.857326] sd 0:0:0:0: [sda] tag#26 device offline or changed
[26929.857327]  sda: unable to read partition table
[26929.861414] sd 0:0:0:0: [sda] tag#3 device offline or changed
[26929.861426] sd 0:0:0:0: [sda] tag#0 device offline or changed

Это кажется не очень хорошо.

Если отключаю через кнопочку в гномском наутилусе, то тоже не всё идеально:

[26972.550912] sd 0:0:0:0: [sda] Synchronizing SCSI cache
[26972.672905] sd 0:0:0:0: [sda] Synchronize Cache(10) failed: Result: hostbyte=DID_ERROR driverbyte=DRIVER_OK
[26972.690445] usb 2-1.3: USB disconnect, device number 5

Тех страшных ошибок вроде нет, но чего-то там всё равно фейлится.

Как отключать так, чтобы всё было хорошо? А то у меня на этом диске периодически exfat ругается на плохое размонтирование, и я грешу на неправильное отключение. Пока вроде ничего не терялось, но мало ли…

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

 , ,

vbr
()

Приколы thinkpad-а

Тут баловался с разными линуксами и обнаружил, что с Type-C порта флешка грузится только если на ней подписанный secure boot сертификатами образ, к примеру RHEL. Арч не грузится. Подключаешь через переходник ровно ту же флешку к Type A и всё ок. В биосе, естественно, всё настроено как надо, не первый год замужем. Полчаса мудохался, пытаясь понять, что не так. Честно говоря так и не понял, как такое может быть, но факт вот такой. В интернете нигде не нагуглил.

 

vbr
()

Ноутбук не просыпается при перетыкании клавиатуры

У меня Thinkpad T14S. Сон работает хорошо, но есть одна проблема. У меня кроме него есть ещё системный блок. Монитор подключен и к ноутбуку и к системному блоку. Клавиатура с мышью также через простенький девайс-переключатель подключена одновременно туда и туда. Нажатием кнопки переключается.

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

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

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

 ,

vbr
()

Как проверить поддержку big.little архитектуры в планировщике?

У меня ноутбук с 1355U. На нём 2 быстрых ядра и 8 медленных.

Насколько я нагуглил, поддержка Alder Lake (первая архитектура с разными ядрами) появилась в ядре 5.13. Но с тех пор в разных патчах её дорабатывали.

В первую очередь меня беспокоит именно поддержка со стороны планировщика. Чтобы он понимал (честно говоря даже не представляю, как), какие процессы надо на быстрые ядра распределять, а какие - на медленные. Полагаю, что это очень сильно будет влиять на опыт использования компьютера.

Я сейчас выбираю между RHEL и Fedora. В Fedora ядро достаточно новое и лучше уже не будет, это понятно. Но она мне не очень нравится по некоторым другим причинам (слишком быстро обновляется, слишком современный софт). RHEL меня устраивает всем, кроме именно этого нюанса.

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

Поэтому меня интересует практический вопрос - как вообще можно проверить работу планировщика наглядно и сравнить её между двумя дистрибутивами. Чтобы я загрузился с одного, проверил, загрузился с другого, проверил, и увидел отличия (или их отсутствие).

Пока в голову приходит только несколько раз позапускать какой-то тест, грузящий CPU, вроде openssl speed. И убедиться, что пока их запущено не более двух штук, то они выдают максимально возможную скорость (т.е. пока доступны быстрые ядра, планировщик не будет использовать медленные).

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

 

vbr
()

Поругайте Lenovo P14s Gen 4 AMD

Specifications.

Ryzen 7 PRO 7840U, Radeon 780M, Up to 64GB LPDDR5x, 6400MHz.

Существенный минус вижу только один - память припаяна. Но это переживу.

Из плюсов:

  1. Цена, относительно небольшая для модели из сегмента рабочих станций. Apple, Dell стоят в 2-2.5 раза дороже.

  2. Сертифицирован RHEL. Значит всё должно более-менее нормально работать.

  3. Положительный отзыв на phoronix.

Меня беспокоит только, насколько Qualcomm WiFi поддерживается. Я привык, что WiFi должен быть от Intel. Но вроде у людей работает.

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

Опыта использования Lenovo Thinkpad у меня нет. Может не просто так они дешевле стоят?

 

vbr
()

Как испустить радиоволну 50 КГц?

В радиоволнах ничего не понимаю, но хочу попробовать сделать девайс, который будет транслировать сигнал точного времени. У меня есть часы, которые в теории умеют этот сигнал улавливать и калиброваться по нему (а самого сигнала нет, не повезло мне жить там, где он есть). Протокол я нашёл, там всё примитивно - надо просто испускать радиоволну определённый период времени, грубо говоря раз в секунду в течение 0.9 секунды или 0.8 секунды (могу в деталях путаться, но в целом как-то так) и кодировать таким образом биты. Частота фиксированная, то ли 50 то ли 60 КГц.

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

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

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

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

Также вопрос - как можно эти радиоволны уловить и проверить, что они идут вообще? Часы штука не очень подходящая для отладки, там или работает, или нет. У меня есть осциллограф, может как-то с ним это провернуть можно?

 ,

vbr
()

Как сочетать очередь и БД надёжно и транзакционно?

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

У меня возникают проблемы с тем, как правильно спроектировать транзакцию в БД и работу с очередью.

Первый подход:

  1. Вставляем строку
  2. Коммитим транзакцию.
  3. Отправляем в очередь событие с ID строки.
  4. Получатель получает событие.
  5. Получатель запрашивает данные по ID и работает с ними.

Тут возникает проблема между шагами 2 и 3. Если процесс умер, то запись окажется в БД, а получатель про это не узнает.

Второй подход:

  1. Вставляем строку
  2. Отправляем в очередь событие с ID строки.
  3. Коммитим транзакцию.
  4. Получатель получает событие.
  5. Получатель запрашивает данные по ID и работает с ними.

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

Можно накрутить какую-то сложную архитектуру с дополнительным полем-статусом, двумя коммитами, «восстановлением» если второй коммит не сработал, получателем, который нормально отрабатывает двойные сообщения. Расписывать не буду, но это всё прям очень сложно выходит.

Самый простой вариант это использовать что-то вроде postgres listen/notify, который умеет отсылать события транзакционно. Но интересует именно работа с внешней очередью, без всяких там двухфазных транзакций и подобного энтерпрайза. Кажется, будто упускаю что-то очевидное.

Если нужна конкретика - пускай будет postgres и kafka

 ,

vbr
()

Зачем платить за RHEL Workstation?

Сразу упомяну, что я не в России, санкционные проблемы меня не касаются.

Покупаю ноутбук, сертифицированный для RHEL. Планирую на него установить, собственно, RHEL. Вижу два варианта - либо купить лицензию ($180/год), либо использовать его бесплатно с Developer License. Хочу понять - а зачем, собственно, платить? Поддержка в эту цену не входит. Ещё и непонятная мне приписка «Is not intended for production environments.» (это у платной версии).

Там есть подписка за $300/год, с ней всё понятно, там поддержка включена и нет странной приписки про production.

Причём Developer License можно использовать на 16 физических и 16 виртуальных машинах, а платную только на 1 физической и 1 виртуальной (ну про физическую понятно, а вот про виртуальную - прям вообще не понятно).

В общем я смущён всей этой политикой. Деньги заплатить я готов, но хочется понимать - за что.

 ,

vbr
()

Меня печалит жава

Наткнулся на такой код в спринге:

PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
map.from(settings::readTimeout).asInt(Duration::toMillis).to(this::setReadTimeout);
map.from(settings::connectTimeout).asInt(Duration::toMillis).to(this::setConnectTimeout);

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

if (settings.readTimeout() != null) {
  setReadTimeout(settings.readTimeout());
}
if (settings.connectTimeout() != null) {
  setConnectTimeout(settings.connectTimeout());
}

Да, я понимаю, что тут два раза вызывается геттер settings.xxx и это чисто теоретически может привести к багу… Но по-моему это мелочь. А то, что код нечитаемый получился сверху, это вообще не мелочь.

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

 ,

vbr
()

Почему макросы в стиле лиспа не стали популярными?

В лиспе есть чудесное свойство: код и данные выглядят одинаково. Это позволяет очень легко и естественно писать код, генерирующий другой код. Что называется макросом.

Однако в индустрии данный подход применяется нечасто.

К примеру в С используется отдельный язык, генерирующий текст (препроцессор).

В С++ используется отдельный язык на шаблонах для метапрограммирования.

В Scheme тоже изобрели отдельный язык.

Из похожих подходов я видел только D, в котором можно написать функцию, возвращающую текст. Эту функцию можно вызывать во время компиляции и её результат компилятор тоже откомпилирует. Этот подход похож на лисп, хотя и гораздо менее удобен. Но больше нигде я такого не видел.

Если говорить про не-лисповые языки, то естественным кажется ввести официальный API для AST (по сути там ерунда) и разрешить писать функции, возвращающие этот самый AST. Это будет всё же лучше, чем текст и концептуально более похоже на лисп. Но я такого не видел. Разве что в Java есть annotation processor-ы, но и там такой подход это на уровне хаков скорей.

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

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

Почему же так не делают? Зачем почти в каждом языке изобретают какие-то особые пути для метапрограммирования?

 

vbr
()

Можно ли на ThinkPad T15p использовать встроенную видеокарту?

Присматриваюсь к ThinkPad T15p

Вроде нравится, но там видеокарта nvidia, мне это не надо.

Там процессор i7-12700H. На сайте Intel написано, что он «Intel® Iris® Xe Graphics eligible». Не очень понятно, что это значит.

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

Получится ли такой план на этом ноутбуке? Пробовать возможности нет.

 

vbr
()

Длинные или короткие параметры в shell-скриптах?

У многих команд параметры можно указывать в коротком виде (например -r) или в длинном виде (например --recursive) Вроде всегда читал, что короткие параметры нужно использовать для интерактивных shell-сессий, а длинные в скриптах. Но всегда ли это так?

Как вы думаете, как лучше писать в скриптах? Несколько примеров ниже

mkdir -p a/b
mkdir --parents a/b
curl -fLsS "${url}" | tar -xzv -C /opt
curl --fail --location --silent --show-error "${url}" | tar --extract --gzip --verbose --directory=/opt

Честно говоря я в затруднении. Лично для меня mkdir -p читается и понимается проще, а что такое --parents я и не сразу соображу.

 ,

vbr
()

Как залочить бутлоадер?

У меня есть телефон с разлоченным бутлоадером. Хочу залочить. Гружусь в fastboot, выполняю fastboot flashing lock, после этого телефон при загрузке выдаёт «Your device software can’t be checked for corruption. Please lock the bootloader.». Если разлочить, то грузится нормально. Что ему надо? Телефон Xiaomi Mi A2.

 ,

vbr
()

Веб-приложения шагают по моему компьютеру

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

Mail -> Webmail

Idea -> VS code (в браузер пока не переехал, но хочу)

Gimp -> Photopea

Ventrillo -> Discord

Вот вчера задолбал Strongbox и я переехал в KeeWeb. Причём даже ставить не стал, в браузере прекрасно работает, синхронизирируясь с дропбоксом.

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

А у вас как?

 ,

vbr
()

Как выбрать частоты тактирования?

Пишу прошивку для девайса. Он в том числе взаимодействует с ПК по USB.

Имеется внешний кристалл на 25 МГц. Имеется внутренний резонатор на 8 МГц. Также имеется два внутренних умножителя и набор делителей.

Для USB-периферии я из 25 МГц получаю 48 (25 / 5 * 8 / 10 * 12).

SYS тактирование я могу выбрать либо от этих 48, либо от кристалла (25) напрямую, либо от внутреннего резонатора (8). Сейчас я беру 48.

Далее я через множитель могу это значение поделить и настроить частоту AHB шины. Сейчас я делю на 8, получаю 6 МГц. На этой частоте работает процессор.

Далее мне нужно получить частоты для шин APB1 и APB2. Сейчас я APB1 делю на 16, получаю 375 kHz и APB2 делю на 4, получаю 1.5 MHz.

Собственно это всё я настроил исходя из принципа - чем меньше, тем лучше. На 3 МГц у меня USB не завёлся, соответственно поставил 6.

На шине APB2 у меня крутится таймер, через который я делаю микросекундные задержки для USB, поэтому её тактирую повыше (таймер использует двойную частоту, 3 МГц).

Каких-то требований на данный момент у меня нет (точней они такие небольшие, что подойдёт что угодно, к примеру у меня ещё будет SPI, для которого нужна скорость не ниже 110 КГц и передавать данные по USB я буду со скоростью примерно 15 КБ/с.

Есть ли какие-то соображения, по которым стоит запитать AHB шину не от делителя USB? Если запитывать от 25 МГц кристалла, то делить на ровные числа не получается, а частота в 25 МГц мне кажется избыточной, хотя изначально так и делал. Запитывать от 8 МГц резонатора кажется странным при наличии внешнего кристалла.

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

 , тактирование

vbr
()

Код ломает маркдаун

Вроде ничего особенного в нём нет, но маркдаун ломает. Использую '''c (для подсветки). Если не указывать C, то всё работает. Судя по разметке там какой-то детект XML срабатывает или что…

Не ломает:

static void enable_usart(void)
{
    uint32_t rcc_base_address = 0x40021000;
    uint32_t rcc_apb2enr_address = rcc_base_address + 0x18;
    uint32_t rcc_apb2enr_iopben = 1 << 3;
    uint32_t rcc_apb1enr_address = rcc_base_address + 0x1c;
    uint32_t rcc_apb1enr_usart3en = 1 << 18;
    uint32_t gpiob_base_address = 0x40010c00;
    uint32_t gpiob_crh_address = gpiob_base_address + 0x04;
    uint32_t gpiox_crh_mode10_0 = 1 << 8;

Ломает:

static void enable_usart(void)
{
    uint32_t rcc_base_address = 0x40021000;
    uint32_t rcc_apb2enr_address = rcc_base_address + 0x18;
    uint32_t rcc_apb2enr_iopben = 1 << 3;
    uint32_t rcc_apb1enr_address = rcc_base_address + 0x1c;
    uint32_t rcc_apb1enr_usart3en = 1 << 18;
    uint32_t gpiob_base_address = 0x40010c00;
    uint32_t gpiob_crh_address = gpiob_base_address + 0x04;
    uint32_t gpiox_crh_mode10_0 = 1 << 8;

 ,

vbr
()

Как правильно прокинуть IP?

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

Хочется запускать этот сервис на другом компьютере и перенаправлять входящие и исходящие подключения соответствующим образом. Также хочется минимизировать настройки iptables и подобного и обойтись userspace-софтом.

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

Разумно ли использовать такую конфигурацию в продакшне? Настроить поднятие ssh-соединения через systemd-юнит в принципе несложно, но я никогда не видел, чтобы так делали. Насколько это разумно?

В качестве альтернативы видится поднятие специализированного прокси-сервера на удалённом компьютере, а также http reverse proxy (вроде nginx) на удалённом компьютере. Этот вариант кажется более «продакшн», но несёт с собой уйму дополнительных усилий по управлению всем этим добром, включая безопасность, которая в ssh обеспечивается автоматически.

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

 ,

vbr
()

RSS подписка на новые темы