Авария: Во время работы отказал диск
После замены диска сервер необходимо полностью восстановить.
Исходные условия:
• Имеется сервер Ubuntu Server 24.04.
Конфигурация:
• два SSD по 1 ТБ (
• программный RAID1 (mdadm)
• LVM поверх RAID
• файловая система XFS
• сервер предоставляет NFS
• на сервере работает PostgreSQL
• загрузчик GRUB установлен на оба диска
Шаг 1. Проверяем состояние RAID:
Получаем:
Также
Вывод
RAID работает в деградированном режиме.
Шаг 2. Определяем неисправный диск:
Типичный вывод:
Шаг 3. Исключаем диск из RAID
Если он еще виден системой:
После этого
Теперь RAID использует только один диск.
Шаг 4. Замена физического диска
После замены сервер обнаружил новый диск.
Получаем:
Но новый диск пустой.
Шаг 5. Копируем таблицу разделов
Проверяем:
Шаг 6. Меняем GUID разделов
Если GPT:
Иначе возникнет конфликт одинаковых UUID GPT.
Шаг 7. Добавляем диск обратно в RAID
Проверяем:
Будет
Шаг 8. Следим за синхронизацией
Ждем 100%
После окончания: [UU]
Шаг 9. Проверяем состояние RAID
Получаем:
Шаг 10. Проверяем LVM
Все тома должны быть доступны.
Шаг 11. Проверяем файловую систему
Для XFS:
Параметр:
Если ext4:
Шаг 12. Проверяем точки монтирования
Получаем:
Шаг 13. Проверяем PostgreSQL
Должно быть:
Проверяем базы:
Шаг 14. Проверяем NFS
Экспорт должен отображаться.
Шаг 15. Восстанавливаем GRUB
После замены диска загрузчик отсутствует.
Устанавливаем:
Потом:
(для UEFI)
или
для BIOS.
Шаг 16. Проверяем
Если UUID изменился
Затем
Шаг 17. Контрольная проверка
lsblk
mdadm --detail /dev/md0
systemctl status postgresql
systemctl status nfs-server
reboot
После перезагрузки: cat /proc/mdstat
Должно быть: [UU]
/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 : 1RAID работает в деградированном режиме.
Шаг 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 после выполнения:
сервер больше не загружается.
На экране:
Требуется:
• определить причину;
• восстановить загрузку;
• сохранить данные;
• сделать так, чтобы проблема не повторилась.
Что должен сделать администратор
1. Загрузиться со старого ядра
В меню GRUB выбрать:
и загрузить предыдущую версию ядра.
2. Проверить наличие initramfs
Например:
Если initramfs отсутствует:
3. Проверить UUID
Если UUID изменился — исправить.
4. Проверить драйверы
Например RAID-контроллер требует модуль
Проверяем:
Если нет
5. Переустановить GRUB
Итог: Сервер успешно загружается.
Условие: На сервере 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 -u3. Проверить 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 -u5. Переустановить GRUB
grub-install /dev/sda
update-grubИтог: Сервер успешно загружается.
Задача: На сервере неожиданно закончилось место
Условие:
Команда
показывает
Однако
дает всего около 40 ГБ.
Куда исчезло место?
Решение:
Такое происходит, когда удалили большой файл, но процесс продолжает его использовать.
Проверяем:
Например:
Процесс продолжает держать файл открытым.
Освободить место
Можно через:
После завершения процесса место сразу освободится.
Условие:
Команда
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:
Получаем:
Диск перегружен.
Проверить процессы:
Видим:
который читает весь диск.
Решение:
Перенести backup.
Используя
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. Через команду
Вывод покажет список всех смонтированных файловых систем с указанием их типа.
2. Через команду mount или findmnt
Эти команды покажут, какие устройства куда смонтированы и с каким типом ФС.
3. Используя lsblk
Отображает информацию о блочных устройствах, включая тип файловой системы.
4. С помощью
Выводит информацию о типе ФС, UUID и другом
5. Используя file на устройство
Показывает тип содержимого устройства, включая файловую систему.
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-соединения без дополнительных программ.
Например:
Это настоящий HTTP-запрос, выполненный средствами Bash.
Работает и для проверки портов:
Например:
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 "Порт открыт"Читать сжатые файлы без распаковки
Необязательно сначала распаковывать архив, чтобы посмотреть его содержимое.
Для файлов
или читать постранично:
Для поиска по содержимому подойдёт:
Это особенно удобно при работе с архивированными логами, которые могут занимать несколько гигабайт.
Важно:
не покажет содержимое архива в удобном виде. Для файлов .tar.gz
лучше использовать:
чтобы увидеть список файлов, или:
чтобы вывести содержимое конкретного файла без полной распаковки.
Необязательно сначала распаковывать архив, чтобы посмотреть его содержимое.
Для файлов
.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 путь/к/файлучтобы вывести содержимое конкретного файла без полной распаковки.
Можно временно изменить время только для одного процесса.
Или использовать утилиту faketime:
Полезно для тестирования лицензий, сертификатов и логики работы с датами.
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Полезно для тестирования лицензий, сертификатов и логики работы с датами.
Смонтируем каталог в другом месте без копирования
После этого содержимое
Удобно для контейнеров, chroot, резервного копирования и нестандартных сценариев настройки.
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: ошибка в имени устройства может привести к потере данных.