BashTex | Linux
Відкрити в Telegram
Авторский канал для тех, кто хочет глубже погрузиться в мир Linux. Подойдет для разработчиков, системных администраторов и DevOps Реклама: @dad_admin
Показати більше2 524
Підписники
-224 години
-67 днів
Немає даних30 день
Архів дописів
2 524
Сравнение производительности: grep / awk / sed / perl
Когда дело доходит до обработки текста в Linux, у нас есть классическая "великая четвёрка": grep, awk, sed, perl. Все они умеют искать и преобразовывать строки, но что выбрать, если важна производительность?
⭐️ Тест: кто быстрее?
Возьмём файл на 1 млн строк (logs.txt) и задачу - найти строки, содержащие "ERROR" и вывести их.
# 1. grep — специализируется на поиске
time grep 'ERROR' logs.txt
# 2. awk — универсален, но чуть медленнее grep
time awk '/ERROR/' logs.txt
# 3. sed — может искать, но не для этого заточен
time sed -n '/ERROR/p' logs.txt
# 4. perl - мощь и регулярки, но запускается дольше
time perl -ne 'print if /ERROR/' logs.txt
🕛 Результаты (примерные):
Команда Время (сек) Комментарий grep 0.18 - Самый быстрый в чистом поиске awk 0.25 - Универсал, чуть медленнее sed 0.30 - Не лучший для просто поиска perl 0.35 - 0.50 Мощно, но медленно стартует🌟 Что важно помнить:
grep - лучший выбор для быстрого поиска. Используй grep -F (fixed strings) для ещё большей скорости. awk - когда нужна логика: фильтрация, подсчёты, агрегирование. sed - идеально для простых замен (особенно sed -i), но не лучший инструмент для поиска. perl - тянет даже сложнейшие регулярки и постобработку, но стоит дороже по времени запуска.🌟 Хитрости: Для поиска без регулярных выражений: 1.
grep -F "ERROR" → быстрее, чем обычный grep.
2. Используй LC_ALL=C или LANG=C для ускорения поиска (отключает локализацию):
LC_ALL=C grep 'ERROR' logs.txt
3. Объединяй:
grep 'ERROR' logs.txt | awk '{print $1}' # вытащить дату, например
BashTex 📱 #linux #utils2 524
Умная работа с PID: поиск и завершение зависших процессов
Иногда процессы зависают - висят в D (disk sleep) или Z (zombie), потребляют CPU без пользы, или держат файлы, которые нужно удалить. Просто killall - грубо и может снести лишнее. Давайте сделаем это умнее.
▪️ Задача:
Найти и безопасно завершить только зависшие или чрезмерно "прожорливые" процессы, избегая случайных убийств важных задач.
▪️ Подход:
Сканируем ps на предмет "подозрительных" состояний. Проверяем длительность жизни процесса. Ограничиваем по имени, CPU или статусу. Включаем dry-run перед действием.▪️ Пример скрипта:
#!/usr/bin/env bash
set -euo pipefail
PATTERN="python" # Имя процесса (или часть имени)
MAX_CPU=80 # Максимально допустимая загрузка CPU
MAX_AGE=3600 # В секундах: 1 час
DRY_RUN=true # Безопасный режим
echo "Поиск процессов по шаблону: $PATTERN"
ps -eo pid,etime,pcpu,comm --sort=-pcpu | awk -v pattern="$PATTERN" -v max_cpu="$MAX_CPU" -v max_age="$MAX_AGE" -v dry_run="$DRY_RUN" '
function hms_to_sec(s, t, n, h, m) {
gsub("-", "", s)
n = split(s, t, /[:-]/)
if (n == 3) { h = t[1]; m = t[2]; s = t[3] }
else if (n == 2) { h = 0; m = t[1]; s = t[2] }
else { h = 0; m = 0; s = t[1] }
return h * 3600 + m * 60 + s
}
NR>1 && $4 ~ pattern {
age = hms_to_sec($2)
cpu = $3
if (cpu > max_cpu || age > max_age) {
printf "[!] Найден подозрительный процесс: PID=%s CPU=%.1f%% AGE=%ss CMD=%s\n", $1, cpu, age, $4
if (dry_run == "false") {
system("kill -9 " $1)
print "[x] Завершен PID=" $1
} else {
print "[i] Dry run: процесс НЕ завершен"
}
}
}
▪️ Что умеет:
Выборочно завершает процессы с перегрузкой по CPU Проверяет "возраст" процессов по etime Работает в dry-run режиме по умолчанию Прост в кастомизации: ищи по имени, статусу, времениBashTex 📱 #bash
2 524
Создание своего systemd-сервиса для скрипта
Если у тебя есть полезный скрипт, который должен запускаться как сервис (например, при старте системы или по крону не подходит) - самое время подружить его с systemd.
1️⃣ Подготовка скрипта. Убедись, что скрипт исполняемый и логирует всё в файл:
#!/bin/bash
echo "$(date): Скрипт запущен" >> /var/log/myscript.log
# Здесь твоя логика
Сохрани его, например, в /usr/local/bin/myscript.sh
И не забудь дать права:
chmod +x /usr/local/bin/myscript.sh
2️⃣ Юнит-файл systemd. Создай сервис:
sudo nano /etc/systemd/system/myscript.service
Пример содержимого:
[Unit]
Description=Мой кастомный скрипт
After=network.target
[Service]
ExecStart=/usr/local/bin/myscript.sh
Restart=on-failure
User=root
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
3️⃣ Активация и запуск
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable myscript.service
sudo systemctl start myscript.service
Проверка:
systemctl status myscript.service
🌟 Зачем это вообще?
Скрипт запускается при старте Контролируется systemd (перезапуск, статус, логи) Удобная интеграция в системную инфраструктуру🌟 Советы:
Нужен таймер? Используй myscript.timer
Хочешь лог в journalctl? - уже встроено
Скрипт должен зависеть от другого сервиса? Укажи в After= и Requires=
BashTex 📱 #linux #utils2 524
В России можно посещать IT-мероприятия хоть каждый день: как оффлайн, так и онлайн
Но где их находить? Как узнавать о них раньше, чем когда все начнут выкладывать фотографии оттуда?
Переходите на канал IT-Мероприятия России. В нём каждый день анонсируются мероприятия со всех городов России
📆 в канале размещаются как онлайн, так и оффлайн мероприятия;
👩💻 можно найти ивенты по любому стеку: программирование, frontend-backend разработка, кибербезопасность, дата-аналитика, osint, devops и другие;
🎙 разнообразные форматы мероприятий: митапы с коллегами по цеху, конференции и вебинары с известными опытными специалистами, форумы и олимпиады от важных представителей индустрии и многое другое
А чтобы не искать по разным форумам и чатам новости о предстоящих ивентах:
🚀 IT-мероприятия России — подписывайся и будь в курсе всех предстоящих мероприятий!
2 524
Фоновая очередь задач на Bash с контролем параллелизма
Когда вы автоматизируете инфраструктуру, часто приходится запускать десятки или сотни задач - но неконтролируемый параллелизм может уронить систему. Вместо этого - реализуем контролируемую очередь, ограничивающую количество одновременных процессов.
▪️ Идея:
Создаём продвинутую фоновую очередь на Bash, с: ограничением на количество параллельных задач; логированием статуса выполнения; возможностью динамически подставлять команды.▪️ Пример:
#!/usr/bin/env bash
set -euo pipefail
MAX_PARALLEL=4
LOGFILE="./queue.log"
TASKS=(
"sleep 3 && echo task1"
"sleep 2 && echo task2"
"sleep 1 && echo task3"
"sleep 4 && echo task4"
"sleep 5 && echo task5"
"sleep 2 && echo task6"
)
run_task() {
local cmd="$1"
local id=$(date +%s%N)
echo "[$id] START: $cmd" >> "$LOGFILE"
eval "$cmd"
local status=$?
echo "[$id] END: $cmd (exit=$status)" >> "$LOGFILE"
return $status
}
active_jobs() {
jobs -rp | wc -l
}
for task in "${TASKS[@]}"; do
run_task "$task" &
# Ждём, если число фоновых задач превысило лимит
while (( $(active_jobs) >= MAX_PARALLEL )); do
sleep 0.2
done
done
wait
echo "Все задачи завершены. Лог: $LOGFILE"
▪️ Объяснение:
jobs -rp выводит только PID'ы активных фоновых процессов.
run_task() логирует начало, завершение и статус команды.
Используем eval - аккуратно, если команды приходят из недоверённого источника.
🌟 Такой подход можно использовать в:
CI/CD пайплайнах без внешних тулов; миграции данных или резервном копировании; массовой обработке видео/изображений; сетевом сканировании и мониторинге.BashTex 📱 #bash
2 524
Сканирование сети и вывод в CSV с nmap
Когда нужно быстро получить список активных хостов и открытых портов в сети - nmap, то что нужно. Особенно, если нужно сохранить результаты в CSV для анализа или импорта куда-нибудь (например, в Excel, LibreOffice, Grafana и т.д)
📱 Пример скрипта:
#!/bin/bash
NETWORK="192.168.1.0/24"
OUTPUT="scan_result.csv"
# Заголовок CSV
echo "IP,Hostname,Ports" > "$OUTPUT"
# Сканируем сеть
nmap -sP "$NETWORK" -oG - | awk '/Up$/{print $2}' | while read ip; do
HOST=$(nmap -sL "$ip" | grep "Nmap scan report" | awk '{print $NF}')
PORTS=$(nmap -Pn -p- --min-rate=1000 --open "$ip" | awk '/^[0-9]+\/tcp/ {printf "%s; ", $1}')
echo "$ip,$HOST,\"$PORTS\"" >> "$OUTPUT"
done
▪️ Что делает скрипт:
сканирует активные устройства в сети 192.168.1.0/24 для каждого IP делает порт-скан сохраняет IP, hostname и список открытых портов в CSVBashTex 📱 #bash #utils
2 524
Массивы и ассоциативные массивы
Если ты до сих пор используешь только переменные в Bash, пора прокачаться - массивы и ассоциативные массивы дают прокачку в области автоматизации.
▪️ Обычные массивы. Когда нужен список значений, например, список баз данных:
databases=("db1" "db2" "db3")
for db in "${databases[@]}"; do
echo "Делаю бэкап $db..."
pg_dump "$db" > "$db.sql"
done
▪️ Ассоциативные массивы. Когда нужно сопоставить ключ → значение, например: сервис и его порт.
declare -A services
services=(
[nginx]=80
[ssh]=22
[postgres]=5432
)
for service in "${!services[@]}"; do
port=${services[$service]}
echo "$service работает на порту $port"
done
▪️ Реальное применение
📍 Мониторинг процессов:
declare -A procs=( [nginx]="nginx" [db]="postgres" [ssh]="sshd" )
for name in "${!procs[@]}"; do
pgrep -x "${procs[$name]}" > /dev/null || echo "$name не работает!"
done
📍 Распределённая отправка по email:
emails=(user1@example.com user2@example.com user3@example.com)
for email in "${emails[@]}"; do
echo "Привет!" | mail -s "Уведомление" "$email"
done
BashTex 📱 #linux #utils2 524
Циклический дамп баз данных и удаление старых бэкапов
Резервные копии баз данных - вещь критически важная. Но без автоматизации быстро превращаются в хаос. Сегодня про то, как настроить скрипт, который:
делает дамп базы с меткой времени
сохраняет в указанный каталог
удаляет старые бэкапы по заданной политике (например, старше 7 дней)
▪️ Пример для PostgreSQL:
#!/bin/bash
set -euo pipefail
DB_NAME="mydb"
BACKUP_DIR="/var/backups/postgres"
DAYS_TO_KEEP=7
DATE_SUFFIX=$(date +%Y-%m-%d_%H-%M-%S)
FILENAME="$BACKUP_DIR/${DB_NAME}_$DATE_SUFFIX.sql.gz"
# Создание дампа
pg_dump "$DB_NAME" | gzip > "$FILENAME"
# Удаление старых бэкапов
find "$BACKUP_DIR" -name "${DB_NAME}_*.sql.gz" -mtime +$DAYS_TO_KEEP -delete
Для MySQL/MariaDB подойдёт mysqldump "$DB_NAME"
▪️ Дополнительно, добавить исполнение скрипта в cron:
0 3 * * * /path/to/backup.sh — ежедневный бэкап в 3:00
BashTex 📱 #bash #utils2 524
Удобное копирование файлов в облако
Если ты хочешь работать с Google Drive, Yandex.Disk, Dropbox, S3 и десятками других облаков так, будто это обычная файловая система - тебе нужен
rclone. Это утилита для синхронизации, копирования, шифрования и резервного копирования файлов в облачные хранилища.
Поддерживает более 60 облаков, включая: Google Drive, OneDrive, Яндекс Диск, FTP/SFTP и даже локальные диски.
⚙️ Установка
sudo apt install rclone #Ubuntu/Debian
Или вручную:
```bash
curl https://rclone.org/install.sh | sudo bash
▪️ Быстрая настройка (на примере Google Drive)
rclone config
n - создать новое подключение
1. Введи имя, например gdrive
2. Выбери тип (drive для Google Drive)
3. Авторизуй через браузер
Готово!
▪️ Основные команды
📍 Копировать файлы в облако:
rclone copy ./backup gdrive:/my_backups
📍 Синхронизация (удаляет на целевой стороне лишнее):
rclone sync ./media gdrive:/media --progress
📍 Копирование из облака:
rclone copy gdrive:/media ./local_copy
📍 Просмотр файлов в облаке:
rclone ls gdrive:/my_backups
▪️ Продвинутые фишки
📍 Шифрование:
Создай новый remote с типом crypt, укажи как базу - существующий gdrive:encrypted/
Теперь все файлы будут шифроваться на лету, прямо перед отправкой.
📍 Сжатие + передача:
tar cz folder | rclone rcat gdrive:archive.tar.gz
📍 Тест пропускной способности:
rclone bench
📍 Мониторинг через Web UI:
rclone rcd --rc-web-gui
🌟 Зачем использовать rclone?
Удобный CLI-стиль как у rsync Работает с почти любым облаком Поддержка крипты, логирования, многопоточности Можно использовать в скриптах, cron, backup-сценариях Идеален для сервера без GUIRclone = rsync для облаков. BashTex 📱 #linux #utils
2 524
Простая работа с фоновыми процессами через пайпы
coproc - один из недооценённых инструментов в Bash. Он позволяет создавать фоновые процессы с доступом к их вводу/выводу через переменные. То есть, ты получаешь легкий способ запускать команды асинхронно и при этом взаимодействовать с ними.
🌟 Зачем нужен coproc?
Иногда тебе нужно запустить процесс в фоне, при этом:
1. Посылать ему данные (stdin)
2. Читать от него результат (stdout)
3. Не колхозить с mkfifo, & и exec
Вот тут и заходит coproc.
▪️ Синтаксис
coproc ИМЯ { команда; }
После этого у тебя появятся:
${ИМЯ[0]} - дескриптор для чтения (stdout команды)
${ИМЯ[1]} - дескриптор для записи (stdin команды)
▪️ Пример 1: диалог с bc
coproc CALC { bc -l; }
echo "2^10" >&"${CALC[1]}"
read -r result <&"${CALC[0]}"
echo "Результат: $result"
bc запустился в фоне, мы отправили ему выражение, получили результат - красиво, без лишних файлов и форков.
▪️ Пример 2: интерактивный grep
coproc GREPPER { grep --line-buffered "error"; }
# Пишем в grep
echo "all ok" >&"${GREPPER[1]}"
echo "fatal error!" >&"${GREPPER[1]}"
# Читаем вывод (будет только строка с error)
read -r matched <&"${GREPPER[0]}"
echo "Найдено: $matched"
▪️ Пример 3: асинхронная обработка большого файла
coproc SORTER { sort > sorted.txt; }
# Пишем данные на сортировку
cat bigfile.csv >&"${SORTER[1]}"
# Ждём завершения
wait "${SORTER_PID}"
echo "Готово!"
BashTex 📱 #bash #utils2 524
✅ Имба: в сети обнаружили мегашпаргалку с самыми полезными нейросетями на все случаи жизни.
Сохраняем самое крутое:
🤩Claude 3.7 Sonnet — мастхев для программистов
🤩Same New — быстрая копия интерфейса сайта
🤩Openrouter — доступ ко всем ИИ
🤩Suno AI — своя музыка с нейросетью
Подпишись и находи для себя крутые нейросети бесплатно: https://t.me/+JXmPkCIqryU1NmQy
2 524
Настройка автообновления сертификатов Let’s Encrypt
Сертификаты Let’s Encrypt действуют всего 90 дней, и если забыть продлить - сайт покажет пользователю страшную ошибку о "небезопасном соединении". Обновлять сертификаты можно автоматически, и делается это за 5 минут.
1️⃣ Установка Certbot. Certbot - официальный клиент для работы с Let's Encrypt.
Для Ubuntu/Debian:
sudo apt update
sudo apt install certbot python3-certbot-nginx # для Nginx
Для Apache:
sudo apt install certbot python3-certbot-apache
2️⃣ Получение сертификата. Пример для Nginx:
sudo certbot --nginx -d example.com -d www.bashtex.com
Для Apache:
sudo certbot --apache -d bashtex.com
Certbot сам пропишет нужные директивы в конфиг веб-сервера и активирует HTTPS.
3️⃣ Проверка автоматического обновления. После установки certbot создает cron или systemd job, которая автоматически проверяет и обновляет сертификаты.
Проверить вручную:
sudo certbot renew --dry-run
Если тест успешен — автообновление работает.
4️⃣ Кастомный крон (если нужен). Если хочешь сделать всё под себя:
sudo crontab -e
Добавь строку:
```bash
0 3 * * * certbot renew --quiet && systemctl reload nginx
Обновление каждый день в 3:00 ночи. После обновления - перезагрузка веб-сервера, чтобы подхватить новый сертификат.
5️⃣ Обновление через hook (если веб-сервер кастомный)
certbot renew --deploy-hook "systemctl reload myserver"
Хук сработает только если сертификат реально обновился - не будет лишних рестартов.
🌟 Как узнать дату истечения сертификата?
openssl x509 -in /etc/letsencrypt/live/example.com/fullchain.pem -noout -enddate
BashTex 📱 #linux #utils2 524
Ограничение ресурсов процессов прямо из терминала
В Linux каждый процесс потребляет ресурсы: память, количество открытых файлов, размер стека и прочее. Чтобы предотвратить вылет системы или несанкционированное потребление ресурсов, используется команда
ulimit.
🌟 Что такое ulimit?
ulimit - это встроенная команда оболочки, которая позволяет устанавливать ограничения на использование ресурсов для текущего сеанса оболочки и всех дочерних процессов.🌟 Что можно ограничить? Команда
ulimit -a покажет текущие лимиты:
ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
open files (-n) 1024
max user processes (-u) 15635
🌟 Часто используемые лимиты
Параметр Назначение -n Количество открытых файлов (очень важно для веб-серверов и баз данных) -u Кол-во пользовательских процессов -f Максимальный размер создаваемого файла -v Максимальный объём виртуальной памяти -s Размер стека -t Максимальное время CPU, сек▪️ Примеры использования 📍 Увеличить лимит открытых файлов:
ulimit -n 65535
📍 Ограничить процесс в использовании CPU временем:
ulimit -t 60
(После 60 секунд использования CPU - процесс будет убит)
📍 Запретить создание файлов > 10 МБ:
ulimit -f $((10 * 1024)) # 10 МБ в блоках по 1K
▪️ Мягкие и жёсткие лимиты
Мягкий лимит - может быть изменён пользователем в рамках жёсткого
Жёсткий лимит - верхняя граница, меняется только от root
📍 Посмотреть:
ulimit -Sn # soft
ulimit -Hn # hard
📍 Установить:
ulimit -Sn 4096
ulimit -Hn 65535
📍 Постоянные настройки. Чтобы лимиты сохранялись после перезагрузки:
/etc/security/limits.conf:
youruser hard nofile 65535
youruser soft nofile 65535
Убедитесь, что PAM обрабатывает лимиты:
/etc/pam.d/common-session
Добавьте:
session required pam_limits.so
⭐️ Когда пригодится?
Высоконагруженные сервисы (nginx, PostgreSQL, Elasticsearch) CI/CD-сборки, которые могут упереться в лимит памяти или процессов Безопасность: ограничение прав скриптов или сторонних процессовBashTex 📱 #linux #utils
2 524
🚨 Готовься к топовой карьере в ИБ с нашим Telegram-каналом! 🔒
Хочешь прокачать навыки в информационной безопасности, узнать реальные зарплаты и уверенно пройти собеседование?
Подписывайся на @training_hard_skill — твой гид в мир ИБ! 💻
Что тебя ждет?🔍
Викторины по ИБ: Тестируй знания с вопросами про Sysmon, Falco, Kubernetes и SIEM и пр. От Junior до Senior!
💰 Зарплатные вилки: Узнай, сколько платят ИБ-специалистам, SOC-аналитикам и DevOps в 2025 году.
📋 Вопросы с собеседований: Реальные кейсы и задачи от топовых компаний. Будь готов к любому вопросу!
Почему мы?
Еженедельные викторины с объяснениями.
Свежие данные по зарплатам из России, Европы и США.
Практические советы, чтобы выделиться на собеседовании.
🔥 Подписывайся на @training_hard_skill и стань мастером ИБ!
👉 Жми: t.me/training_hard_skill
#ИБ #Cybersecurity #SOC #Собеседование #Зарплаты
2 524
Cтраховка от неожиданных ошибок в скриптах
При написании скриптов важно не просто запускать команды, но и гарантировать их корректное выполнение. Без дополнительных опций Bash может пропустить ошибки и продолжить выполнение, что приведёт к неожиданным последствиям. Использование
set -euo pipefail помогает защитить скрипты от ошибок и упростить отладку.
❓ Что делает эта магическая строка?
set -euo pipefail
-e (exit on error) — прерывает скрипт при ошибке любой команды (кроме в if, &&, ||). -u (unset variables) — ошибка при попытке использовать неинициализированную переменную. -o pipefail — ошибка в пайпах, если любая из команд завершится с ошибкой (обычно учитывается только последняя команда).Разберём на примерах. 🚫 Скрипт без set -euo pipefail (пропустит ошибки)
#!/bin/bash
echo "Начинаем работу..."
rm /несуществующий_файл # Ошибка, но скрипт продолжит работу
echo "Удалили файл (на самом деле нет)"
VAR=$(cat $UNKNOWN_VAR) # Неинициализированная переменная (ошибка, но не критично)
ls | grep myfile | awk '{print $1}' # Ошибка в grep или awk не остановит выполнение
echo "Скрипт завершён"
Итог: скрипт продолжает работать, даже если что-то пошло не так.
✔️ Скрипт с set -euo pipefail (контроль ошибок)
#!/bin/bash
set -euo pipefail
echo "Начинаем работу..."
rm /несуществующий_файл # Скрипт сразу прервётся из-за ошибки
echo "Удалили файл"
VAR=$(cat $UNKNOWN_VAR) # Ошибка: переменная не объявлена
ls | grep myfile | awk '{print $1}' # Ошибка в любой команде пайпа приведёт к остановке
echo "Скрипт завершён"
Итог: скрипт остановится сразу при первой же ошибке, не допуская некорректного выполнения.
⭐️ Где это особенно полезно?
Бэкап-скрипты (чтобы не создать пустой бэкап, если команда провалилась). Скрипты развёртывания (чтобы не получить систему в непредсказуемом состоянии). Автоматизация обновлений (чтобы обновление не зависло в неизвестном месте).❗️ Когда set -euo pipefail может мешать? Иногда ошибки могут быть ожидаемыми и не критичными. Например, если файл может отсутствовать, но это не должно останавливать выполнение:
rm myfile.txt || true # Явно игнорируем ошибку
Или если команда в пайпе не всегда должна возвращать код 0:
set +o pipefail # Отключаем pipefail временно
ls | grep myfile | awk '{print $1}'
set -o pipefail # Включаем обратно
BashTex 📱 #linux #utils2 524
Развёртывание Linux по сети с PXE
Когда нужно установить Linux на множество серверов или ПК без USB-флешек и дисков, на помощь приходит PXE (Preboot Execution Environment) - загрузка ОС по сети. PXE позволяет запустить установщик Linux прямо из сети, что особенно удобно в дата-центрах, офисах и лабораториях.
🌟 Как это работает?
Компьютер включается и запрашивает сетевой загрузчик по DHCP. Сервер отвечает и передаёт загрузочный образ через TFTP. Клиент загружает ядро Linux и переходит к установке системы.🌟 Что нужно для развертывания PXE?
DHCP-сервер (для раздачи PXE-загрузчика) TFTP-сервер (для передачи загрузочных файлов) HTTP/NFS-сервер (для хранения установочных файлов)1️⃣ Устанавливаем нужные пакеты. На PXE-сервере установим DHCP, TFTP и Apache (для раздачи образов):
sudo apt update && sudo apt install isc-dhcp-server tftpd-hpa apache2
2️⃣ Настраиваем DHCP для PXE. Редактируем /etc/dhcp/dhcpd.conf:
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.100 192.168.1.200;
option routers 192.168.1.1;
next-server 192.168.1.10; # PXE-сервер
filename "pxelinux.0";
}
Перезапускаем DHCP:
sudo systemctl restart isc-dhcp-server
3️⃣ Настраиваем TFTP-сервер. Указываем папку для загрузки PXE-файлов в /etc/default/tftpd-hpa:
TFTP_DIRECTORY="/srv/tftp"
TFTP_OPTIONS="--secure"
Перезапускаем:
sudo systemctl restart tftpd-hpa
4️⃣ Загружаем PXELINUX. Скачиваем файлы для PXE:
sudo mkdir -p /srv/tftp
cd /srv/tftp
sudo apt install syslinux pxelinux
sudo cp /usr/lib/PXELINUX/pxelinux.0 .
sudo cp /usr/lib/syslinux/modules/bios/* .
Создаём каталог для меню:
mkdir -p /srv/tftp/pxelinux.cfg
5️⃣ Создаём загрузочное меню PXE. Создаём файл /srv/tftp/pxelinux.cfg/default:
DEFAULT menu.c32
PROMPT 0
TIMEOUT 100
ONTIMEOUT install
LABEL install
MENU LABEL Install Ubuntu 22.04
KERNEL ubuntu/vmlinuz
APPEND initrd=ubuntu/initrd.gz netboot=http://192.168.1.10/ubuntu/
6️⃣ Готовим установочные файлы. Загружаем образы на веб-сервер:
sudo mkdir -p /var/www/html/ubuntu
cd /var/www/html/ubuntu
wget http://archive.ubuntu.com/ubuntu/dists/jammy/main/installer-amd64/current/images/netboot/netboot.tar.gz
tar -xzf netboot.tar.gz
Перезапускаем Apache:
sudo systemctl restart apache2
7️⃣ Запускаем установку по сети. Теперь включаем клиентский компьютер, в BIOS включаем PXE-загрузку и выбираем сетевой интерфейс в качестве загрузочного устройства.
Клиент загрузится и начнёт установку Linux прямо из сети.
BashTex 📱 #linux #utils
Вже доступно! Дослідження Telegram за 2025 — головні інсайти року 
