вторник, 13 января 2026 г.

Debian: Русификация консоли

Русификация проходит в три ключевых этапа: настройка локалей, при необходимости — проверка и установка консольных шрифтов и кодировки, а затем настройка русской раскладки клавиатуры.

Установка и настройка русской локали.

Локаль определяет язык сообщений системы, формат даты, времени и чисел. Основной шаг — сгенерировать русскую локаль:
1. Установите или обновите пакет locales:
sudo apt update
sudo apt install locales


2. Настройте локаль утилитой dpkg-reconfigure:
sudo dpkg-reconfigure locales

В открывшемся текстовом меню с помощью пробела отметьте пункт ru_RU.UTF-8 и нажмите "Enter". На следующем экране выберите ru_RU.UTF-8 в качестве системной локали по умолчанию и снова нажмите "Enter".

Настройка кодировки и шрифта консоли.

Следующий шаг: настроить локальную консоль на использование UTF-8 и правильного шрифта.
1. Установите пакет настройки консоли:
sudo apt install console-setup

2. Настройте консольный шрифт и кодировку:
sudo dpkg-reconfigure console-setup

В появившемся меню последовательно выберите:
Кодировка: UTF-8;
Шрифт: Для поддержки кириллицы хорошо подходит Terminus или Fixed, выберите один из них;
Размер шрифта: Можно оставить 8x16 (читаемый вариант);
Сочетание символов для консоли: Обязательно выберите вариант, включающий Cyrillic (например, Combined - Latin; Slavic and non-Slavic Cyrillic).

Настройки должны примениться автоматически. Если нет, перезагрузите машину или переключитесь между виртуальными консолями и обратно.

Настройка русской раскладки клавиатуры.

После настройки локали сообщения могут стать русскими, но для ввода текста кириллицей в консоли также потребуется настроить клавиатуру.
1. Установите пакет для настройки:
sudo apt install keyboard-configuration

2. Настройте раскладку:
sudo dpkg-reconfigure keyboard-configuration

В появившемся меню последовательно выберите подходящую модель клавиатуры (можно оставить по умолчанию), раскладку (Russian), вариант раскладки и клавишу для переключения языков (например, Alt+Shift).

Дополнительно: Чтобы узнать текущую модель клавиатуры, выполните:
grep XKBMODEL /etc/default/keyboard

Дополнительные шаги и диагностика:

После всех настроек перезагрузите систему или как минимум выйдите из консоли и зайдите заново.
Для проверки результатов выполните команду "locale". Если всё настроено верно, в строке LANG и большинстве других будет указано ru_RU.UTF-8.

вторник, 23 декабря 2025 г.

Debian: Настройка VMware VM Customization Specifications для ОС Debian GNU/Linux

К сожалению, при использовании "VM Customization Specifications" при развертывании ОС Debian скрипты "open-vm-toos" не могут корректно сконфигурировать некоторые параметры для данной системы.
Чтобы решить эту проблему, применим скрипт, который возьмет на себя функционал, не корректно работающий в самих тулзах.

Выполним следующие шаги для настройки "VM Customization Specifications":

1. Подготавливаем шаблон ОС Debian с установкой необходимого ПО, которое уже должно быть в комплекте с новыми хостами.
2. Обязательно устанавливаем "open-vm-tools" и проверяем, что служба "vmtoolsd" находится в автозапуске:
sudo apt-get install open-vm-tools
sudo systemctl enable vmtoolsd && sudo systemctl start vmtoolsd


3. Включаем поддержку скриптов для кастомизации:
sudo vmware-toolbox-cmd config set deployPkg enable-custom-scripts true

Для проверки текущего состояния параметра выполните:
sudo vmware-toolbox-cmd config get deployPkg enable-custom-scripts

4. Далее настраиваем "VM Customization Specifications" на vCenter Server. При настройке указываем: тип ОС - Linux, правило формирования имени хоста, часовой пояс, TCP/IP настройки и добавляем следующий скрипт:

#!/bin/bash

# Функция для преобразования маски подсети в префикс CIDR
mask2cidr() {
    local mask=$1
    local n=0
    IFS=.

    for byte in $mask; do
        case $byte in
            255) n=$((n+8));;
            254) n=$((n+7));;
            252) n=$((n+6));;
            248) n=$((n+5));;
            240) n=$((n+4));;
            224) n=$((n+3));;
            192) n=$((n+2));;
            128) n=$((n+1));;
            0);;
            *) echo 24; return 1;;
        esac
    done

    echo $n
}

# Функция определения метода управления сетью с приоритетом: NM -> SystemD -> Ifupdown
get_network_manager() {
    local interface=$1

    # 1. Проверяем NetworkManager в первую очередь
    if command -v nmcli >/dev/null 2>&1; then
        # Проверяем, управляется ли интерфейс через NetworkManager
        if nmcli -t -f DEVICE device 2>/dev/null | grep -q "^${interface}$"; then
            echo "NetworkManager"
            return
        fi

        # Проверяем, активен ли NetworkManager как служба
        if systemctl is-active NetworkManager >/dev/null 2>&1; then
            echo "NetworkManager"
            return
        fi

        # Проверяем, есть ли соединение NetworkManager для этого интерфейса
        if nmcli -t -f NAME,DEVICE connection show 2>/dev/null | grep -q ":${interface}$"; then
            echo "NetworkManager"
            return
        fi
    fi

    # 2. Проверяем systemd-networkd
    if systemctl is-active systemd-networkd >/dev/null 2>&1 && \
       systemctl is-active systemd-resolved >/dev/null 2>&1; then
        echo "SystemD"
        return
    fi

    # 3. Проверяем ifupdown (традиционный метод Debian)
    if [ -f "/etc/network/interfaces" ]; then
        # Проверяем, упоминается ли интерфейс в конфигурации
        if grep -q -E "^(auto|allow-hotplug|iface|mapping).*${interface}" /etc/network/interfaces; then
            echo "Ifupdown"
            return
        fi

        # Проверяем наличие конфигов в interfaces.d
        if [ -d "/etc/network/interfaces.d" ]; then
            for config in /etc/network/interfaces.d/*; do
                if [ -f "$config" ] && grep -q "${interface}" "$config"; then
                    echo "Ifupdown"
                    return
                fi
            done
        fi
    fi

    # Проверяем, активна ли служба networking (ifupdown)
    if systemctl is-active networking >/dev/null 2>&1; then
        echo "Ifupdown"
        return
    fi

    # 4. Если ничего не найдено, проверяем по наличию служб
    if systemctl is-enabled NetworkManager >/dev/null 2>&1; then
        echo "NetworkManager"
    elif systemctl is-enabled systemd-networkd >/dev/null 2>&1; then
        echo "SystemD"
    elif systemctl is-enabled networking >/dev/null 2>&1; then
        echo "Ifupdown"
    else
        # Если ничего не определено, используем ifupdown как запасной вариант
        echo "Ifupdown"
    fi
}

# Функция настройки NetworkManager
configure_networkmanager() {
    local interface=$1
    local bootproto=$2
    local ipaddr=$3
    local netmask=$4
    local gateway=$5
    local dns_servers=$6
    local domain=$7

    # Удаляем существующее соединение для этого интерфейса
    nmcli connection delete "$interface" 2>/dev/null || true
    nmcli connection delete "Wired connection 1" 2>/dev/null || true
    nmcli connection delete "System ${interface}" 2>/dev/null || true

    # Создаем новое соединение
    if [ "$bootproto" = "static" ]; then
        local prefix_length=$(mask2cidr "$netmask")
        nmcli con add type ethernet con-name "$interface" ifname "$interface" ipv4.method manual \
            ipv4.addresses "${ipaddr}/${prefix_length}" \
            ipv4.gateway "$gateway" \
            ipv4.dns "$dns_servers" \
            ipv4.dns-search "$domain" \
            autoconnect yes
    else
        nmcli con add type ethernet con-name "$interface" ifname "$interface" \
            ipv4.method auto autoconnect yes
    fi

    # Активируем соединение
    nmcli con up "$interface"
}

# Функция настройки SystemD networkd
configure_systemd() {
    local interface=$1
    local bootproto=$2
    local ipaddr=$3
    local netmask=$4
    local gateway=$5
    local dns_servers=$6
    local domain=$7
    local dns_from_dhcp=$8

    # Убедимся, что служба активна
    systemctl enable systemd-networkd 2>/dev/null || true
    systemctl start systemd-networkd 2>/dev/null || true

    # Очищаем каталог /etc/systemd/network
    rm -rf /etc/systemd/network/*

    # Создаем базовую конфигурацию для loopback-интерфейса
    mkdir -p /etc/systemd/network
    cat > /etc/systemd/network/00-loopback.network <<EOF
[Match]
Name=lo

[Network]
Address=127.0.0.1/8
Address=::1/128
EOF

    # Создаем конфигурацию для основного интерфейса
    CONFIG_FILE="/etc/systemd/network/10-${interface}.network"

    if [ "$bootproto" = "static" ]; then
        if [ -z "$ipaddr" ] || [ -z "$netmask" ]; then
            echo "Ошибка: для статической настройки нужны IPADDR и NETMASK"
            exit 1
        fi

        prefix_length=$(mask2cidr "$netmask")
        if [ -z "$prefix_length" ]; then
            prefix_length=24
        fi

        # Создаем конфиг для статического IP
        cat > "$CONFIG_FILE" <<EOF
[Match]
Name=$interface

[Network]
Address=$ipaddr/$prefix_length
EOF

        if [ -n "$gateway" ]; then
            echo "Gateway=$gateway" >> "$CONFIG_FILE"
        fi

        # Добавляем DNS серверы
        if [ -n "$dns_servers" ]; then
            for dns in $dns_servers; do
                echo "DNS=$dns" >> "$CONFIG_FILE"
            done
        fi
    else
        # Создаем конфиг для DHCP
        cat > "$CONFIG_FILE" <<EOF
[Match]
Name=$interface

[Network]
DHCP=ipv4

[DHCPv4]
UseDomains=true
EOF

        # Настраиваем использование DNS
        if [ "$dns_from_dhcp" = "yes" ]; then
            echo "UseDNS=yes" >> "$CONFIG_FILE"
        else
            echo "UseDNS=no" >> "$CONFIG_FILE"
            if [ -n "$dns_servers" ]; then
                for dns in $dns_servers; do
                    echo "DNS=$dns" >> "$CONFIG_FILE"
                done
            fi
        fi
    fi

    # Настраиваем systemd-resolved если нужно
    if [ -n "$dns_servers" ] || [ -n "$domain" ]; then
        mkdir -p /etc/systemd/resolved.conf.d
        cat > /etc/systemd/resolved.conf.d/10-${interface}.conf <<EOF
[Resolve]
EOF

        if [ -n "$dns_servers" ]; then
            echo "DNS=$dns_servers" >> /etc/systemd/resolved.conf.d/10-${interface}.conf
        fi

        if [ -n "$domain" ]; then
            echo "Domains=$domain" >> /etc/systemd/resolved.conf.d/10-${interface}.conf
        fi

        systemctl enable systemd-resolved 2>/dev/null || true
        systemctl start systemd-resolved 2>/dev/null || true

        # Создаем симлинк для resolv.conf
        ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf 2>/dev/null || true
    fi

    systemctl restart systemd-networkd

    if systemctl is-active systemd-resolved >/dev/null 2>&1; then
        systemctl restart systemd-resolved
    fi
}

# Функция настройки Ifupdown (/etc/network/interfaces)
configure_ifupdown() {
    local interface=$1
    local bootproto=$2
    local ipaddr=$3
    local netmask=$4
    local gateway=$5
    local dns_servers=$6
    local domain=$7

    echo "Configuring interface $interface using ifupdown" >&2

    # Создаем базовый файл interfaces если его нет
    if [ ! -f /etc/network/interfaces ]; then
        mkdir -p /etc/network
        cat > /etc/network/interfaces <<EOF
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback
EOF
    fi

    # Удаляем ВСЮ конфигурацию для этого интерфейса
    # Создаем временный файл без конфигурации текущего интерфейса
    tmpfile=$(mktemp)
    in_block=0

    while IFS= read -r line; do
        # Проверяем, начинается ли новый блок интерфейса
        if [[ "$line" =~ ^(auto|allow-hotplug|iface)[[:space:]]+$interface([[:space:]]|$) ]]; then
            in_block=1
            continue
        fi

        # Если мы внутри блока и встречаем начало другого блока, выходим из блока
        if [[ $in_block -eq 1 && "$line" =~ ^(auto|allow-hotplug|iface)[[:space:]]+ ]]; then
            in_block=0
        fi

        # Если мы не внутри блока удаляемого интерфейса, сохраняем строку
        if [[ $in_block -eq 0 ]]; then
            echo "$line" >> "$tmpfile"
        fi
    done < /etc/network/interfaces

    # Копируем обратно и удаляем временный файл
    mv "$tmpfile" /etc/network/interfaces
    chmod 644 /etc/network/interfaces

    # Удаляем возможные повторяющиеся пустые строки
    sed -i '/^$/N; /^\n$/D' /etc/network/interfaces
    sed -i -e :a -e '/^\n*$/{$d;N;ba' -e '}' /etc/network/interfaces

    # Добавляем новую конфигурацию
    {
        echo ""
        echo "auto $interface"
        if [ "$bootproto" = "static" ]; then
            echo "iface $interface inet static"
            echo "    address $ipaddr"
            echo "    netmask $netmask"
            [ -n "$gateway" ] && echo "    gateway $gateway"
            [ -n "$dns_servers" ] && echo "    dns-nameservers $dns_servers"
            [ -n "$domain" ] && echo "    dns-search $domain"
        else
            echo "iface $interface inet dhcp"
        fi
    } >> /etc/network/interfaces

    # Настраиваем DNS через resolvconf если установлен
    if command -v resolvconf >/dev/null 2>&1; then
        # Создаем временный файл для resolvconf
        TMP_RESOLV="/tmp/resolv.conf.${interface}"
        echo "# Generated by network configuration script" > "$TMP_RESOLV"

        if [ -n "$domain" ]; then
            echo "domain $domain" >> "$TMP_RESOLV"
            echo "search $domain" >> "$TMP_RESOLV"
        fi

        if [ -n "$dns_servers" ]; then
            for dns in $dns_servers; do
                echo "nameserver $dns" >> "$TMP_RESOLV"
            done
        fi

        # Обновляем resolvconf
        resolvconf -a "${interface}" < "$TMP_RESOLV" 2>/dev/null || true
        rm -f "$TMP_RESOLV"
    else
        # Прямая настройка /etc/resolv.conf
        if [ -n "$dns_servers" ] || [ -n "$domain" ]; then
            echo "# Generated by network configuration script" > /etc/resolv.conf

            if [ -n "$domain" ]; then
                echo "domain $domain" >> /etc/resolv.conf
                echo "search $domain" >> /etc/resolv.conf
            fi

            if [ -n "$dns_servers" ]; then
                for dns in $dns_servers; do
                    echo "nameserver $dns" >> /etc/resolv.conf
                done
            fi
        fi
    fi

    # Перезапускаем сетевую службу
    if systemctl is-active networking >/dev/null 2>&1; then
        systemctl restart networking
    else
        # Старый метод перезапуска сети
        ifdown "$interface" 2>/dev/null || true
        ifup "$interface" 2>/dev/null || true
    fi
}

# --- Функция очистки логов и временных файлов ---
clean_system() {
    # Очистка логов (с сохранением структуры каталогов)
    find /var/log -type f -name "*.log" -exec truncate -s 0 {} \; 2>/dev/null || true
    find /var/log -type f -name "*.gz" -delete 2>/dev/null || true
    find /var/log -type f -name "*.old" -delete 2>/dev/null || true
    find /var/log -type f -name "lastlog" -exec rm -f {} \; 2>/dev/null || true

    # Очистка временных файлов
    rm -rf /tmp/* 2>/dev/null || true
    rm -rf /var/tmp/* 2>/dev/null || true

    # Очистка истории команд и пользовательских данных
    for user_home in /home/*; do
        if [[ -d "$user_home" ]]; then
            user=$(basename "$user_home")
            # Очистка bash_history и других историй
            truncate -s 0 "$user_home/.bash_history" 2>/dev/null || true
            # Очистка кэшей приложений
            rm -rf "$user_home/.cache/*" 2>/dev/null || true
        fi
    done

    # Очистка root
    truncate -s 0 /root/.bash_history 2>/dev/null || true
    rm -rf /root/.cache/* 2>/dev/null || true

    # Удаление случайных seed-файлов
    rm -f /var/lib/systemd/random-seed 2>/dev/null || true
}

# --- Функция удаления SSH host keys ---
reset_ssh_keys() {
    rm -f /etc/ssh/ssh_host_* 2>/dev/null || true

    # Регенерация ключей SSH-сервера
    if command -v dpkg-reconfigure >/dev/null 2>&1; then
        dpkg-reconfigure -f noninteractive openssh-server 2>/dev/null || true
    fi

    # Альтернативный способ для Debian
    if [ -x /usr/sbin/sshd ]; then
        /usr/sbin/sshd-keygen -A 2>/dev/null || true
    fi
}

# ============================================================
# Основная логика скрипта
# ============================================================
if [ "$1" = "precustomization" ]; then
    # Выполняем очистку системы
    clean_system

    # Проверяем и создаем /etc/network/interfaces
    if [ ! -f /etc/network/interfaces ]; then
        echo "Creating /etc/network/interfaces file"
        mkdir -p /etc/network
        cat > /etc/network/interfaces <<EOF
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback
EOF
    fi

    # Проверяем и создаем директорию /etc/sysconfig/network-scripts если нужно
    if [ ! -d "/etc/sysconfig/network-scripts" ]; then
        mkdir -p /etc/sysconfig/network-scripts 2>/dev/null || true
    fi

    # Этап предварительной настройки
    VMCUST_DIR=$(ls -d /var/run/.vmware-imgcust* 2>/dev/null | head -n 1)
    if [ -n "$VMCUST_DIR" ]; then
        CUST_CFG_PATH="$VMCUST_DIR/cust.cfg"
        if [ -f "$CUST_CFG_PATH" ]; then
            cp "$CUST_CFG_PATH" "/root/cust.cfg"
        fi
    fi

elif [ "$1" = "postcustomization" ]; then
    # Этап пост-настройки
    reset_ssh_keys

    if [ ! -f "/root/cust.cfg" ]; then
        echo "Ошибка: файл конфигурации /root/cust.cfg не найден"
        exit 1
    fi

    CFG_FILE="/root/cust.cfg"

    # Парсим параметры конфигурации
    BOOTPROTO=$(awk -F' = ' '/^BOOTPROTO/ {line=$2} END{print tolower(line)}' "$CFG_FILE")
    IPADDR=$(awk -F' = ' '/^IPADDR/ {line=$2} END{print line}' "$CFG_FILE")
    NETMASK=$(awk -F' = ' '/^NETMASK/ {line=$2} END{print line}' "$CFG_FILE")
    GATEWAY=$(awk -F' = ' '/^GATEWAY/ {line=$2} END{print line}' "$CFG_FILE")
    HOSTNAME=$(awk -F' = ' '/^HOSTNAME/ {line=$2} END{print line}' "$CFG_FILE")
    DOMAIN=$(awk -F' = ' '/^DOMAINNAME/ {line=$2} END{print line}' "$CFG_FILE")
    MACADDR=$(awk -F' = ' '/^MACADDR/ {line=$2} END{print tolower(line)}' "$CFG_FILE")
    DNS_SERVERS=$(awk -F' = ' '/^NAMESERVER\|[0-9]/ {print $2}' "$CFG_FILE" | tr '\n' ' ' | sed 's/ $//')
    DNS_FROM_DHCP=$(awk -F' = ' '/^DNSFROMDHCP/ {line=$2} END{print tolower(line)}' "$CFG_FILE")
    TIMEZONE=$(awk -F' = ' '/^TIMEZONE/ {line=$2} END{print line}' "$CFG_FILE")
    UTC=$(awk -F' = ' '/^UTC/ {line=$2} END{print tolower(line)}' "$CFG_FILE")

    # Определяем сетевой интерфейс
    INTERFACE=$(ip -o link | awk -v mac="$MACADDR" 'tolower($0) ~ mac {gsub(":", "", $2); print $2}')

    if [ -z "$INTERFACE" ]; then
        INTERFACE=$(ip route | awk '/default/ {print $5; exit}')
    fi

    if [ -z "$INTERFACE" ]; then
        # Последняя попытка: берем первый Ethernet интерфейс
        INTERFACE=$(ip -o link | awk -F': ' '$2 !~ /^lo|virbr|docker|veth/ {print $2; exit}' | sed 's/@.*//')
    fi

    if [ -z "$INTERFACE" ]; then
        echo "Ошибка: не удалось определить сетевой интерфейс"
        exit 1
    fi

    # Определяем метод управления сетью
    NET_MGR=$(get_network_manager "$INTERFACE")
    echo "Определен метод управления сетью: $NET_MGR для интерфейса $INTERFACE"

    case "$NET_MGR" in
        "NetworkManager")
            configure_networkmanager "$INTERFACE" "$BOOTPROTO" "$IPADDR" "$NETMASK" \
                "$GATEWAY" "$DNS_SERVERS" "$DOMAIN"
            ;;
        "SystemD")
            configure_systemd "$INTERFACE" "$BOOTPROTO" "$IPADDR" "$NETMASK" \
                "$GATEWAY" "$DNS_SERVERS" "$DOMAIN" "$DNS_FROM_DHCP"
            ;;
        "Ifupdown")
            configure_ifupdown "$INTERFACE" "$BOOTPROTO" "$IPADDR" "$NETMASK" \
                "$GATEWAY" "$DNS_SERVERS" "$DOMAIN"
            ;;
        *)
            echo "Неизвестный метод управления сетью, используем ifupdown как запасной вариант"
            configure_ifupdown "$INTERFACE" "$BOOTPROTO" "$IPADDR" "$NETMASK" \
                "$GATEWAY" "$DNS_SERVERS" "$DOMAIN"
            ;;
    esac

    # Общие настройки
    hostnamectl set-hostname "$HOSTNAME" 2>/dev/null || echo "$HOSTNAME" > /etc/hostname
    sed -i "/127\.0\.1\.1/d" /etc/hosts
    echo "127.0.1.1 $HOSTNAME.$DOMAIN $HOSTNAME" >> /etc/hosts

    # Настройка часового пояса
    if [ -n "$TIMEZONE" ]; then
        timedatectl set-timezone "$TIMEZONE" 2>/dev/null || true

        # Альтернативный способ для Debian
        if [ -f "/usr/share/zoneinfo/$TIMEZONE" ]; then
            cp "/usr/share/zoneinfo/$TIMEZONE" /etc/localtime 2>/dev/null || true
            echo "$TIMEZONE" > /etc/timezone 2>/dev/null || true
        fi
    fi

    # Настройка формата времени BIOS (UTC или локальное)
    if [ -n "$UTC" ]; then
        if [ "$UTC" = "yes" ]; then
            # Устанавливаем UTC время в BIOS
            timedatectl set-local-rtc 0 2>/dev/null || true
        else
            # Устанавливаем локальное время в BIOS
            timedatectl set-local-rtc 1 2>/dev/null || true
        fi
    fi

    # Сохраняем конфигурацию
    CONFIG_LOG="/root/vm-customization.log"
    {
        echo "=========================================="
        echo "Настройка завершена: $(date)"
        echo "=========================================="
        echo "CONFIG_SOURCE=$CFG_FILE"
        echo "BOOTPROTO=$BOOTPROTO"
        echo "INTERFACE=$INTERFACE"
        echo "NETWORK_MANAGER=$NET_MGR"
        echo "HOSTNAME=$HOSTNAME"
        echo "DOMAIN=$DOMAIN"
        echo "TIMEZONE=$TIMEZONE"
        echo "UTC=$UTC"

        [ -n "$DNS_FROM_DHCP" ] && echo "DNS_FROM_DHCP=$DNS_FROM_DHCP"
        [ -n "$DNS_SERVERS" ] && echo "DNS_SERVERS=\"$DNS_SERVERS\""

        if [ "$BOOTPROTO" = "static" ]; then
            echo "IP_ADDRESS=$IPADDR"
            echo "NETMASK=$NETMASK"
            [ -n "$GATEWAY" ] && echo "GATEWAY=$GATEWAY"
        fi
    } > "$CONFIG_LOG"

    rm -f "/root/cust.cfg"

    # Синхронизируем изменения на диск
    sync

    echo "Настройка завершена успешно. Метод управления сетью: $NET_MGR"

    ##############################################################################################
    # МЕСТО ДЛЯ ДОПОЛНИТЕЛЬНОЙ НАСТРОЙКИ СИСТЕМЫ
    # Здесь можно добавить команды для окончательной настройки машины:
    # - Доустановка необходимого программного обеспечения
    # - Настройка через Ansible или другие системы управления конфигурациями
    # - Выполнение пользовательских скриптов
    # - Настройка мониторинга, логирования и других сервисов

    # Пример: установка базовых пакетов
    # apt-get update && apt-get install -y curl wget net-tools

    ##############################################################################################
fi

Данный скрипт охватывает все возможные варианты настройки сети: IfUpDown, NetworkManager, Systemd-Networkd, как со статическим IP, так и с DHCP.

четверг, 18 декабря 2025 г.

Debian: Настройка swap-файла в Debian вместо отдельного раздела

Swap (файл подкачки) — это специальное пространство на диске, которое используется операционной системой, когда физической оперативной памяти становится недостаточно. Хотя современные системы часто обладают большим объемом ОЗУ, swap всё ещё может быть полезен. Даже при достаточном объеме ОЗУ целесообразно иметь небольшой swap (например, 1-2 ГБ) для подстраховки. Раздел swap располагался в конце диска исторически из-за особенностей ранних файловых систем и контроллеров дисков: это позволяло быстрее выделять и использовать непрерывное пространство, так как размещение в конце диска (ближе к "необслуживаемому" месту) уменьшало фрагментацию и ускоряло доступ, особенно на HDD, где скорость записи падает к центру диска, но часто в конце диска было больше свободного места, не трогая корневые и системные разделы в начале. В современных реалиях и использовании виртуализации стало неудобно расширять при необходимости диск и файловую систему при наличии раздела swap в конце диска. Поэтому можно убрать данный раздел и использовать swap в виде файла на основном разделе.

Для перенастройки выполните следующие шаги:

1. Перед созданием swap-файла проверьте, как настроен у вас swap:
sudo swapon --show
или
free -h

2. Убедитесь, что у вас достаточно свободного места на диске:
df -h

Рекомендуется оставить не менее 5% свободного пространства на разделе после создания swap-файла.

3. Создайте файла подкачки используя утилиту "dd":
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress

где
bs=1M — размер блока 1 МБ;
count=2048 — количество блоков (результирующий размер: 2048 МБ ≈ 2 ГБ);
status=progress — показ прогресса (доступно не во всех версиях dd).

ВАЖНО!!! Рекомендуемый размер swap часто составляет от 50% до 100% от объема ОЗУ, но не более чем в 2 раза. Однако для современных систем с большим объемом ОЗУ (16 ГБ и более) часто достаточно 2-4 ГБ swap, если только вы не планируете использовать гибернацию (тогда размер swap должен быть не меньше объема ОЗУ).

4. Ограничьте доступ к файлу только для root:
sudo chmod 600 /swapfile

5. Форматируйте файл под swap:
sudo mkswap /swapfile

6. Активируйте swap:
sudo swapon /swapfile

7. Проверьте, что swap активен:
sudo swapon --show
или
free -h

8. Отключите swap-раздел (/dev/sda3):
sudo swapoff /dev/sda3

9. Перенастройте "/etc/fstab" для корректного автоматического подключения swap-файла при загрузке ОС. Для этого откройте "fstab" на редактирование, найдите строку вида:
UUID=9f3c3eb7-dbc0-45ca-9299-5bb6f9ae8958 none swap sw 0 0

Поменяйте "UUID=9f3c3eb7-dbc0-45ca-9299-5bb6f9ae8958" в строке на "/swapfile" и сохраните файл конфигурации.

10. Теперь удалите раздел "/dev/sda3" и расширьте основной раздел "/dev/sda2" с помощью утилиты "fdisk":
sudo fdisk /dev/sda

Введите "p", чтобы посмотреть список разделов. Далее введите "d" и выберите номер раздела, где раньше находился swap. Проверьте с помощью "p", правильный ли раздел был удален. Для сохранения изменений введите "w", для выхода с отменой изменений в случае ошибки - введите "q".

11. Расширьте ваш основной раздел, используя освободившееся место на диске. Внутри утилиты "fdisk" введите команду "e", укажите номер вашего раздела, укажите на сколько нужно его увеличить. Выйдите из утилиты командой "w".

12. Окончательным этапом расширьте файловую систему основного раздела:
sudo resize2fs /dev/sda2

13. Проверьте изменения командами:
lsblk -l
df -h

14. Отключите режим гибернации, поскольку данный механизм нативно работает только с блочными устройствами (разделами), а не с файлами внутри файловой системы:
echo "RESUME=none" | sudo tee /etc/initramfs-tools/conf.d/resume
sudo update-initramfs -u -k all


среда, 17 декабря 2025 г.

Ubuntu: Сброс пароля пользователя "root" при наличии доступа к консоли сервера в режиме загрузки EFI

При необходимости сбросить забытый пароль на ОС Ubuntu, которая была установлена в режиме EFI, выполните следующие шаги:

1. При загрузке удерживайте клавишу "ESC", чтобы попасть в меню GRUB. Должна появится строка приглашения "grub>" для ввода команд.

2. Выполните команду "ls". В консоли будут выведены доступные разделы, например:
(hd0,gpt3) (hd0,gpt2) (hd0,gpt1) (lvm/ubuntu--vg-ubuntu--lv)

3. Теперь необходимо проверить данные разделы командами:
ls (hd0,gpt1)/
ls (hd0,gpt2)/
ls (hd0,gpt3)/
ls (lvm/ubuntu--vg-ubuntu--lv)/


Необходимо найти:
Системный раздел - содержит директории, в корне которого есть знакомые папки: boot, home, usr, etc.
Загрузочный раздел - содержит:
- файл ядра (vmlinuz): файл, имя которого начинается с "vmlinuz-", например, "vmlinuz-6.8.0-31-generic".
- файл initrd: файл, имя которого начинается с "initrd.img-" и содержит ту же версию, что и ядро, например, "initrd.img-6.8.0-31-generic".
Запишите или запомните полные имена этих двух файлов.

4. Вручную задайте команды загрузки:
Допустим загрузочным разделом у вас является "(hd0,gpt2)", а системный - "(lvm/ubuntu--vg-ubuntu--lv)".

5. Укажите GRUB, где искать файлы загрузки (загрузочный раздел):
set root=(hd0,gpt2)

5. Загрузите ядро:
linux /vmlinuz-6.8.0-31-generic root=/dev/mapper/ubuntu--vg-ubuntu--lv rw init=/bin/bash
где
root=/dev/mapper/ubuntu--vg-ubuntu--lv - путь к LVM-тому как корневому разделу;
rw - монтируем для записи (ro - только для чтения);
init=/bin/bash - загружаемся сразу в оболочку root.

7. Загрузите образ initrd (он необходим для работы с LVM):
initrd /initrd.img-6.8.0-31-generic

8. Запустите загрузку:
boot
После загрузки образа ОС появится строка ввода формата "root@(none):/#".

9. Смените пароль для "root" или другого пользователя:
passwd root

10. Выполните перезагрузку:
reboot -f


В случае ошибок загрузки и появления строки ввода "(initramfs)" вместо "root@(none):/#", попробуйте смонтировать файловую систему самостоятельно:

а). Создайте точку монтирования:
mkdir /rootfs

б). Смонтируйте ваш LVM-том:
mount /dev/mapper/ubuntu--vg-ubuntu--lv /rootfs

в). Проверьте монтирование:
ls /rootfs
Вы должны увидеть содержимое корневой файловой системы (/): папки bin, home, usr, etc и т.д.

г). Используйте команду chroot, чтобы сделать смонтированный раздел корневым для следующих команд:
chroot /rootfs

д). Смените пароль для "root" или другого пользователя:
passwd root
Введите новый пароль дважды.

е). Перезагрузите систему в основной режим:

Выйдите из chroot:
exit

Размонтируйте раздел:
umount /rootfs

Выполните перезагрузку:
reboot -f

суббота, 6 декабря 2025 г.

Debian: Различные способы настройки сетевых интерфейсов

Для просмотра драйверов сетевых адаптеров выполните:
lspci -k | grep -A2 Ethernet
Список сетевых интерфейсов можно увидеть командой:
ls /sys/class/net
Допустим наш интерфейс называется "ens33".


Настройки интерфейсов с помощью утилиты "ip".

ip link show   #Просмотр сетевых подключений
ip -s l   #Просмотр статистики по отправленным/полученным пакетам
ip address show   #Просмотр конфигурации TCP/IP
ip link set dev ens33 up   #Включение интерфейса, если он был выключен
ip address flush dev ens33   #Сброс конфигурации интерфейса
ip addr add 192.168.0.5/24 broadcast + dev ens33   #Установка IP и маски
ip addr del 192.168.0.5/24 dev ens33   #Удаление IP и маски (в случае ошибки)
ip route show   #Просмотр таблицы маршрутизации
ip route add default via 192.168.0.1 dev ens33   #Установка шлюза по умолчанию
ip route delete default   #Удаление шлюза по умолчанию
ip route add 192.168.10.0/24 via 192.168.0.254 dev ens33   #Добавление маршрута
ip route del 192.168.10.0/24 dev ens33 #Удаление маршрута
echo "nameserver 192.168.0.1 8.8.8.8" | sudo tee /etc/resolv.conf   #Добавление DNS

Данные настройки являются временными и будут работать до перезагрузки ОС.


Настройка сетевой подсистемы методом "ifupdown" (используется по умолчанию при установке без графики).

1. Установите пакет и запустите службу (если отсутствует сервис "networking"):
sudo apt-get install ifupdown
sudo systemctl enable --now networking


2. Для настройки интерфейса необходимо создать или отредактировать уже имеющийся файл "/etc/network/interfaces".
В файле укажите следующие параметры:

Для DHCP:

iface lo inet loopback
auto lo
auto ens33
iface ens33 inet dhcp



Для статического IP:

iface lo inet loopback
auto lo
auto ens33
iface ens33 inet static
address 192.168.1.100/24
#IP и маска
gateway 192.168.1.1 #Шлюз по умолчанию
up ip route add 10.0.0.0/8 via 192.168.1.200 #Статические маршруты
metric 0

и создайте файл "/etc/resolv.conf" со следующим содержимым:
nameserver 192.168.0.1 #DNS1
nameserver 8.8.8.8 #DNS2


3. Перезапустите интерфейс:
sudo ifdown ens33 && sudo ifup ens33
или службу:
sudo systemctl restart networking

4. Выполните проверки настроек:
ip address show
ip route show


При необходимости удаления компонентов "ifupdown" выполните:
sudo apt-get remove ifupdown
sudo rm -f
/etc/network/interfaces
sudo rm -rf /etc/network/interfaces.d/*
sudo rm -f /etc/resolv.conf


Настройка сетевой подсистемы "NetworkManager" (используется по умолчанию при установке с графическим интерфейсом).

1. Установите NetworkManager:
sudo apt-get install network-manager

2. Включите и запустите службу:
sudo systemctl enable --now NetworkManager

3. Настройте NetworkManager для управления всеми интерфейсами, для этого отредактируйте файл "/etc/NetworkManager/NetworkManager.conf": в секции [ifupdown] измените значение параметра:
managed=true

4. Сконфигурируйте сетевой интерфейс с помощью терминальной утилиты "nmtui" или в командной строке утилитой "nmcli":

Просмотр:
nmcli con show   #Просмотр сетевых подключений
nmcli dev show ens33  
#Просмотр активного соединения на "ens33"
nmcli con show 'Wired connection 1'  
#Просмотр параметров подключения

Настройки для DHCP:
nmcli con mod 'Wired connection 1' ipv4.method auto
nmcli con mod 'Wired connection 1' ipv4.addresses "" ipv4.gateway ""
nmcli con mod 'Wired connection 1' ipv4.dns ""
nmcli con mod 'Wired connection 1' ipv4.routes ""
nmcli con up 'Wired connection 1'


Настройки для статического IP:
nmcli con mod 'Wired connection 1' ipv4.addresses 192.168.0.5/24
nmcli con mod 'Wired connection 1' ipv4.gateway 192.168.0.1
nmcli con mod 'Wired connection 1' ipv4.dns "192.168.0.1 8.8.8.8"
nmcli con mod 'Wired connection 1' +ipv4.routes "192.168.10.0/24 192.168.0.254"
nmcli con mod 'Wired connection 1' ipv4.method manual
nmcli con up 'Wired connection 1'


5. Выполните проверки настроек:
ip address show
ip route show



При необходимости удаления компонентов "NetworkManager" выполните:
sudo apt-get remove network-manager
sudo rm -rf /etc/NetworkManager/
sudo rm -rf /var/lib/NetworkManager/
sudo rm -f /etc/resolv.conf


Настройка сетевой подсистемы "systemd-networkd".

1. Служба "systemd-networkd" уже входит в "systemd", установите только "systemd-resolved", добавьте их в автозапуск:
sudo apt-get install systemd-resolved
sudo systemctl enable --now systemd-networkd
sudo systemctl enable --now systemd-resolved


2. Создайте файл конфигурации (расширение ".network" обязательно):
sudo nano /etc/systemd/network/20-wired.network

Настройки для DHCP:

[Match]
Name=ens33
[Network]
DHCP=ipv4



Настройки для статического IP:

[Match]
Name=ens33
[Network]
Address=192.168.0.5/24
Gateway=192.168.0.1
DNS=192.168.0.1 8.8.8.8
[Route]
Destination=192.168.10.0/24
Gateway=192.168.0.254
Metric=10   #Опционально


3. Перезапустите или перегрузите службу:
sudo systemctl restart systemd-networkd
или
sudo networkctl reload

4. Выполните проверки настроек:
ip address show
ip route show
resolvectl



При необходимости удаления компонентов "systemd-networkd" выполните:
sudo systemctl disable --now systemd-networkd systemd-resolved
sudo apt-get remove systemd-
resolved
sudo rm -rf /etc/systemd/network/*

sudo rm -f /etc/resolv.conf


Общие рекомендации!!!
Для простых конфигураций серверов и виртуальных машин используйте "systemd-networkd", все остальные модули рекомендуется в этом случае удалить:
sudo apt-get remove ifupdown network-manager dhcpcd-base
sudo rm -f /etc/network/interfaces
sudo rm -rf /etc/network/interfaces.d/*
sudo rm -rf /etc/NetworkManager/
sudo rm -rf /var/lib/NetworkManager/
sudo rm -f /etc/resolv.conf

понедельник, 3 ноября 2025 г.

Windows: Подключение системы хранения данных Huawei по протоколу Dataturbo

Настройку выполняем следующим образом:

1. На СХД (системе хранения данных) выполняем предварительные настройки файловой системы:

1.1 Создаем пользователя для авторизации по протоколу "Dataturbo": переходим "vStore Service->vStores". Выбираем ваш vStore (System_vStore по умолчанию).


Перходим на вкладку "User Management" и создаем пользователя (например "dataturbo"). Указываем роль "vStore DataTurbo administrator".


1.2 Создаем логический порт: переходим "Services->Logical Ports". Выбираем ваш vStore (System_vStore по умолчанию).



Создаем новый порт "DataTurbo_Port", указываем роль "Service" и протокол "DataTurbo", настраиваем IP адрес, маску, шлюз для порта. Устанавливаем тип порта и режим отказоустойчивости.


1.3 Создаем файловую систему: переходим "Services->File Systems". Выбираем ваш vStore (System_vStore по умолчанию).



Создаем файловую систему "DataTurbo_FS", указываем стиль безопасности "NTFS", размер тома и протокол общего доступа "DataTurbo".


1.4 Настраиваем доступ к файловой системе: кликаем на нашей "DataTurbo_FS" и переходим во вкладку "Shares", затем "DataTurbo Shares".


Выбираем нашу шару "/DataTurbo_FS/" и добавляем права ранее созданному пользователю "dataturbo" на чтение и запись.


2. Устанавливаем драйвер "OceanStor_DataTurbo_1.3.0_Windows.zip" на вашу ОС Windows:

2.1 Скачиваем "OceanStor_DataTurbo_1.3.0_Windows.zip" и распаковываем архив во временную директорию, запускаем "cmd" с повышенными привилегиями и переходим туда.

2.2 Выполняем "install.bat".

2.3 В процессе установки указываем:
- директорию установки драйвера;
- уровень производительности в зависимости от доступной свободной оперативной памяти ОС (от 0 до 3);
- имя пользователя для функционирования службы драйвера (по умолчанию - "dataturbo");
- имя пользователя для управления и наблюдения за службой драйвера (по умолчанию - "dataturbo_mgmt") и пароль от него.


2.4 Закрываем окно консоли после установки выполняем перезагрузку ОС.


3. Подключаем шару по протоколу "DataTurbo":

3.1 Создаем директорию внутри ОС Windows, куда впоследствии будет ссылаться том на СХД (например, "C:\dataturbo_fs").

3.2 Открываем консоль и проверяем работоспособность утилиты "dataturbo" (например, выполняем "dataturbo show version").

3.3 Выполняем подключение к логическому порту на СХД, используем DNS имя или IP, настроенный в предыдущем пункте:
dataturbo create storage_object storage_name=OceanProtect ip_list=192.168.1.20

Просматриваем подключенные СХД:
dataturbo show storage_object

Для удаления СХД:
dataturbo delete storage_object storage_name=OceanProtect

3.4 Подключаем шару в ранее созданную директорию:
dataturbo mount storage_object storage_name=OceanProtect filesystem_name=/DataTurbo_FS/ mount_dir=C:\dataturbo_fs

Просматриваем текущие подключенные шары:
dataturbo show mount_dir

Чтобы размонтировать шару (в случае необходимости):
dataturbo umount mount_dir=C:\dataturbo_fs

3.5 После перезагрузки понадобится выполнить повторное монтирование шары. Чтобы автоматизировать данный процесс, можно добавить в автозагрузку следующий скрипт:

@echo off
timeout /t 5
dataturbo mount storage_object storage_name=OceanProtect filesystem_name=/DataTurbo_FS/ mount_dir=C:\dataturbo_fs

Скрипт должен запускаться от пользователя, который присутствует в "белом" списке драйвера "DataTurbo". Откройте файл "whitelist" (по умолчанию находится в "C:\Program Files\oceanstor\dataturbo\conf") в текстовом редакторе и проверьте, есть ли уже SID вашего пользовательского аккаунта в списке, при отсутствии - добавьте.

среда, 1 октября 2025 г.

Windows: Установка Windows 11 с обоходом проверки TPM и безопасной загрузки

Если вам по определенным причинам необходимо развернуть ОС Microsoft Windows 11 на старом оборудовании или виртуальной машине без использования модуля TPM и функции безопасной загрузки, можно обойти эту преграду во время установки следующим образом.

Как только загрузится мастер установки в графическом интерфейсе, нажмите сочетание клавиш "Shift+F10": появится окошко консоли Windows. Теперь можно набрать команду "regedit" и запустить редактор реестра.

Далее добавим следующие параметры:
1. Создадим новый раздел "HKEY_LOCAL_MACHINES\SYSTEM\Setup\LabConfig".
2. В созданном разделе добавим два параметра типа "DWORD":
"BypassTPMCheck" и "BypassSecureBootCheck".
3. Установим значение данных параметров равным "1".

После изменения реестра закрываем редактор и продолжаем установку ОС Windows 11.