У меня на домашнем сервере Debian живёт на относительно небольшом корневом разделе, а большой раздел предназначен для данных разных сервисов и смонтирован в /data. Таким образом, я хочу, чтобы докер жил не в /var/lib/docker (где ему будет тесно), а в /data/docker/, где хватит места и киту, и всем его контейнерам 🙂
В открывшемся текстовом редакторе вбиваю между комментариями следующее:
### Anything between here and the comment below will become the new contents of the file
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --data-root=/data/docker -H fd:// --containerd=/run/containerd/containerd.sock
### Lines below this comment will be discarded
перевожу пожитки (перемещаю /var/lib/docker в /data/docker/)
Всё. Теперь все запущенные виртуалки благополучно засыпают при штатном выключении и перезагрузке. А если у них выставлен флаг запуска при загрузке – то ещё и просыпаются!
Не смотря на, в целом, весьма прискорбную тенденцию Microsoft делать Windows всё менее и менее удобной, есть ПО, призванное улучшить её юзабилити. Мне известны два программных продукта, одним из которых я пользуюсь ещё со времён XP, другой же стал мне известен недавно.
Sysinternals – это весьма обширный пакет самых разных программ, позволяюших, как организовать несколько рабочих столов (Microsoft только в десятку догадалась добавить функциональность, которую в KDE я видел и активно использовал уже лет 15-20) так и просматривать всяческую внутрянку (использование памяти, всё, что запускается вместе с системой, кэши, инструменты для мониторинга сетевых подключений, работы с файловой системой и реестром и многое другое). Инструмент полезен мне по большей части, как разработчику/администратору.
PowerToys – это программа улучшает качество использования Windows, скорее со стороны (продвинутого) пользователя. В нём я использую следующие инструменты: “Always On Top” – позволяющие держать выбранное окно поверх остальных; “File Locksmith” – расширение проводника, позволяющего посмотреть процессы, которые держат открытые файлы в выбранной директории и “Text Extractor” – OCR-плагин для выбранной области экрана. Однако в нём есть и удобный редактор файла hosts и устройство для биндинга “клавиатурных аккордов” на нажатие одной клавиши (например, отсутствующей на некоторых клавиатурах “Sleep”…)
Изначальный сетап: Компьютер с Windows10 pro, связь с интернетом через VPN, включен WSL2, внутри WSL свежеустановленный Debian.
Пробуем обновиться…
root@win10pro:/home/user# apt update
Get:1 http://deb.debian.org/debian bullseye InRelease [116 kB]
Get:2 http://security.debian.org/debian-security bullseye-security InRelease [48.4 kB]
Err:1 http://deb.debian.org/debian bullseye InRelease
Connection timed out [IP: 151.101.246.132 80]
Err:2 http://security.debian.org/debian-security bullseye-security InRelease
Connection timed out [IP: 151.101.246.132 80]
Get:3 http://deb.debian.org/debian bullseye-updates InRelease [44.1 kB]
Get:4 http://ftp.debian.org/debian bullseye-backports InRelease [49.0 kB]
Err:3 http://deb.debian.org/debian bullseye-updates InRelease
Connection timed out [IP: 151.101.246.132 80]
Err:4 http://ftp.debian.org/debian bullseye-backports InRelease
Connection timed out [IP: 151.101.246.132 80]
Reading package lists… Done
Building dependency tree… Done
Reading state information… Done
All packages are up to date.
W: Failed to fetch http://deb.debian.org/debian/dists/bullseye/InRelease Connection timed out [IP: 151.101.246.132 80]
W: Failed to fetch http://deb.debian.org/debian/dists/bullseye-updates/InRelease Connection timed out [IP: 151.101.246.132 80]
W: Failed to fetch http://security.debian.org/debian-security/dists/bullseye-security/InRelease Connection timed out [IP: 151.101.246.132 80]
W: Failed to fetch http://ftp.debian.org/debian/dists/bullseye-backports/InRelease Connection timed out [IP: 151.101.246.132 80]
W: Some index files failed to download. They have been ignored, or old ones used instead.
root@win10pro:/home/user#
Пичалька.
Проблема кроется в размерах MTU.
root@win10pro:/home/user# ip link show eth0
4: eth0: mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 00:15:5d:50:34:71 brd ff:ff:ff:ff:ff:ff
root@win10pro:/home/user#
Пришло на почту письмо с таким заголовком от GitLab. Что делать?
Переходим по ссылке “See the affected projects in the GitLab admin panel” из письма (для примера допустим, что она приведёт, сюда: http://git.local/admin/projects?last_repository_check_failed=1)
Переходим в проблемный проект (Пусть это будет project1 в группе group1 http://git.local/admin/projects/group1/project1)
Ищем значение поля “Gitaly relative path”. Пусть оно будет таким @hashed/aa/bb/aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899.git
Идём в консоль сервера (например, по ssh) и проверяем состояние репозитория /opt/gitlab/embedded/bin/git -C /var/opt/gitlab/git-data/repositories/@hashed/aa/bb/aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899.git fsck
Checking object directories: 100% (256/256), done. Checking objects: 100% (1239/1239), done. Verifying commits in commit graph: 100% (30/30), done. error: Could not read 0123456789abcdef01234567890abcdef0123456 failed to parse commit 0123456789abcdef01234567890abcdef0123456from object database for commit-graph
В той же консоли выполняем сборку мусора в репозитории: /opt/gitlab/embedded/bin/git -C /var/opt/gitlab/git-data/repositories/@hashed/aa/bb/aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899.git gc
Повторно проверяем состояние репозитория /opt/gitlab/embedded/bin/git -C /var/opt/gitlab/git-data/repositories/@hashed/aa/bb/aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899.git fsck
На страничке репозитория в GitLab (http://git.local/admin/projects/group1/project1) заставим его перепроверить репозиторий (Кнопка “Trigger repository check”).
MinGW-w64 заменил на TDM-GCC 10.3.0. Скачал установщик, и установил в песочнице (Windows Sandbox) по пути c:\dev\10.3.0\x64\tdm-gcc. По окончанию установки скопировал папку из песочницы в хостовую систему.
OpenSSL 3.0.3
Так как мне нужен Qt с поддержкой OpenSSL, буду его собирать. Сборкубуду производить в MSys2, поскольку у меня он всё равно есть (если он не нужен, его вместе с компилятором можно установить в песочнице).
Качаю исходники openssl-3.0.3.tar.gz, распаковываю и перехожу в директорию с исходниками (у меня это /d/tmp/build/openssl-3.0.3). Поскольку я хочу использовать TDM-GCC, то ставлю его в пути раньше всего остального.
$ cd /d/tmp/build/openssl-3.0.3
$ export PATH=/c/dev/10.3.0/x64/tdm-gcc/bin/:$PATH
Конфигурирую, собираю и устанавливаю статическую сборку
Для сборки потребуется python (я использовал 3.9.7, у меня он расположен в C:\dev\tools\python-3.9.7\), если его нет, то придётся поставить.
Качаю исходники qt-everywhere-opensource-src-5.15.4.zip, распаковываю в d:\tmp\build\qt-everywhere-src-5.15.4. Сборку буду производить out-of-source, поэтому создаю рядом пустую директорию для сборки d:\tmp\build\qt-everywhere-src-5.15.4-build.
Начну со статической сборки. Запускаю командную строку, перехожу в директорию сборки, конфигурирую, компилирую и устанавливаю статическую сборку (release-only). Из-за проблем со сборкой отключаю рендеринг через DirectX12 и поддержку WMF, поскольку мне они всё равно не нужны.
Теперь динамическая сборка. Удаляю всё из директории сборки, конфигурирую, компилирую и устанавливаю динамическую сборку (debug+release). Из-за проблем со сборкой отключаю рендеринг через DirectX12, а вот поддержку WMF не отключаю, потому что и с ней собирается нормально.
Качаю архив с исходниками, распаковываю в d:\tmp\build\qt-creator-opensource-src-7.0.2 и обнаруживаю, что теперь его нельзя собрать через qmake – только CMake или QBS. Выбираю CMake – он мне знаком и его можно скачать уже собранным в виде архива. Качаю CMake-3.23.2 и распаковываю в c:\dev\tools\cmake-3.23.2-windows-x86_64. Python буду использовать тот же, что и при сборке Qt.
Сборку буду производить out-of-source, поэтому создаю директорию для сборки d:\tmp\build\qt-creator-opensource-src-7.0.2-build.
Запускаю командную строку, перехожу в директорию сборки, устанавливаю необходимые пути, конфигурирую (с поддержкой новомодной и расхваливаемой QBS – надо же посмотреть, что это) и пытаюсь собрать.
d:\> cd d:\tmp\build\qt-creator-opensource-src-7.0.2-build
d:\tmp\build\qt-creator-opensource-src-7.0.2-build> set PATH=C:\dev\tools\python-3.9.7;C:\dev\tools\cmake-3.23.2-windows-x86_64\bin;C:\dev\10.3.0\x64\Qt\5.15.4\shared\bin;C:\dev\10.3.0\x64\tdm-gcc\bin;%PATH%
d:\tmp\build\qt-creator-opensource-src-7.0.2-build> cmake -G"MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release -DBUILD_QBS=ON ..\qt-creator-opensource-src-7.0.2
d:\tmp\build\qt-creator-opensource-src-7.0.2-build> cmake --build . -j 16
Поскольку у меня сборка ломается с вот таким сообщением об ошибке
In file included from D:\tmp\build\qt-creator-opensource-src-7.0.2\src\shared\qbs\src\shared\qtscript\src\script\bridge\qscriptfunction.cpp:43:
D:/tmp/build/qt-creator-opensource-src-7.0.2-build/src/shared/qbs/src/lib/scriptengine/include/QtScript/5.15.4/QtScript/private/qscriptengine_p.h:1:10: fatal error: ../../../../../../../../../../../../qt-creator-opensource-src-7.0.2/src/shared/qbs/src/shared/qtscript/src/script/api/qscriptengine_p.h: No such file or directory
1 | #include "../../../../../../../../../../../../qt-creator-opensource-src-7.0.2/src/shared/qbs/src/shared/qtscript/src/script/api/qscriptengine_p.h"
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
начинаю рукосуйствовать. Разбираться с источником проблемы я не хочу, поэтому лечение будет симптоматическим – в директории d:\tmp\build\qt-creator-opensource-src-7.0.2-build\src\shared\qbs\src\lib\scriptengine\include\QtScript\5.15.4\QtScript\private лежат заголовочные файлы, содержимое которых и не позволяет проекту собраться. Во всех этих файлах нужно убрать одно “../” Например:
Было
Стало
include “../../../../../../../../../../../../qt-creator-opensource-src-7.0.2/src/shared/qbs/src/shared/qtscript/src/script/parser/qscriptastfwd_p.h”
include “../../../../../../../../../../../qt-creator-opensource-src-7.0.2/src/shared/qbs/src/shared/qtscript/src/script/parser/qscriptastfwd_p.h”
Если всё прошло успешно – поздравляю, но у меня на последнем этапе возникла вот такая проблема:
'C:/dev/tools/python-3.9.7/python.exe' 'D:/tmp/build/qt-creator-opensource-src-7.0.2/scripts/deployqt.py' 'C:\dev\tools\QtCreator-7.0.2\/bin/qtcreator' 'C:/dev/10.3.0/x64/Qt/5.15.4/shared/bin/qmake.exe'
Traceback (most recent call last):
File "D:\tmp\build\qt-creator-opensource-src-7.0.2\scripts\deployqt.py", line 41, in <module>
import common
ModuleNotFoundError: No module named 'common'
Патчу скрипт qt-creator-opensource-src-7.0.2\scripts\deployqt.py Было
import argparse
import collections
import os
import locale
import sys
import subprocess
import re
import shutil
from glob import glob
import common
Стало
import argparse
import collections
import os
import locale
import sys
import subprocess
import re
import shutil
from glob import glob
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
import common
Чтобы не сдохнуть при выполнении абсолютно всех задач с одной стороны, и не проваливать невыполнимые задачи с другой, предлагается такой алгоритм действий:
Если задачу можно делегировать – делегируем.
Иначе: Если задачу можно выполнить самому – выполняем.
Иначе: Эскалируем задачу выше.
Блок-схема алгоритма выполнения задачи
Поскольку управление возможно только в замкнутых циклах, делегирование дополняется контролем, а эскалация – мониторингом.
Цикл управления при делегировании
Цикл управления при эскалации
Такие циклы могут растягиваться на несколько уровней вниз через делегирование и вверх через эскалацию. Комбинация эскалации и делегирования может передать выполнение задачи в соседнюю ветку корпоративной иерархии до тех пор, пока задача не окажется там, где она может и должна быть выполнена.
PS: жаль, что некоторые осознают это только после увольнения.
Третий фильм оказался не хуже двух предыдущих. После начала титров не надо торопиться покидать зал – в конце есть небольшой, но вполне забавный эпизод.