From c9bfefde43d4e1ec7f2e42577effcaaca85478a9 Mon Sep 17 00:00:00 2001 From: Gregory Bednov Date: Thu, 23 Jan 2025 20:03:45 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B0=D1=80=D0=B8=D0=B8,=20avahi,=20grub?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1) были добавлены подробные комментарии для пользователей конфигурации, чтобы они могли ознакомиться с возможностями системы 2) были добавлен сервис avahi, для последующего использования deploy-rs 3) был написано условие для Grub, которое должно удовлетворить одновременно и виртуальные машины. и дуалбут-хосты проблему Nvidia пока не решили, будем думать --- configuration.nix | 455 ++++++++++++++++++++++++++++------------------ 1 file changed, 274 insertions(+), 181 deletions(-) diff --git a/configuration.nix b/configuration.nix index b029731..fcda4a2 100644 --- a/configuration.nix +++ b/configuration.nix @@ -8,130 +8,20 @@ }: let serverIP = "10.0.174.12"; + hasBootPartition = config.fileSystems ? "/boot"; + isNvidia = (builtins.readFile (pkgs.runCommandLocal "isNvidia" {} '' + ${pkgs.pciutils}/bin/lspci | ${pkgs.busybox}/bin/grep NVIDIA | ${pkgs.busybox}/bin/grep VGA > $out + '')) != ""; in { - imports = [ ./hardware-configuration.nix ]; - - boot.loader.grub.enable = true; - boot.loader.grub.device = "/dev/sda"; - boot.loader.grub.useOSProber = true; - nix.settings.auto-optimise-store = true; - nix.extraOptions = '' - experimental-features = nix-command flakes - ''; - services.xserver.displayManager.lightdm.enable = true; - services.displayManager.defaultSession = "MIREA-WindowsLike+Metacity"; - services.xserver.displayManager.session = [ - { - manage = "desktop"; - name = "MIREA-WindowsLike"; - start = '' - ${inputs.mireadesktop.packages.x86_64-linux.tint2} & - ${inputs.mireadesktop.packages.x86_64-linux.pcmanfm} & - waitPID=$! - ''; - } - { - manage = "window"; - name = "Metacity"; - start = '' - ${pkgs.metacity}/bin/metacity & - waitPID=$! - ''; - } - ]; - - networking.hostName = "nixos"; # Define your hostname. TODO - nixpkgs.config.allowUnfree = true; - # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. - networking.networkmanager.enable = true; # Easiest to use and most distros use this by default. - networking.nameservers = [ "${serverIP}" ]; - networking.hosts."${serverIP}" = [ "kafpi.local" ]; - time.timeZone = "Europe/Moscow"; - services.gnome.gnome-keyring.enable = true; - - i18n.defaultLocale = "ru_RU.UTF-8"; - console = { - font = "cyr-sun16"; - useXkbConfig = true; - }; - - hardware.graphics = { - enable = true; - enable32Bit = true; - }; - - services.mysql = { - enable = true; - package = pkgs.mysql80; - }; - services.postgresql = { - enable = true; - authentication = pkgs.lib.mkOverride 10 '' - #type database DBuser auth-method - local all all trust - ''; - }; - - services.xserver = { - enable = true; - xkb.layout = "us,ru"; - xkb.options = "grp:alt_shift_toggle"; - #displayManager.startx.enable = true; - #libinput.enable = true; # touchpad support - }; - services.displayManager.autoLogin.user = "student"; - services.getty.autologinUser = "student"; - - services.atd = { - enable = true; - allowEveryone = true; - }; - virtualisation.virtualbox.guest.enable = true; - virtualisation.virtualbox.guest.clipboard = true; - programs.chromium = { - enable = true; - extraOpts = { - "SyncDisabled" = true; - "PasswordManagerEnabled" = false; - "SpellcheckEnabled" = false; - "homepageLocation" = "https://ya.ru"; - }; - }; - programs.bash.interactiveShellInit = "${inputs.mireadesktop.packages.x86_64-linux.startmireadesktop - }"; - system.userActivationScripts.mycnf = { - text = '' - printf "[client]\nport=3306\nuser=root" > /home/student/.my.cnf - echo "\set user postgres" > /home/student/.psqlrc - ''; - deps = [ ]; - }; - environment = { - etc."gtk-3.0/settings.ini" = { - text = '' - [Settings] - gtk-icon-theme-name = WhiteSur - ''; - mode = "0644"; - }; - variables = { - PGUSER = "postgres"; - }; - }; - programs.java.enable = true; users.users.student = { isNormalUser = true; - initialPassword = "1"; - extraGroups = [ - "video" - "sound" - "input" - "storage" - ]; + initialPassword = "student"; # вход беспарольный, но пароль student + extraGroups = [ "video" "sound" "input" "storage" ]; packages = let - customJBPlugin = + # определение как скачивать плагины jetbrains (скачивать с нашего сервера копию) + customJBPlugin = nam: ver: sha: pkgs.stdenv.mkDerivation { name = nam; @@ -148,6 +38,9 @@ in with pkgs; [ (pkgs.jetbrains.plugins.addPlugins pkgs.jetbrains.idea-community ( + + # набор плагинов, я бы сказал, богат до избыточности, но главное есть Python + # и Database Nagivator. Остальное - любителям и любознательным. (with inputs.nix-jetbrains-plugins.plugins."${system}"; [ idea-community."2024.1"."mobi.hsz.idea.gitignore" idea-community."2024.1"."org.jetbrains.erlang" @@ -169,57 +62,112 @@ in idea-community."2024.1"."com.redhat.devtools.lsp4ij" ]) ++ [ + # поддежка языка C/C++ на уровне подсветки синтаксиса и автодополнения (customJBPlugin "clsp" "1.0.1" "sha256-AU/Q61YYsGn2BAYykCGm4XGNyeSwd5K/txGNzP2dJg0=") + + # поддежка фреймворка Spring через opensource-плагин Explyt. пусть будет (customJBPlugin "spring-tool" "241-b3085-signed" "sha256-u9Hqy4BN1johA7e8proMekyERXkE6gXRnqGRNR7FouE=" ) ] )) - inputs.mireapython.packages.x86_64-linux.mireapython - simintech.packages.x86_64-linux.simintech - chromium - # rustc - clang-tools - # go gopls delve - # dotnet-sdk - pinta - unrar - git - seafile-client - # pcmanfm metacity - sakura - gtk3 - whitesur-icon-theme - unzipNLS - # pandoc - #onlyoffice-desktopeditors # unfortunetely right now OnlyOffice has bug - libreoffice # so libreoffice is still actual for us... - clang - # ghc haskell-language-server - jdk - kotlin - # nodePackages.intelephense - # sql-language-server # from NPM TODO - tree - unityhub + + chromium # браузер + pinta # графический редактор + sakura # терминал + unzipNLS # поддержка zip + unrar # поддержка rar + gtk3 whitesur-icon-theme # необходимо для иконок + pandoc - yt-dlp + #onlyoffice-desktopeditors # к сожалению, пока у OnlyOffice баг со шрифтами. Ждём фикс + libreoffice # поэтому пока что у нас Libreoffice... + + # Напоминаю что у нас есть СЕТЕВОЙ ДИСК по адресу 10.0.174.12 + # и для студентов пока есть единая учётка student@mirea.ru, + # рассматривается вариант авторизации через login.mirea.ru. + # Преподаватели могут зарегистрироваться ОТДЕЛЬНО + seafile-client + + # утилиты разработчика + git + cmakeWithGui + gnumake + + ###### ЯЗЫКИ ПРОГРАММИРОВАНИЯ ##### + + # поставка Python, полный список возможностей + # см. на github.com/gregorybednov/mireapython + inputs.mireapython.packages.x86_64-linux.mireapython + + # базовая поддержка C/C++ и дебага + clang + clang-tools + lldb + cpplint + cppcheck + gcc-arm-embedded # компиляция С/C++ под STM32 и прочие arm + + octaveFull # GNU Octave + + shellcheck # проверка шелл-кода (bash, POSIX sh, ...) + + + # Другие возможные языки и инструменты, например: + # rustc # - Rust + # go gopls delve golint go-tools # - Go + jdk kotlin # - Java, Kotlin (идут вместе с IJ IDEA) + # ghc haskell-language-server # - Haskell + # nodePackages.intelephense # - PHP + # dotnet-sdk # - C# + + ####### Проектирование и разработка баз данных, ИУС, ... ####### + + # Workbench для управления и ER-моделирования БД на mysql + # у КАЖДОГО nixos есть свой локальный сервер mysql, см. ниже по файлу mysql-workbench + + # аналог Bizagi Modeler, расширенный вариант bpmn.io camunda-modeler - logisim-evolution + + # графическое моделирование UML-диаграмм + # также доступно моделирование BPMN и ER staruml - archi + + # Язык текстового описания UML-диаграмм + # актуально для разработчиков ПО (встраивание диаграмм в код) + # поддерживается нашей поставкой IJ IDEA CE plantuml + + archi # поддержка archimate + + + ##### Утилиты и программы для STM32 ##### + # 1) STM32CubeIDE упаковать не удалось + # 2) есть основания полагать, что её функциональность лучше встроить + # в IJ IDEA CE, как это сделано в настоящем Clion; stm32cubemx.packages.x86_64-linux.stm32cubemx stm32flash stlink stlink-gui stm32loader - nodePackages.node-red - gcc-arm-embedded - octaveFull - # POSIX utils capability + ##### СЕТЕВЫЕ УТИЛИТЫ ####### + nodePackages.node-red # - лоукод-платформа программирования устройств, в частности интернета вещей + httpie httpie-desktop # - передовой клиент HTTP-запросов + netcat socat # - низкоуровневые простейшие утилиты установления TCP или UDP между компьютерами или с ПЛК + opcua-client-gui # - простой графический клиент OPC UA + + ###### Другой софт ####### + + logisim-evolution + unityhub # UnityHub - 3D-моделирование, визуализация, геймдев, AR/VR + + # поставка SimInTech. Кодогенерация библиотек для ПК работает, + # но несовместима с .dll из windows! + simintech.packages.x86_64-linux.simintech + + # POSIX утилиты для совместимости om4 pax mailutils @@ -231,30 +179,159 @@ in uucp util-linux cflow - ncompress - - # Nice programming language checkers and helpers - gdb - shellcheck - valgrind - cpplint - cppcheck - nixfmt-classic - golint - errcheck - go-tools - # eslint_d - #flake8 - # html-tidy - # Basic network utils for education and debugging - socat - httpie - httpie-desktop - netcat - opcua-client-gui + ncompress ]; }; + # вставленные флешки автоматически монтируются + services.devmon.enable = true; + + # необходимо для совместимости с POSIX по команде at, при отсутствии необходимости можно удалить + services.atd = { + enable = true; + allowEveryone = true; + }; + + # на каждой машине свой сервер mysql и postgresql + services.mysql = { + enable = true; + package = pkgs.mysql80; + }; + services.postgresql = { + enable = true; + authentication = pkgs.lib.mkOverride 10 '' + #type database DBuser auth-method + local all all trust + ''; + }; + + # и оба поддерживают вход без пароля в "руты" + system.userActivationScripts.mycnf = { + text = '' + printf "[client]\nport=3306\nuser=root" > /home/student/.my.cnf + echo "\set user postgres" > /home/student/.psqlrc + ''; + deps = [ ]; + }; + environment = { + etc."gtk-3.0/settings.ini" = { + text = '' + [Settings] + gtk-icon-theme-name = WhiteSur + ''; + mode = "0644"; + }; + variables = { + PGUSER = "postgres"; + }; + }; + + imports = [ ./hardware-configuration.nix ]; + + # если машина установлена на диск с Windows, + # то она позволяет "увидеть" и выбрать Windows в течение 30 с + # иначе - 5 c таймаута (для виртуалок) + boot.loader = if hasBootPartition then { + efi.canTouchEfiVariables = true; + timeout = 30; + grub = { + enable = true; + efiSupport = true; + device = "nodev"; + useOSProber = true; + }; + } else { + timeout = 5; + grub = { + enable = true; + device = "/dev/sda"; + }; + }; + time.hardwareClockInLocalTime = hasBootPartition; + + # настройки Nix + nixpkgs.config.allowUnfree = true; + nix.settings.auto-optimise-store = true; + nix.extraOptions = '' + experimental-features = nix-command flakes + ''; + + ##### НАСТРОЙКИ ГРАФИКИ И РАБОЧЕГО СТОЛА ###### + hardware.graphics = { + enable = true; + enable32Bit = true; + }; + services.xserver = { + enable = true; + xkb.layout = "us,ru"; + xkb.options = "grp:alt_shift_toggle"; + }; + services.displayManager.autoLogin.user = "student"; + services.getty.autologinUser = "student"; + services.xserver.displayManager.lightdm.enable = true; + services.displayManager.defaultSession = "MIREA-WindowsLike+Metacity"; + services.xserver.displayManager.session = [ + { + manage = "desktop"; + name = "MIREA-WindowsLike"; + # подробности настроек рабочего стола см. на github.com/gregorybednov/mireadesktop + start = '' + ${inputs.mireadesktop.packages.x86_64-linux.tint2} & + ${inputs.mireadesktop.packages.x86_64-linux.pcmanfm} & + waitPID=$! + ''; + } + { + manage = "window"; + name = "Metacity"; + start = '' + ${pkgs.metacity}/bin/metacity & + waitPID=$! + ''; + } + ]; + + ##### СЕТЕВЫЕ НАСТРОЙКИ ####### + # каждый компьютер виден под уникальным именем через Avahi + services.avahi = { + hostName = "nixos" + + builtins.readFile ((pkgs.runCommandLocal "uuid" {} '' + mkdir $out + cat /proc/sys/kernel/random/uuid > $out/uuid + '')+"/uuid"); + enable = true; + nssmdns4 = true; + publish = { + enable = true; + hinfo = true; + addresses = true; + }; + }; + + # каждый компьютер имеет выход в интернет + networking.networkmanager.enable = true; + + networking.hostName = "nixos"; + + # каждый компьютер ресолвит DNS-запросы СТРОГО через наш сервер + networking.nameservers = [ serverIP ]; + + # каждый компьютер знает, что kafpi.local - это адрес нашего сервера + networking.hosts."${serverIP}" = [ "kafpi.local" ]; + + #### ЛОКАЛИЗАЦИЯ ##### + + time.timeZone = "Europe/Moscow"; + i18n.defaultLocale = "ru_RU.UTF-8"; + console = { + font = "cyr-sun16"; + useXkbConfig = true; + }; + + # установлены шрифты Microsoft (corefonts), + # установлен ГОСТ Тип А (задел на будущее), + # установлены базовые свободные шрифты, + # установлен шрифт Jetbrains Mono fonts.packages = with pkgs; [ jetbrains-mono inputs.gostfont.packages.x86_64-linux.gostfont @@ -262,24 +339,40 @@ in liberation_ttf ]; + + ####### ПРОЧИЕ НАСТРОЙКИ ####### environment.systemPackages = with pkgs; [ vim + tree wget ]; + # удаленный доступ в пределах нашей сети services.openssh = { enable = true; settings.PermitRootLogin = "yes"; }; + services.gnome.gnome-keyring.enable = true; - programs.gnupg = { - agent.enable = true; - agent.enableSSHSupport = true; + programs = { + java.enable = true; + gnupg.agent = { + enable = true; + enableSSHSupport = true; + }; + chromium = { + enable = true; + extraOpts = { + "SyncDisabled" = true; + "PasswordManagerEnabled" = false; + "SpellcheckEnabled" = false; + "homepageLocation" = "https://ya.ru"; + }; + }; + bash.interactiveShellInit = "${inputs.mireadesktop.packages.x86_64-linux.startmireadesktop}"; + udevil.enable = true; # тоже нужно для флешек }; - programs.udevil.enable = true; - services.devmon.enable = true; - - - system.stateVersion = "24.05"; # Did you read the comment? + # НЕ МЕНЯТЬ, иначе придётся все компы переустанавливать, а не обновлять + system.stateVersion = "24.05"; }