Если вы зайдете на hh и напишите в поисковой строке HighLoad или «высокие нагрузки», результаты поиска вас удивят. «Чистых» вакансий по высоким нагрузкам практически нет. Как правило, задачи HighLoad упоминаются в обязанностях DevOps-инженеров (правда, чаще это матерые спецы уровня Senior) или backend-разработчиков. Поэтому очень часто происходит...
Устанавливаем дистрибутив NixOS
Visitors have accessed this post 11788 times.
Автор — Юрий Изоркин
Краткая справка из Wikipedia
NixOS — дистрибутив Linux, созданный поверх менеджера пакетов Nix. Он использует декларативную конфигурацию и позволяет надежно обновлять систему. Предлагаются два основных направления: текущий стабильный выпуск и Unstable после последней разработки.
Любая ОС Linux после установки требует базовой настройки — установки необходимых приложений, настройки базовых служб и безопасности. Обычно для таких целей я создаю текстовый файл и в него копирую базовые команды по настройке ОС и конфигурационные файлы. У каждой версии дистрибутива Linux базовая настройка системы может отличаться.
Несколько лет назад я наткнулся на дистрибутив для Linux под названием NixOS — с декларативным описанием конфигурации системы и функциональным менеджером пакетов nix. Вся конфигурация NixOS описывается в конфигурационном файле /etc/nixos/configuration.nix, в котором указываются настройки системы, устанавливаемые пакеты и сервисы. На основе этого файла командой nixos-rebuild создается конфигурация системы.
В этом туториале хочу рассказать и показать на примерах, как установить NixOS и сделать первоначальную настройку системы. Конфигурацию я сделал заранее, поэтому нам остается только скопировать ее в нашу систему и активировать. За что отвечает каждый файл конфигурации — смотрите чуть ниже.
Что будем делать?
Будем ставить NixOS на виртуальную машину. Так как я использую нестабильную ветку, то ее и будем ставить.
Установка NixOS
Скачиваем загрузочный ISO образ nixos-minimal с этой страницы https://nixos.org/channels/nixos-unstable и запускаем его.
Дополнительную информацию по установке можно взять отсюда https://nixos.org/nixos/manual/index.html#sec-installation.
Для удобства работы запустим openssh сервис:
sudo systemctl start sshd
И зададим пароль для пользователя nixos:
passwd nixos
Смотрим текущий IP-адрес виртуальной машины и подключаемся по этому адресу по ssh под пользователем nixos.
ip addr show
После подключения к системе проверяем, какие диски у нас подключены:
lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 505.7M 1 loop /nix/.ro-store sr0 11:0 1 552M 0 rom /iso vda 253:0 0 20G 0 disk
Создаем разделы на диске vda (в зависимости от типа виртуальной машины диски могут отличаться) и монтируем их:
sudo parted /dev/vda -- mklabel msdos sudo parted /dev/vda -- mkpart primary linux-swap 1MiB 4GiB sudo parted /dev/vda -- mkpart primary 4GiB 100% sudo mkswap -L swap /dev/vda1 sudo mkfs.ext3 -L NixOS /dev/vda2 sudo swapon /dev/vda1 sudo mount /dev/vda2 /mnt
Генерируем первоначальную конфигурацию системы:
sudo nixos-generate-config --root /mnt
После выполнения команды создаются 2 файла:
- /mnt/etc/nixos/configuration.nix
- /mnt/etc/nixos/hardware-configuration.nix
Приведем файл конфигурации /mnt/etc/nixos/configuration.nix к такому виду:
sudo nano /mnt/etc/nixos/configuration.nix { config, pkgs, ... }: { imports = [ ./hardware-configuration.nix ]; boot.loader.grub.enable = true; boot.loader.grub.version = 2; boot.loader.grub.device = "/dev/vda"; networking.hostName = "NixOS-example"; environment.systemPackages = with pkgs; [ wget vim mkpasswd ]; services.openssh.enable = true; users.users.rebrain = { isNormalUser = true; uid = 51011; group = "rebrain"; extraGroups = [ "wheel" "users" ]; }; users.groups.rebrain = { gid = 51011; }; system.stateVersion = "20.09"; }
И запустим установку системы:
sudo nixos-install --no-root-passwd --root /mnt
Внимание: указывая параметр —no-root-passwd, мы запрещаем вход в систему пользователю root.
После установки системы установим пароль для нашего пользователя rebrain, чтобы после перезагрузки системы мы смогли подключиться удаленно по ssh:
sudo nixos-enter --root /mnt -c 'passwd rebrain' Размонтируем разделы и выключаем виртуальную машину: sudo umount /mnt sudo swapoff /dev/vda1 sudo shutdown -h now
Первоначальная установка завершена, переходим к базовой настройке.
Настройка NixOS
В настройках виртуальной машины отключаем ISO образ и загружаем в установленную систему. Заходим по SSH с аутентификацией по паролю, скачиваем и распаковываем архив с конфигурацией в директорию /etc/nixos.
cd /tmp wget https://git.elven.pw/Rebrain/basic-nixos/archive/master.tar.gz -O basic-nixos-config.tar.gz tar xzf basic-nixos-config.tar.gz sudo cp -r /tmp/basic-nixos/nix-config /etc/nixos
У нас получается такая структура конфигурации:
- основные настройки системы хранятся в директории /etc/nixos/nix-config/generic;
- индивидуальные настройки текущего сервера — в директории /etc/nixos/nix-config/servers/example.
Приводим конфигурацию /etc/nixos/configuration.nix к такому виду:
sudo nano /etc/nixos/configuration.nix { config, pkgs, ... }: { imports = [ ./hardware-configuration.nix ./nix-config/servers/example/configuration.nix ]; system.stateVersion = "20.09"; }
Генерируем хеш пароля для пользователя rebrain командой:
mkpasswd -m sha-512
И вставляем результат в /etc/nixos/nix-config/servers/example/users.nix в hashedPassword, где _generated_hash_pass_ заменяем на наш хеш. В итоге конфигурация будет выглядеть так:
sudo nano /etc/nixos/nix-config/servers/example/users.nix { config, ... }: let ssh-keys = import ./../../generic/security/ssh-keys.nix; in { users = with ssh-keys; { users.root = { hashedPassword = null; }; users.rebrain = { isNormalUser = true; uid = config.uid-gid.rebrain; group = "rebrain"; extraGroups = [ "wheel" "users" ]; openssh.authorizedKeys.keys = [ work.rebrain_example ]; hashedPassword = "_generated_hash_pass_"; }; groups.rebrain = { gid = config.uid-gid.rebrain; }; groups.ssh-users = { members = [ "rebrain" ]; }; }; }
Чтобы авторизоваться на сервере по ключу, прописываем в файл generic/security/ssh-keys.nix публичный ключ:
sudo nano /etc/nixos/nix-config/generic/security/ssh-keys.nix { work = { rebrain_example = "_ssh_public_key_example"; }; }
Ссылка на ключ work.rebrain_example уже прописана в файле servers/example/users.nix:
... users.rebrain = { ... openssh.authorizedKeys.keys = [ work.rebrain_example ]; ...
Внимание! Параметр users.root = { hashedPassword = null; }; запрещает вход в систему пользователю root.
Если необходимо управлять текущей системой c помощью утилиты nixops, добавляем ssh ключ root пользователю:
sudo nano /etc/nixos/nix-config/generic/security/ssh-keys.nix { work = { ... root_example = "_ssh_public_key_example"; }; } sudo nano /etc/nixos/nix-config/servers/example/users.nix ... users.root = { hashedPassword = null; openssh.authorizedKeys.keys = [ work.root_example ]; }; ...
Если в системе вместо vda диска используется sda, то в файле /etc/nixos/nix-config/servers/example/configuration.nix меняем /dev/vda на /dev/sda:
sudo nano /etc/nixos/nix-config/servers/example/configuration.nix ... boot = { loader.grub.device = "/dev/sda"; ...
Обновляем конфигурацию системы и перезагружаемся:
sudo nixos-rebuild boot sudo shutdown -r now
При первом входе zsh предлагает сконфигурировать файл ~/.zshrc,так как у нас уже готова для него конфигурация (в файле generic/shell.nix), то пропускаем конфигурацию и создаем пустой файл — вводим 0.
Создадим для нашей конфигурации git-репозиторий:
sudo git config --global user.email "rebrain@NixOS-example" sudo git config --global user.name "rebrain" cd /etc/nixos sudo git init && sudo git add -A && sudo git commit -m "first commit"
Все команды с git выполняем от имени root, так как права папки /etc/nixos принадлежат root пользователю. Теперь мы можем отслеживать свою конфигурацию.
Первоначальная настройка системы завершена. Пройдемся по основным настройкам:
1. generic/nix-config/core.nix
- imports = [ <nixpkgs/nixos/modules/profiles/hardened.nix> — используем защищенный профиль системы. В некоторых случаях это может привести к снижению производительности.
- mkOverride 700 — задает приоритет настройкам, если он указан. Например, если в конфигурации servers/example/configuration.nix указать boot.kernelPackages = pkgs.linuxPackages_5_4; то применится последний вариант.
- boot.kernelPackages = pkgs.linuxPackages_latest_hardened; — указывает применять hardened ядро с патчами https://github.com/anthraxx/linux-hardened.
- hardware.ksm — активируем дедупликацию памяти, в некоторых случаях позволяет сэкономить ОЗУ.
- environment.memoryAllocator.provider = mkOverride 700 «jemalloc»; — указывает использовать менеджер памяти Jemalloc.
- networking.enableIPv6.false; — отключаем ipv6 протокол, так как его не используем.
- networking.dhcpcd.extraConfig = «\nnoipv6rs \nnoipv6»; — отключаем ipv6 в службе DHCPD.
- networking.firewall.enable = false; — отключаем файрвол iptables, вместо него используем nftables.
- networking.useHostResolvConf = false; — используется в контейнерах — использовать resolv.conf от хостовой машины. Отключаем.
- networking.usePredictableInterfaceNames = false; — возвращаем именование сетевых интерфейсов в ethX, так как у меня в виртуальных машинах используются идентичные интерфейсы и их количество не превышает двух.
- security.sudo.wheelNeedsPassword = false; — не запрашивать каждый раз пароль перед запуском приложения от имени root. Так как мы используем аутентификацию по ключам, то нет смысла каждый раз требовать пароль.
- services.journald — ограничиваем размер журналов до 256 MiB.
- services.qemuGuest — для виртуальных машин активируем QEMU Guest агент. В противном случае, в servers/custom_server/configuration.nix прописываем — services.qemuGuest.enable = false;.
- users.mutableUsers = false; — запретить смену пароля. Пароль указываем в users.users.my-username.hashedPassword.
2. generic/nix-config/generic/overlays/default.nix
- nur = import … — здесь добавляем пользовательский репозиторий с программами (полный код в примере).
3. generic/programs/ssh.nix
- startAgent — активируем ssh agent.
- pubkeyAcceptedKeyTypes, hostKeyAlgorithms — используем только ssh-ed25519 и rsa-sha2-512 ключи.
- kexAlgorithms — используем KEX алгоритм curve25519-sha256@libssh.org.
- ciphers — используем шифр chacha20-poly1305@openssh.com.
- macs — используем hmac-sha2-512-etm@openssh.com алгоритм аутентификации кода сообщения.
- extraConfig — небольшие твики ssh клиента.
- generic/security/ssh-hosts.nix
- programs.ssh.knownHosts — указываем принудительно публичные ключи известных хостов. По IP можно также добавить другие виртуальные машины, куда требуется доступ по ssh. Если удаленный сервер каким-либо образом подменили, то ssh клиент выдаст ошибку.
4. generic/security/ssh-keys.nix — записываем публичные ключи для ssh аутентификации.
5. generic/services/fail2ban.nix — настраиваем работу утилиты fail2ban c файрволом nftables, добавляем, какие IP-адреса игнорировать. Для сервиса sshd задаем агрессивный метод сканирования.
6. generic/services/syslog-ng.nix — сохраняем логи ssh сервера в отдельный файл.
7. generic/services/logrotate.nix — настраиваем ротацию ssh логов.
8. generic/services/sshd.nix
- allowSFTP = true; — включаем поддержку SFTP.
- forwardX11 = mkDefault false; — запрещаем использовать проброс X11. Если требуется проброс X11 приложений, добавляем в файл servers/example/configuration.nix строку services.openssh.forwardX11 = true;.
- startWhenNeeded = mkDefault true; — запускать SSH сервер только при активации запроса на порт сервиса (активация по systemd socket).
- permitRootLogin = mkDefault «yes»; — разрешить пользователю root заходить по SSH. Требуется для работы утилиты nixops. Можно отключить, если не используете nixops — «no»;.
- passwordAuthentication = false; challengeResponseAuthentication = false; — запрещаем вход по паролю.
useDns = false; — не использовать DNS серверы при аутентификации. - macs — используем hmac-sha2-512-etm@openssh.com алгоритм аутентификации кода сообщения.
- ciphers — используем шифр chacha20-poly1305@openssh.com.
- kexAlgorithms — используем KEX алгоритм curve25519-sha256@libssh.org. Большинство ssh сканеров будут отваливаться, так как не могут подключиться по указанным алгоритмам.
- authorizedKeysFiles — использовать открытые ключи авторизации из файлов, удовлетворяющих шаблону /etc/ssh/authorized_keys.d/%u, где %u — имя пользователя.
- hostKeys — указываем использовать только rsa и ed25519 ключи.
- extraConfig — небольшие твики sshd сервера.
9. generic/services/unbound.nix — ставим локальный ДНС сервер для кэширования запросов.
10. generic/ids.nix — задаем пользователям фиксированный UID.
11. generic/locale.nix — настраиваем шрифт, кодировку, локализацию, синхронизацию с сервером времени и часовой пояс.
12. generic/pkgs.nix — устанавливаем часто используемые программы.
13. generic/shell.nix — настраиваем shell, алиасы, программу nano и ZSH.
14. generic/tweaks.nix — небольшие твики системы.
15. servers/example/configuration.nix — здесь сохраняем индивидуальные настройки для текущей виртуальной машины example.
-
- boot.loader.grub.device = «/dev/vda»; — загружаемся с диска /dev/vda.
- boot.kernelParams = [ «lockdown=confidentiality» ]; — блокируются возможности, позволяющие вносить изменения в работающее ядро из пространства пользователя, и отключается функциональность, которую можно использовать для извлечения конфиденциальной информации из ядра.
- servers/example/users.nix — настраиваем пользователя rebrain.
- hashedPassword — указываем фиксированный хеш пароля. Опция users.mutableUsers = false; позволяет запретить смену пароля из консоли.
- openssh.authorizedKeys.keys — прописываем открытые указанные в generic/security/ssh-keys.nix публичные ssh ключи, по которым пользователь может авторизоваться на сервере.
- groups.ssh-users.members — прописываем, каким пользователям разрешен вход по ssh.
16. servers/example/services/fail2ban.nix
-
- services.fail2ban.enable — активируем сервис fail2ban. По умолчанию сервис отключен в generic/services/fail2ban.nix.
- services.fail2ban.jails.sshd — активируем jail sshd.
- servers/example/services/firefall-nft.nix — активируем файрвол nftables, открываем 22 порт.
В итоге, мы закрыли некоторые ветки атаки и подготовили шаблон, который можно использовать на других системах на базе Linux NixOS.
Немного о Linux NixOS
Теперь подробнее о Linux NixOS. NixOS сохраняет все приложения и различные версии конфигурации системы в собственных подкаталогах директории /nix/store. Например, приложение nano находится в директории /nix/store/17xx786q2gdvjz01hx0j8rihmm5h2m88-nano-4.9.3 и на него создается символьная ссылка:
ls -lah which nano
lrwxrwxrwx 1 root root 63 янв 1 1970 /run/current-system/sw/bin/nano -> /nix/store/17xx786q2gdvjz01hx0j8rihmm5h2m88-nano-4.9.3/bin/nano
Текущая конфигурация системы с установленными приложениями расположена в /run/current-system, которая ссылается на подкаталог в /nix/store
ls -lah /run/current-system lrwxrwxrwx 1 root root 97 июл 13 12:51 /run/current-system -> /nix/store/r0ly0d2k314wfkmqkbci27hldpy5bplh-nixos-system-NixOS-example-20.09pre233323.dc80d7bc4a2
При обновлении системы создается подкаталог с новой конфигурацией системы в директории /nix/store и символьная ссылка /run/current-system переключается на нее. В загрузчик grub добавляется новая запись с конфигурацией системы. Добавим программу mysql-client:
sudo nano /etc/nixos/nix-config/generic/pkgs.nix cd /etc/nixos git diff diff --git a/nix-config/generic/pkgs.nix b/nix-config/generic/pkgs.nix index f4ee2b2..9f6e1d3 100644 --- a/nix-config/generic/pkgs.nix +++ b/nix-config/generic/pkgs.nix @@ -14,5 +14,6 @@ inxi lsof sysstat fio abduco dvtm dtach screen tmux ccze grc lnav multitail + mysql-client ]; }
Сделаем коммит в нашем репозитории:
sudo git add nix-config/generic/pkgs.nix sudo git commit -m "config: add mysql-client package"
Теперь запускаем обновление системы:
sudo nixos-rebuild switch
У нас установилось новое приложение и символьная ссылка /run/current-system переключилась на новую конфигурацию:
ls -lah /run/current-system lrwxrwxrwx 1 root root 97 июл 13 13:05 /run/current-system -> /nix/store/6vn0pwczz9blrm7759iij3k7fmjq0xb2-nixos-system-NixOS-example-20.09pre233323.dc80d7bc4a2 mysql --version mysql Ver 15.1 Distrib 10.4.13-MariaDB, for Linux (x86_64) using readline 5.1
Примерно так выглядят несколько конфигураций системы в /boot/grub/grub.cfg:
... menuentry "NixOS - Default" --unrestricted { search --set=drive1 --fs-uuid 1ea2e5e9-04be-4ae1-9ac4-b7f72602ddfc search --set=drive2 --fs-uuid 1ea2e5e9-04be-4ae1-9ac4-b7f72602ddfc linux ($drive2)/nix/store/8rzh2pkxb4cxh68cmfk9d0kd4lylx5cd-linux-5.7.7/bzImage systemConfig=/nix/store/6vn0pwczz9blrm7759iij3k7fmjq0xb2-nixos-system-NixOS-example-20.09pre233323.dc80d7bc4a2 init=/nix/store/6vn0pwczz9blrm7759iij3k7fmjq0xb2-nixos-system-NixOS-example-20.09pre233323.dc80d7bc4a2/init slub_debug=FZP page_poison=1 page_alloc.shuffle=1 lockdown=confidentiality loglevel=4 net.ifnames=0 nohibernate nosmt pti=on kvm-intel.vmentry_l1d_flush=always apparmor=1 security=apparmor initrd ($drive2)/nix/store/1aj37hakkbww966zk8n8x12xnlqbw839-initrd-linux-5.7.7/initrd } submenu "NixOS - All configurations" { menuentry "NixOS - Configuration 4 (2020-07-13 - 20.09pre233323.dc80d7bc4a2)" { search --set=drive1 --fs-uuid 1ea2e5e9-04be-4ae1-9ac4-b7f72602ddfc search --set=drive2 --fs-uuid 1ea2e5e9-04be-4ae1-9ac4-b7f72602ddfc linux ($drive2)/nix/store/8rzh2pkxb4cxh68cmfk9d0kd4lylx5cd-linux-5.7.7/bzImage systemConfig=/nix/store/6vn0pwczz9blrm7759iij3k7fmjq0xb2-nixos-system-NixOS-example-20.09pre233323.dc80d7bc4a2 init=/nix/store/6vn0pwczz9blrm7759iij3k7fmjq0xb2-nixos-system-NixOS-example-20.09pre233323.dc80d7bc4a2/init slub_debug=FZP page_poison=1 page_alloc.shuffle=1 lockdown=confidentiality loglevel=4 net.ifnames=0 nohibernate nosmt pti=on kvm-intel.vmentry_l1d_flush=always apparmor=1 security=apparmor initrd ($drive2)/nix/store/1aj37hakkbww966zk8n8x12xnlqbw839-initrd-linux-5.7.7/initrd } menuentry "NixOS - Configuration 3 (2020-07-13 - 20.09pre233323.dc80d7bc4a2)" { search --set=drive1 --fs-uuid 1ea2e5e9-04be-4ae1-9ac4-b7f72602ddfc search --set=drive2 --fs-uuid 1ea2e5e9-04be-4ae1-9ac4-b7f72602ddfc linux ($drive2)/nix/store/8rzh2pkxb4cxh68cmfk9d0kd4lylx5cd-linux-5.7.7/bzImage systemConfig=/nix/store/r0ly0d2k314wfkmqkbci27hldpy5bplh-nixos-system-NixOS-example-20.09pre233323.dc80d7bc4a2 init=/nix/store/r0ly0d2k314wfkmqkbci27hldpy5bplh-nixos-system-NixOS-example-20.09pre233323.dc80d7bc4a2/init slub_debug=FZP page_poison=1 page_alloc.shuffle=1 lockdown=confidentiality loglevel=4 net.ifnames=0 nohibernate nosmt pti=on kvm-intel.vmentry_l1d_flush=always apparmor=1 security=apparmor initrd ($drive2)/nix/store/1aj37hakkbww966zk8n8x12xnlqbw839-initrd-linux-5.7.7/initrd } menuentry "NixOS - Configuration 2 (2020-07-13 - 20.09pre233323.dc80d7bc4a2)" { search --set=drive1 --fs-uuid 1ea2e5e9-04be-4ae1-9ac4-b7f72602ddfc search --set=drive2 --fs-uuid 1ea2e5e9-04be-4ae1-9ac4-b7f72602ddfc linux ($drive2)/nix/store/8rzh2pkxb4cxh68cmfk9d0kd4lylx5cd-linux-5.7.7/bzImage systemConfig=/nix/store/6dznb8ackalph62mw6zaan0cpq0ihpfs-nixos-system-NixOS-example-20.09pre233323.dc80d7bc4a2 init=/nix/store/6dznb8ackalph62mw6zaan0cpq0ihpfs-nixos-system-NixOS-example-20.09pre233323.dc80d7bc4a2/init slub_debug=FZP page_poison=1 page_alloc.shuffle=1 lockdown=confidentiality loglevel=4 net.ifnames=0 nohibernate nosmt pti=on kvm-intel.vmentry_l1d_flush=always apparmor=1 security=apparmor initrd ($drive2)/nix/store/1aj37hakkbww966zk8n8x12xnlqbw839-initrd-linux-5.7.7/initrd } menuentry "NixOS - Configuration 1 (2020-07-13 - 20.09pre233323.dc80d7bc4a2)" { search --set=drive1 --fs-uuid 1ea2e5e9-04be-4ae1-9ac4-b7f72602ddfc search --set=drive2 --fs-uuid 1ea2e5e9-04be-4ae1-9ac4-b7f72602ddfc linux ($drive2)/nix/store/lhc845bkk8ilfk9xsicqhwcq3ngzay8y-linux-5.4.50/bzImage systemConfig=/nix/store/x9mf5rqwnvbkizhlvd1dcin9wgfb49x3-nixos-system-NixOS-example-20.09pre233323.dc80d7bc4a2 init=/nix/store/x9mf5rqwnvbkizhlvd1dcin9wgfb49x3-nixos-system-NixOS-example-20.09pre233323.dc80d7bc4a2/init loglevel=4 initrd ($drive2)/nix/store/8f5zvilxc6y0cy05wrc6b5wqabfhd0aq-initrd-linux-5.4.50/initrd } ...
Параметр systemConfig указывает, какую версию конфигурации использовать для загрузки системы.
Просмотреть текущие конфигурации системы можно командой:
sudo nix-env --list-generations --profile /nix/var/nix/profiles/system
Команда выдаст примерно такой результат:
1 2020-07-13 12:08:28 2 2020-07-13 12:27:27 3 2020-07-13 12:51:09 4 2020-07-13 13:05:37 (current)
Откатимся на предыдущую конфигурацию:
sudo nixos-rebuild switch --rollback switching from generation 4 to 3 updating GRUB 2 menu... activating the configuration... setting up /etc... reloading user units for rebrain... ... setting up tmpfiles reloading the following units: dbus.service the following new units were started: logrotate.service Time: 0h:00m:04s
Попробуем запустить mysql:
mysql --version mysql: command not found
Конфигурация системы откатилась, и теперь у нас программа mysql не установлена.
Вернемся к последней конфигурации:
sudo nixos-rebuild switch
Также любую версию конфигурации системы можно выбрать при ее запуске, в меню grub. Очистить старые конфигурации и освободить место на диске можно командой:
sudo nix-collect-garbage --delete-old
Давайте добавим еще один сервис для мониторинга нашей виртуальной машины. Создаем файл nix-config/servers/example/services/netdata.nix:
sudo nano /etc/nixos/nix-config/servers/example/services/netdata.nix { services.netdata = { enable = true; }; }
Добавляем его в nix-config/servers/example/configuration.nix:
sudo nano /etc/nixos/nix-config/servers/example/configuration.nix ... imports =[ ... ./services/netdata.nix ./users.nix ]; ...
И открываем 19999 порт в файрволе nftables для нашего сервиса:
sudo nano /etc/nixos/nix-config/servers/example/services/firefall-nft.nix ... chain input { type filter hook input priority 0; policy drop; jump checks-base iif "lo" notrack accept ip protocol icmp icmp type { echo-request} ct state new accept tcp dport { 22 } ct state new accept tcp dport { 19999 } ct state new accept } ...
Обновляем систему:
sudo nixos-rebuild switch
Сервис мониторинга активирован:
systemctl status netdata netdata.service - Real time performance monitoring Loaded: loaded (/nix/store/14jbfi7018j5m75ad4j23sjg811yq26l-unit-netdata.service/netdata.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2020-07-13 13:33:31 MSK; 6min ago Main PID: 8484 IP: 124.9K in, 775.6K out Tasks: 34 (limit: 2373) Memory: 43.6M CPU: 13.842s CGroup: /system.slice/netdata.service ├─8484 /nix/store/0z9dcqk244jb0b95flpljcbs2arg5y52-netdata-1.23.0/bin/netdata -P /run/netdata/netdata.pid -D -c /nix/store/f68ak9vl3p2a8b57ypv2cq7r80a8wigc-netdata.conf ├─8491 /nix/store/0z9dcqk244jb0b95flpljcbs2arg5y52-netdata-1.23.0/bin/netdata --special-spawn-server ├─8692 /nix/store/0z9dcqk244jb0b95flpljcbs2arg5y52-netdata-1.23.0/libexec/netdata/plugins.d/go.d.plugin 1 ├─8694 /nix/store/wm8d1lz8rr3i1r9vxgx123mx7rs1r5xh-wrapped-plugins/libexec/netdata/plugins.d/apps.plugin 1 └─8697 /nix/store/0z9dcqk244jb0b95flpljcbs2arg5y52-netdata-1.23.0/libexec/netdata/plugins.d/nfacct.plugin 1 ...
Открываем в браузере по 19999 порту и проверяем работу.
Делаем коммит в нашем репозитории:
sudo git add -A sudo git commit -m "config: add netdata service"
Проверяем изменения в коммите:
git diff HEAD^1 diff --git a/nix-config/servers/example/configuration.nix b/nix-config/servers/example/configuration.nix index da117ed..d9bf023 100644 --- a/nix-config/servers/example/configuration.nix +++ b/nix-config/servers/example/configuration.nix @@ -3,6 +3,7 @@ ./../../core.nix ./services/fail2ban.nix ./services/firefall-nft.nix + ./services/netdata.nix ./users.nix ]; diff --git a/nix-config/servers/example/services/firefall-nft.nix b/nix-config/servers/example/services/firefall-nft.nix index afbab23..f6c2648 100644 --- a/nix-config/servers/example/services/firefall-nft.nix +++ b/nix-config/servers/example/services/firefall-nft.nix @@ -16,6 +16,7 @@ iif "lo" notrack accept ip protocol icmp icmp type { echo-request} ct state new accept tcp dport { 22 } ct state new accept + tcp dport { 19999 } ct state new accept } chain output { type filter hook output priority 0; policy accept; diff --git a/nix-config/servers/example/services/netdata.nix b/nix-config/servers/example/services/netdata.nix new file mode 100644 index 0000000..e8b5066 --- /dev/null +++ b/nix-config/servers/example/services/netdata.nix @@ -0,0 +1,5 @@ +{ + services.netdata = { + enable = true; + }; +}
Подводим итоги
Мы немного познакомились с возможностями Linux NixOS, подготовили шаблон для развертывания ОС, закрыли некоторые ветки атаки и добавили историю изменения конфигурации с помощью git-репозитория.
Примечание: Если при обновлении системы возникает ошибка:
updating GRUB 2 menu... failed to create initrd secrets: No such file or directory warning: error(s) occurred while switching to the new configuration
То перед обновлением выполняем команду:
sudo rm /etc/ld-nix.so.preload
В последних изменениях была ошибка, которая приводила к некорректной сборке системы из-за использования провайдера распределения памяти — environment.memoryAllocator.provider.
От редакции
Если вам интересно посещать бесплатные онлайн-мероприятия по DevOps, Kubernetes, Docker, GitlabCI и др. и задавать вопросы в режиме реального времени, подключайтесь к каналу DevOps by REBRAIN.
*Анонсы мероприятий каждую неделю
Практикумы для специалистов по инфраструктуре и разработчиков — https://rebrainme.com.
Наш Youtube-канал — https://www.youtube.com/channel/UC6uIx64IFKMVmj12gKtSgBQ.
Агентство Fevlake, проектируем и поддерживаем IT-инфраструктуры с 2012 года — https://fevlake.com.
Вам также может понравится
Перевод статьи — https://devops.com/which-desktop-os-is-best-for-devops/
Какую операционную систему лучше использовать инженерам DevOps?
Это вопрос, на который нет однозначного ответа. Разговоры о том, какая ОС «лучше», всегда противоречивы.Я не собираюсь отдавать предпочтение одной операционной системе, когда мы говорим о работе DevOps. Но...
Если вы считаете, что докер (англ. docker – портовый рабочий) – это тот, кто грузит контейнеры, вы правы по форме, но не по содержанию. В нашем случае Docker – это действительно удобный интерфейс для работы с контейнерами. Но не только. Давайте разбираться, что это такое и с чем его едят.
Docker – это программная платформа, которая помогает...
Немного сумбурно и не понятно.
Можете написать какие моменты не понятны, постараюсь дополнить. Спасибо.