I've used this guide, it's very simple and you just need to run wine-cfg and select DPI value which works for you.
Monday, 2 August 2021
How to improve wine applications appearance on hidpi / 4k displays
How to deploy Mikrotik in Google Cloud / GCE
You can use Mikrotik's official guide for start. To use all gsutil commands from VM in GCE you will need to set following permissions for it:
gsutil mb gs://cloud-hosted-router-imagesCreating gs://cloud-hosted-router-images/...ServiceException: 409 A Cloud Storage bucket named 'cloud-hosted-router-images' already exists. Try another name. Bucket names must be globally unique across all Google Cloud projects, including those outside of your organization.
gcloud compute instances create "chr-1" --zone "europe-north1-a" --machine-type "e2-medium" --image-family=cloud-hosted-router
To debug issues with image itself you can use serial output:
Wednesday, 28 July 2021
createrepo on Ubuntu 24.04
Unfortunately, createrepo command which can create RPM repositories was removed in Ubuntu 24.04 LTS.
Let's try building C based version of createrepo from: https://github.com/rpm-software-management/createrepo_c
First of all, install all dependencies:
sudo apt install -y libcurl4-openssl-dev libbz2-dev libxml2-dev libssl-dev zlib1g-dev pkg-config libglib2.0-dev liblzma-dev libsqlite3-dev librpm-dev libzstd-dev python3-dev cmake
Then build it:
mkdir createrepo_folder; cd createrepo_folder
git clone https://github.com/rpm-software-management/createrepo_c
cd createrepo_c;
mkdir build
cd build
cmake .. -DWITH_ZCHUNK=NO -DWITH_LIBMODULEMD=NO
make -j
cp src/createrepo_c /opt/createrepo
cp src/libcreaterepo_c.so /opt
cp src/libcreaterepo_c.so.1 /opt
cp src/libcreaterepo_c.so.1.1.4 /opt
Then we need to override RPATH to use libraries from /opt:
sudo apt install chrpath
chrpath /opt/createrepo -r /opt
Do test run:
/opt/createrepo /var/public_repositories/Directory walk startedDirectory walk done - 18 packagesTemporary output repo path: /var/public_repositories/.repodata/Preparing sqlite DBsPool started (with 5 workers)Pool finished
Sunday, 21 February 2021
Firmware upgrade on Thinkpad X1 Extreme Gen 2 on Ubuntu 20.04
It's actually pretty simple process, just run this in Terminal:
fwupdmgr update
Output may look the following way:
Upgrade available for Thunderbolt Controller from 42.00 to 59.00
Thunderbolt Controller and all connected devices may not be usable while updating. Continue with update? [Y|n]: Y
Downloading 59.00 for Thunderbolt Controller...
Fetching firmware https://fwupd.org/downloads/0ec44a6ae2c11843d80147271d99901d41a7489ff29444c820c918e46a8eac25-Lenovo-ThinkPad-X1E-Gen2-Thunderbolt-Firmware-N2OTG12W-Secured.cab
Downloading… [***************************************] Less than one minute remaining…
Decompressing… [***************************************]
Authenticating… [***************************************]
Updating Thunderbolt Controller… ]
Restarting device… [***************************************]
Successfully installed firmware
Saturday, 20 February 2021
Ubuntu 14.04 LTS kernel with drop_monitor support
In this guide, I'll describe how you could build kernel for Ubuntu 14.04 with CONFIG_NET_DROP_MONITOR option. It's pretty standard reference copy-n-pasted from official manual of Ubuntu with very small changes.
If you got this error:
sudo ./dropwatch Unable to find NET_DM family, dropwatch can't work Cleaning up on socket creation error
Then it means that your kernel does not have CONFIG_NET_DROP_MONITOR option compiled.
I use Ubuntu 14.04 and could provide guide how you could rebuild kernel with this option.
Rebuild kernel:
apt-get source linux-image-$(uname -r)
Install build deps:
sudo apt-get build-dep linux-image-$(uname -r) libncurses5-dev
Start process:
cd linux-lts-vivid-3.19.0
Change options:
chmod a+x debian/rules chmod a+x debian/scripts/* chmod a+x debian/scripts/misc/* fakeroot debian/rules cleanfakeroot debian/rules editconfigs # you need to go through each (Y, Exit, Y, Exit..) or get a complaint about config later
Then specify it:
Do you want to edit config: amd64/config.flavour.generic? [Y/n] Y
Required option you could find here:
Networking support - Networking options - Network testing - Network packet drop alerting service - [M]
Build it:
fakeroot debian/rules binary-headers binary-generic binary-perarch
Check it:
cat ./debian.vivid/config/amd64/config.flavour.generic # # Config options for config.flavour.generic automatically generated by splitconfig.pl # CONFIG_HZ=250 # CONFIG_HZ_1000 is not set CONFIG_HZ_250=y # CONFIG_IRQ_FORCED_THREADING_DEFAULT is not set CONFIG_NET_DROP_MONITOR=m # CONFIG_PREEMPT is not setCONFIG_PREEMPT_VOLUNTARY=y
And finally load it when you restart to new kernel:
modprobe drop_monitor
Using Dropwatch to monitor UDP drops in Ubuntu Linux 20.04
What is Dropwatch?
This tool will show place where Linux kernel drops/discards UDP packets.
Example screen:
sudo apt-get install -y libnl-3-dev libnl-genl-3-dev libreadline-dev binutils-dev
Then build it:
git clone https://github.com/nhorman/dropwatch.git
cd dropwatch
./autogen.sh
./configure
make
And finally run tool:
./dropwatch -l kas
Friday, 22 January 2021
How to switch keyboard layout in Ubuntu 20.04 LTS via Caps Lock?
It's pretty easy, you need to create this folder:
sudo mkdir /etc/X11/xorg.conf.d
And then you need to create following file /etc/X11/xorg.conf.d/00-keyboard.conf with this content:
Section "InputClass"
Identifier "system-keyboard"
MatchIsKeyboard "on"
Option "XkbLayout" "us,ru"
Option "XkbModel" "pc104"
Option "XkbOptions" "grp:caps_toggle"
EndSection
To apply changes you need to reboot your PC or laptop. Tools like Tweak Gnome will not help because for some reasons in 20.04 Gnome resets configuration of custom keyboard layout when it set to Caps Lock.
Saturday, 18 July 2020
Настроить сеть в VyOS
configure
set interfaces ethernet eth0 address dhcp
commit
Monday, 8 June 2020
s3cmd and Google Cloud Storage
s3cmd --disable-multipart --host=storage.googleapis.com --host-bucket="%(bucket).storage.googleapis.com" --access_key XXX --secret_key XXX filenaname put fastnetmon-1.1.6-1.el8.x86_64.rpm put s3://bucket_name/file_pathdisable-multipart flag is important! It will return following error without it:
ERROR: S3 error: 400 (InvalidArgument): Invalid argument.
Sunday, 24 November 2019
Испрравление проблемы с Realtek 8168: AMD-VI: Event logged [IO_PAGE_FAULT device=22:00.0 domain=0x000d address=0x00000000048b5000 flags=0x0050]
Починка простая:
sudo apt-get install -y r8168-dkmsМоя выдача lspci:
22:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 15)
Saturday, 26 October 2019
Пожалуйста, не используйте DNS протокол для вашего приложения!
Протокол DNS отлично подходит для задачи, чтобы привести посетителей на Ваш сайт / ресурс, но на этом его задача должна заканчиваться. Если вам требуется раздача какой-то конфигурации (почему бы не сделать это используя TXT запись?), списка доступных узлов для приложения (также известного как service discovery в быту) или что-то еще не связанное напрямую с браузерами конечного клиента (также известного как eyeballs), то, пожалуйста, не используйте DNS.
Итак, проследим процесс разработки клиента для DNS протокола с нуля. Сразу скажу, что количество хороших библиотек для работы с DNS очень небольшое, я могу порекомендовать лишь MiekG DNS, хотя как клиент-библиотека он также не подходит. Почти все реализации DNS клиентов присутствующие в стандартной библиотеке языков программирования излишне упрощены и имеют не особенно удачные интерфейсы, скрывающие множество важных деталей. Я уверен, что мой список рекомендованных библиотек не полон, но это не говорит о том, что их нету.
Мы убедились, что реализация протокола DNS для нашего языка отсутствует и мы начали реализацию собственного клиента. Общеизвестно, что DNS - это один из тех немногих протоколов, который использует UDP протокол и мы уже подготовили UDP клиент, устанавливющий соединение с удаленным узлом (на котором ожидается работающий рекурсивный DNS резолвер) по порту 53.
Следующий шаг, попытаться сказать DNS серверу, что мы конкретно от него хотим, тут перед нашим взглядом предстает картина (любезно взятая с inacon.de):
Saturday, 22 June 2019
PHP FPM dynamic, ondemand or static?
Установка Salt на Ubuntu 18.04
Как обычно, официальные инструкции можно найти тут и тут
Для работы нам потребуется по меньшей мере две машины - master (сервер) и minion (клиент).
Как для мастера, так и для клиента требуется добавить официальный репозиторий:
Итак, установим мастер:wget -O - https://repo.saltstack.com/apt/ubuntu/18.04/amd64/latest/SALTSTACK-GPG-KEY.pub | sudo apt-key add -echo "deb [arch=amd64] http://repo.saltstack.com/apt/ubuntu/18.04/amd64/latest bionic main" | sudo tee /etc/apt/sources.list.d/saltstack.listsudo apt-get update
sudo apt-get install salt-masterТак как мастер будет слушать на двух портах, я настоятельно рекомендую сразу же закрыть его фаерволлом от всех машин кроме клиента.
Для этого можно использовать пакет iptables-persistent, ставим его:
sudo apt-get install -y iptables-persistentОткрываем файл конфигурации
sudo vim /etc/iptables/rules.v4Создаем конфигурацию (xx замените на адрес клиента, если их неколько, добавьте несколько записей):
# Generated by iptables-save v1.6.1 on Sat Jun 22 13:34:44 2019После этого применяем изменения и убеждаемся: что правила добавлены в фаерволл iptables:
*filter
:INPUT ACCEPT [278:38814]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [231:33098]
# Allow access from clients
-A INPUT -s xx/32 -p tcp -m tcp --dport 4505 -j ACCEPT
-A INPUT -s xx/32 -p tcp -m tcp --dport 4506 -j ACCEPT
# And from localhost
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 4505 -j ACCEPT
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 4506 -j ACCEPT
# Block all traffic to external hosts to Salt Master
-A INPUT -p tcp -m tcp --dport 4505 -j DROP
-A INPUT -p udp -m udp --dport 4505 -j DROP
-A INPUT -p tcp -m tcp --dport 4506 -j DROP
-A INPUT -p udp -m udp --dport 4506 -j DROP
COMMIT
# Completed on Sat Jun 22 13:34:44 2019
sudo systemctl restart netfilter-persistentТеперь установим клиента:
sudo apt-get install salt-minionПосле этого, нам нужно указать адрес мастер сервера в его конфигурации:
sudo vim /etc/salt/minionИ задаем адрес мастера в следующем параметре:
master: xx.aa.zz.bbКроме этого, нам потребуется ключ мастер, который нужно получить на мастер сервере следующим образом:
salt-key -F masterAnd copy string from "master.pub" from Local Key section and insert into /etc/salt/minion in following place:
master_finger: "xx.aa.xx.ggg"Этот ключ позволит клиенту убедиться, что мастер именно тот, который нам требуется.
После этого применяем конфигурацию:
sudo systemctl restart salt-minion.service
sudo salt-key -LВ ответ вы увидите что-то вида:
Accepted Keys:Одобряем запрос авторизации:
Denied Keys:
Unaccepted Keys:
client_hostname
Rejected Keys:
sudo salt-key --accept=client_hostnameВсе, после этого с мастер сервера вы можете посылать любые командый конфигурации:
salt '*' test.versionНо это лишь половина дела, наша задача заключается в автоматическом конфигурировании сервисов на клиенте и это также очень просто!
Создаем основную конфигурацию:
sudo vim /srv/salt/top.slsГде указываем следующее:
base:Этот файл представляет собой точку входу для конфигурации Salt и здесь можно управлять тем, какие конфигурации должны быть применены на какого клиента.
'client_hostname':
- php_fpm_setup
Итак, создадим саму конфигурацию:
sudo vim /srv/salt/php_fpm_setup.slsВот такого вида:
nginx_pkg:Данный state файл установит на сервер пакеты nginx и php-fpm и настроит их автозапуск.
pkg.installed:
- name: nginx
nginx_service:
service.running:
- name: nginx
- enable: True
- require:
- pkg: nginx_pkg
fpm_pkg:
pkg.installed:
- name: php7.2-fpm
fpm_service:
service.running:
- name: php7.2-fpm
- enable: True
- require:
- pkg: fpm_pkg
После этого, данный state можно применить как со стороны клиента:
salt-call state.apply
Так и удаленно, со стороны сервера:
salt '*' state.applyВыдача в обоих случаях будет аналогичная:
---------
ID: nginx_pkg
Function: pkg.installed
Name: nginx
Result: True
Comment: All specified packages are already installed
Started: 15:44:59.405480
Duration: 57.533 ms
Changes:
----------
ID: nginx_service
Function: service.running
Name: nginx
Result: True
Comment: The service nginx is already running
Started: 15:44:59.463924
Duration: 54.275 ms
Changes:
----------
ID: fpm_pkg
Function: pkg.installed
Name: php7.2-fpm
Result: True
Comment: All specified packages are already installed
Started: 15:44:59.518411
Duration: 18.16 ms
Changes:
Saturday, 18 May 2019
Ubuntu 14.0 and Stopping system V runlevel compatibility
Root cause was some missing packages from lightdm.
NB! Please use this suggestions ONLY if you need only console interface on your server.
You can fix it by removing all configuration files which belong to lightdm:
sudo apt-get purge lightdm
Sunday, 16 December 2018
parted: Warning: The resulting partition is not properly aligned for best performance.
Идеальный вариант такой.
Сначала создаем таблицу gpt на диске (все данные будут уничтожены):
parted /dev/sda
mklabel gpt
После этого создаем один раздел на весь диск:
parted /dev/sdaПроверяем, что parted правда удовлетворен выравниванием вновь созданного раздела:
unit s
mkpart main ext4 0% 100%
parted /dev/sda align-check optimal 1Ответ должен быть "aligned".
За идею спасибо: https://blog.hqcodeshop.fi/archives/273-GNU-Parted-Solving-the-dreaded-The-resulting-partition-is-not-properly-aligned-for-best-performance.html










