Linux для чайника
19.6K subscribers
86 photos
4 files
79 links
Linux
- Разбор утилит / инструментов
- Новости / факты
- Опросы для проверки знаний, навыков
и многое другое.

Только по вопросам сотрудничества: @altmainf

Регистрация в перечне РКН https://clck.ru/3EpL9L
Download Telegram
Авария: Во время работы отказал диск /dev/sdb.
После замены диска сервер необходимо полностью восстановить.

Исходные условия:
• Имеется сервер Ubuntu Server 24.04.
Конфигурация:
• два SSD по 1 ТБ (/dev/sda, /dev/sdb)
• программный RAID1 (mdadm)
• LVM поверх RAID
• файловая система XFS
• сервер предоставляет NFS
• на сервере работает PostgreSQL
• загрузчик GRUB установлен на оба диска

Шаг 1. Проверяем состояние RAID: cat /proc/mdstat
Получаем:
md0 : active raid1 sda1[0]
976630336 blocks [2/1] [U_]

U = диск исправен _ = диск отсутствует
Также
mdadm --detail /dev/md0
Вывод
State : clean, degraded
Active Devices : 1
Working Devices : 1
Failed Devices : 1

RAID работает в деградированном режиме.

Шаг 2. Определяем неисправный диск: smartctl -a /dev/sdb
Типичный вывод:
SMART overall-health self-assessment test result: FAILED или I/O error

Шаг 3. Исключаем диск из RAID
Если он еще виден системой:
mdadm /dev/md0 --fail /dev/sdb1
После этого
mdadm /dev/md0 --remove /dev/sdb1
Теперь RAID использует только один диск.

Шаг 4. Замена физического диска
После замены сервер обнаружил новый диск.
lsblk
Получаем:
sda
sdb

Но новый диск пустой.

Шаг 5. Копируем таблицу разделов
sgdisk -R=/dev/sdb /dev/sda
Проверяем: fdisk -l

Шаг 6. Меняем GUID разделов
Если GPT: sgdisk -G /dev/sdb
Иначе возникнет конфликт одинаковых UUID GPT.

Шаг 7. Добавляем диск обратно в RAID
mdadm /dev/md0 --add /dev/sdb1
Проверяем: cat /proc/mdstat
Будет
md0 : active raid1 sdb1[2] sda1[0]
recovery


Шаг 8. Следим за синхронизацией
watch cat /proc/mdstat
Ждем 100%
После окончания: [UU]

Шаг 9. Проверяем состояние RAID
mdadm --detail /dev/md0
Получаем:
State : clean
Active Devices : 2


Шаг 10. Проверяем LVM
pvdisplay
vgdisplay
lvdisplay

Все тома должны быть доступны.

Шаг 11. Проверяем файловую систему
Для XFS: xfs_repair -n /dev/vg_data/lv_pg
Параметр: -n означает только проверку без изменений.
Если ext4: fsck -f

Шаг 12. Проверяем точки монтирования
mount или df -h
Получаем:
/dev/mapper/vg_data-lv_root
/dev/mapper/vg_data-lv_pg
/dev/mapper/vg_data-lv_nfs


Шаг 13. Проверяем PostgreSQL
systemctl status postgresql или pg_isready
Должно быть: accepting connections
Проверяем базы: sudo -u postgres psql
SELECT now();


Шаг 14. Проверяем NFS
systemctl status nfs-server
showmount -e localhost

Экспорт должен отображаться.

Шаг 15. Восстанавливаем GRUB
После замены диска загрузчик отсутствует.
Устанавливаем: grub-install /dev/sdb
Потом: update-grub Проверяем: efibootmgr -v
(для UEFI)
или
grub-install /dev/sda
grub-install /dev/sdb

для BIOS.

Шаг 16. Проверяем mdadm.conf
cat /etc/mdadm/mdadm.conf

Если UUID изменился
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
Затем update-initramfs -u

Шаг 17. Контрольная проверка

cat /proc/mdstat
[UU]
lsblk
mdadm --detail /dev/md0
systemctl status postgresql
systemctl status nfs-server
reboot
После перезагрузки: cat /proc/mdstat
Должно быть: [UU]
Задача: Сервер перестал загружаться после обновления ядра
Условие: На сервере Ubuntu 24.04 после выполнения:
apt update
apt upgrade
reboot

сервер больше не загружается.
На экране:
Kernel panic - not syncing:
VFS: Unable to mount root fs on unknown-block(0,0)

Требуется:
• определить причину;
• восстановить загрузку;
• сохранить данные;
• сделать так, чтобы проблема не повторилась.

Что должен сделать администратор
1. Загрузиться со старого ядра
В меню GRUB выбрать: Advanced options
и загрузить предыдущую версию ядра.

2. Проверить наличие initramfs
ls /boot
Например:
vmlinuz-6.8.0
initrd.img-6.8.0

Если initramfs отсутствует: update-initramfs -u

3. Проверить UUID

blkid
cat /etc/fstab

Если UUID изменился — исправить.

4. Проверить драйверы
Например RAID-контроллер требует модуль megaraid_sas
Проверяем: lsinitramfs /boot/initrd.img | grep megaraid
Если нет
echo megaraid_sas >> /etc/initramfs-tools/modules
update-initramfs -u


5. Переустановить GRUB
grub-install /dev/sda
update-grub


Итог: Сервер успешно загружается.
Задача: На сервере неожиданно закончилось место
Условие:
Команда df -h
показывает
Filesystem Use%
/dev/sda2 100%

Однако du -sh /*
дает всего около 40 ГБ.

Куда исчезло место?

Решение:
Такое происходит, когда удалили большой файл, но процесс продолжает его использовать.
Проверяем: lsof | grep deleted
Например:
java
logfile deleted
30G

Процесс продолжает держать файл открытым.
Освободить место
Можно через: systemctl restart java или kill PID

После завершения процесса место сразу освободится.
Задача: Сервер отвечает очень медленно
CPU почти не загружен.
RAM свободна.
Но приложения работают крайне медленно.

Что проверить
I/O: iostat -x 1
Получаем:
util 100%
await 1500 ms

Диск перегружен.
Проверить процессы: iotop
Видим:
backup.sh

который читает весь диск.

Решение:
Перенести backup.
Используя ionice или nice
Поиск файлов по нескольким расширениям

С помощью команды find вместе с флагом -o (логическое ИЛИ) можно искать файлы по нескольким расширениям:

find /path/to/search -type f \( -name "*.txt" -o -name "*.log" \)

/path/to/search — это каталог, в котором вы хотите начать поиск.
-type f указывает, что вы ищете файлы (а не каталоги).
-name "*.txt" и -name "*.log" — это два условия, разделенные оператором -o. При этом выполняется поиск файлов с расширением .txt или .log.
Поиск файлов с определенными настройками доступа

Команда find в сочетании с флагом -perm позволяет искать файлы на основе их настроек разрешений.

Чтобы найти файлы, у которых есть разрешения на чтение (r), запись (w) и выполнение (x) для владельца:
find /path/to/search -type f -perm -700

Поиск файлов по разрешению и режиму доступа:
find /path/to/search -type f -perm mode

Чтобы найти файлы, у которых нет прав на запись для группы и других:
find /path/to/search -type f ! -perm /go+w
Узнаем файловую систему (тип файловой системы) в Linux

1. Через команду df -T
Вывод покажет список всех смонтированных файловых систем с указанием их типа.

2. Через команду mount или findmnt
mount | grep '^/dev' или: findmnt -T /
Эти команды покажут, какие устройства куда смонтированы и с каким типом ФС.

3. Используя lsblk
lsblk -f
Отображает информацию о блочных устройствах, включая тип файловой системы.

4. С помощью
sudo blkid
Выводит информацию о типе ФС, UUID и другом

5. Используя file на устройство
sudo file -s /dev/sda1
Показывает тип содержимого устройства, включая файловую систему.
Запускаем процесс и отцепляем его от терминала

Например: python3 server.py &
Теперь сделай: disown

После закрытия терминала процесс продолжит работать, даже без nohup.
Запускаем команду без сохранения в истории

Если не хочешь, чтобы команда попала в ~/.bash_history, поставь перед ней пробел (если включена опция HISTCONTROL=ignorespace).

sudo apt install something


Проверяем настройку: echo $HISTCONTROL

Если вывод содержит ignorespace или ignoreboth, трюк работает.
/proc как "рентген" системы

Например: cat /proc/cpuinfo или cat /proc/meminfo

Но самое интересное: cat /proc/$(pidof firefox)/maps
Покажет все участки памяти процесса Firefox.

Ещё полезно: ls -l /proc/$$/fd
Это список всех файлов, сокетов и каналов, которые открыты текущим процессом оболочки.
Запусти команду с полным "сухим" окружением

Иногда нужно проверить, не влияют ли переменные окружения.

env -i bash --noprofile --norc


Получаем практически чистую оболочку:
без алиасов;
без переменных окружения;
без .bashrc;
без .profile.
Это отличный способ искать ошибки в конфигурации системы.
Выполнение команд в несколько потоков с xargs

По умолчанию команды обрабатываются последовательно. Если задача не зависит от порядка выполнения, её можно распараллелить и задействовать сразу несколько ядер процессора.
Например: seq 1 100 | xargs -P8 -I{} echo {}

Параметр -P8 разрешает одновременно запускать до 8 процессов, а -I{} подставляет каждое значение на место {}.

Более практичный пример — сжатие нескольких файлов:
find . -name "*.log" | xargs -P4 -I{} gzip {}
Сразу четыре файла будут сжиматься параллельно, что заметно ускоряет обработку на многоядерных процессорах.

Когда пригодится: массовая обработка файлов, конвертация изображений, резервное копирование, запуск независимых скриптов.
Bash умеет открывать TCP-соединения без дополнительных программ.

Например:
exec 3<>/dev/tcp/google.com/80
echo -e "GET / HTTP/1.1\r\nHost: google.com\r\n\r\n" >&3
cat <&3

Это настоящий HTTP-запрос, выполненный средствами Bash.

Работает и для проверки портов:
echo >/dev/tcp/192.168.1.1/22 && echo "Порт открыт"
Читать сжатые файлы без распаковки

Необязательно сначала распаковывать архив, чтобы посмотреть его содержимое.
Для файлов .gz можно использовать: zcat logfile.gz
или читать постранично: zless logfile.gz

Для поиска по содержимому подойдёт: zgrep ERROR logfile.gz

Это особенно удобно при работе с архивированными логами, которые могут занимать несколько гигабайт.

Важно:

less archive.tar.gz
не покажет содержимое архива в удобном виде. Для файлов .tar.gz
лучше использовать: tar -tf archive.tar.gz
чтобы увидеть список файлов, или: tar -xOf archive.tar.gz путь/к/файлу
чтобы вывести содержимое конкретного файла без полной распаковки.
Можно временно изменить время только для одного процесса.

LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1 \
FAKETIME="2035-01-01 12:00:00" date


Или использовать утилиту faketime:
faketime "2035-01-01" ./program

Полезно для тестирования лицензий, сертификатов и логики работы с датами.
Смонтируем каталог в другом месте без копирования

mount --bind /home/user/projects /mnt/projects

После этого содержимое /home/user/projects будет доступно и через /mnt/projects.

Удобно для контейнеров, chroot, резервного копирования и нестандартных сценариев настройки.
Узнать, какие файлы открывает программа

Если интересно, что происходит «под капотом» при запуске приложения, воспользуйтесь strace.

strace -e openat firefox


Опция -e openat выводит только системные вызовы открытия файлов, отбрасывая тысячи других операций.

В выводе можно увидеть, какие библиотеки, шрифты, конфигурационные файлы и другие ресурсы пытается открыть программа.

Например:
openat(AT_FDCWD, "/etc/hosts", O_RDONLY) = 3
openat(AT_FDCWD, "/usr/lib/libgtk-3.so", O_RDONLY) = 4


Отличный инструмент для диагностики, если приложение не запускается или сообщает, что не может найти какой-либо файл.
Быстро создаем RAM-диск

sudo mount -t tmpfs -o size=2G tmpfs /mnt/ramdisk


Все файлы в /mnt/ramdisk будут храниться только в оперативной памяти, что обеспечивает очень высокую скорость работы. После перезагрузки содержимое исчезнет. Это удобно для временных файлов, сборки проектов и тестирования.
Следим за изменениями в папке в реальном времени

Установи inotify-tools и выполни:
inotifywait -m ~/Downloads

Теперь любое создание, удаление, переименование или изменение файлов будет сразу отображаться в терминале.
Отлично подходит для автоматизации и написания скриптов.
Копируем диск по сети одной командой

Без создания промежуточного образа

На принимающей машине: nc -l 9000 | dd of=disk.img

На отправляющей: dd if=/dev/sda | nc <IP_получателя> 9000

Так можно передавать целые диски или разделы напрямую по сети.
Внимательнее к dd: ошибка в имени устройства может привести к потере данных.