Загрузить файлы в «/»
This commit is contained in:
parent
a891b6fd28
commit
06f5beccfc
1 changed files with 109 additions and 5 deletions
|
|
@ -737,13 +737,66 @@ in
|
||||||
nvidia.acceptLicense = true;
|
nvidia.acceptLicense = true;
|
||||||
};
|
};
|
||||||
nix.settings = {
|
nix.settings = {
|
||||||
extra-substituters = [ "http://nixos.builds.node" ];
|
# Локальный кэш идёт первым — большинство пакетов уже собраны на build-ноде
|
||||||
trusted-public-keys = [ "nixos.builds.node:E/XNkcdzB0EyTyEJuOTXJH8qynxgCfQ87JHkbD88uF8=" ];
|
substituters = [
|
||||||
|
"http://nixos.builds.node"
|
||||||
|
"https://cache.nixos.org"
|
||||||
|
];
|
||||||
|
trusted-public-keys = [
|
||||||
|
"nixos.builds.node:E/XNkcdzB0EyTyEJuOTXJH8qynxgCfQ87JHkbD88uF8="
|
||||||
|
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
|
||||||
|
];
|
||||||
|
trusted-substituters = [ "http://nixos.builds.node" ];
|
||||||
auto-optimise-store = true;
|
auto-optimise-store = true;
|
||||||
|
# Если build-нода временно недоступна — переходим к cache.nixos.org, не зависаем
|
||||||
|
connect-timeout = 5;
|
||||||
|
experimental-features = [ "nix-command" "flakes" ];
|
||||||
|
# На дисках 50 GiB автоматически запускать GC при нехватке места
|
||||||
|
min-free = 2147483648; # 2 GiB — порог запуска GC
|
||||||
|
max-free = 5368709120; # 5 GiB — цель освобождения
|
||||||
};
|
};
|
||||||
nix.extraOptions = ''
|
nix.gc = {
|
||||||
experimental-features = nix-command flakes
|
automatic = true;
|
||||||
'';
|
dates = "weekly";
|
||||||
|
randomizedDelaySec = "45min"; # машины не запускают GC одновременно
|
||||||
|
options = "--delete-older-than 14d";
|
||||||
|
};
|
||||||
|
# Хранить не более 5 поколений в меню GRUB
|
||||||
|
boot.loader.grub.configurationLimit = 5;
|
||||||
|
# Периодический TRIM для SSD (безопасен и на HDD — просто no-op)
|
||||||
|
services.fstrim.enable = true;
|
||||||
|
# nix-daemon стартует только после Yggdrasil, иначе nixos.builds.node недостижим
|
||||||
|
systemd.services.nix-daemon = {
|
||||||
|
after = [ "yggdrasil.service" ];
|
||||||
|
wants = [ "yggdrasil.service" ];
|
||||||
|
};
|
||||||
|
# Уникальный hostname на основе последних 6 цифр MAC-адреса основного интерфейса.
|
||||||
|
# networking.hostName = "nixos" остаётся fallback-значением в /etc/hostname;
|
||||||
|
# сервис перекрывает его transient-именем при каждой загрузке.
|
||||||
|
systemd.services.hostname-from-mac = {
|
||||||
|
description = "Set unique hostname from primary NIC MAC address";
|
||||||
|
wantedBy = [ "network-pre.target" ];
|
||||||
|
before = [ "network-pre.target" ];
|
||||||
|
after = [ "systemd-udev-settle.service" ];
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
RemainAfterExit = true;
|
||||||
|
};
|
||||||
|
script = ''
|
||||||
|
mac=$(${pkgs.iproute2}/bin/ip link show \
|
||||||
|
| grep -v LOOPBACK \
|
||||||
|
| grep -oE '([0-9a-f]{2}:){5}[0-9a-f]{2}' \
|
||||||
|
| head -1 \
|
||||||
|
| tr -d ':')
|
||||||
|
if [ -n "$mac" ]; then
|
||||||
|
${pkgs.systemd}/bin/hostnamectl set-hostname --transient "nixos-''${mac: -6}"
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
# Директория для хранения данных о физическом расположении компьютера
|
||||||
|
systemd.tmpfiles.rules = [
|
||||||
|
"d /var/lib/place 0755 student users -"
|
||||||
|
];
|
||||||
|
|
||||||
##### НАСТРОЙКИ ГРАФИКИ И РАБОЧЕГО СТОЛА ######
|
##### НАСТРОЙКИ ГРАФИКИ И РАБОЧЕГО СТОЛА ######
|
||||||
hardware.graphics = {
|
hardware.graphics = {
|
||||||
|
|
@ -871,6 +924,57 @@ in
|
||||||
tree
|
tree
|
||||||
wget
|
wget
|
||||||
git
|
git
|
||||||
|
yad
|
||||||
|
# Утилита фиксации физического расположения компьютера в аудитории.
|
||||||
|
# Использование: place [АУДИТОРИЯ] (например: place А-101)
|
||||||
|
# Запись: /var/lib/place/location (JSON, доступен root по SSH)
|
||||||
|
# При запуске от root через SSH автоматически подключается к X-сессии student на :0
|
||||||
|
(pkgs.writeShellApplication {
|
||||||
|
name = "place";
|
||||||
|
runtimeInputs = [ yad coreutils util-linux ];
|
||||||
|
text = ''
|
||||||
|
ROOM_ARG="''${1:-}"
|
||||||
|
PLACE_FILE="/var/lib/place/location"
|
||||||
|
|
||||||
|
# Когда запускается от root по SSH — показать диалог на локальном X :0
|
||||||
|
if [ -z "''${DISPLAY:-}" ]; then
|
||||||
|
export DISPLAY=":0"
|
||||||
|
export XAUTHORITY="/home/student/.Xauthority"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! result=$(yad \
|
||||||
|
--title="Место компьютера" \
|
||||||
|
--text="Зафиксируйте расположение этого компьютера в аудитории.\nДанные сохраняются в /var/lib/place/location." \
|
||||||
|
--form \
|
||||||
|
--field="Аудитория" \
|
||||||
|
--field="Ряд:NUM" \
|
||||||
|
--field="Место:NUM" \
|
||||||
|
--button="Сохранить:0" \
|
||||||
|
--button="Отмена:1" \
|
||||||
|
--width=340 \
|
||||||
|
-- "''${ROOM_ARG}" 1 1 \
|
||||||
|
2>/dev/null); then
|
||||||
|
exit 0 # Нажата «Отмена» — без ошибки
|
||||||
|
fi
|
||||||
|
|
||||||
|
room=$(printf '%s' "''${result}" | cut -d'|' -f1)
|
||||||
|
row=$(printf '%s' "''${result}" | cut -d'|' -f2 | cut -d'.' -f1)
|
||||||
|
seat=$(printf '%s' "''${result}" | cut -d'|' -f3 | cut -d'.' -f1)
|
||||||
|
|
||||||
|
if [ -z "''${room}" ]; then
|
||||||
|
echo "Ошибка: поле «Аудитория» не заполнено" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p "$(dirname "''${PLACE_FILE}")"
|
||||||
|
printf '{"room":"%s","row":%s,"seat":%s,"host":"%s","at":"%s"}\n' \
|
||||||
|
"''${room}" "''${row}" "''${seat}" "$(hostname)" "$(date -Iseconds)" \
|
||||||
|
> "''${PLACE_FILE}"
|
||||||
|
|
||||||
|
echo "Сохранено: аудитория ''${room}, ряд ''${row}, место ''${seat}"
|
||||||
|
echo "Файл: ''${PLACE_FILE}"
|
||||||
|
'';
|
||||||
|
})
|
||||||
];
|
];
|
||||||
|
|
||||||
# удаленный доступ в пределах нашей сети
|
# удаленный доступ в пределах нашей сети
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue