211 lines
11 KiB
Go
211 lines
11 KiB
Go
package linuxmodules
|
||
|
||
import (
|
||
"fmt"
|
||
"rubric/utils"
|
||
)
|
||
|
||
var DisksModule = Module{
|
||
Key: "disks",
|
||
Aliases: []string{"d", "lvm", "raid", "диски"},
|
||
Title: "Диски, файловые системы, LVM и RAID",
|
||
Description: "Темы 22–26: разделы, mount, LVM, программный RAID",
|
||
Run: showDisks,
|
||
}
|
||
|
||
func showDisks() {
|
||
utils.Header("Linux — Диски, файловые системы, LVM и RAID")
|
||
|
||
// ─── 22. Работа с дисками ─────────────────────────────────────
|
||
utils.Section("22. Работа с дисками и разделами")
|
||
|
||
utils.Println(utils.ColorBold + "Именование устройств:" + utils.ColorReset)
|
||
utils.Code(`/dev/sda — первый SATA/SCSI диск
|
||
/dev/sdb — второй диск
|
||
/dev/sda1 — первый раздел первого диска
|
||
/dev/sda2 — второй раздел первого диска
|
||
/dev/nvme0n1 — первый NVMe диск
|
||
/dev/nvme0n1p1 — первый раздел NVMe диска
|
||
/dev/vda — виртуальный диск (KVM/QEMU)
|
||
/dev/xvda — диск Xen
|
||
/dev/loop0 — loop-устройство (ISO-образ)`)
|
||
|
||
utils.Println(utils.ColorBold + "Просмотр дисков и разделов:" + utils.ColorReset)
|
||
utils.Command("lsblk", "дерево блочных устройств")
|
||
utils.Command("lsblk -f", "с типом ФС и UUID")
|
||
utils.Command("lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,FSTYPE", "выбрать столбцы")
|
||
utils.Command("fdisk -l", "все диски и разделы (root)")
|
||
utils.Command("fdisk -l /dev/sda", "разделы диска sda")
|
||
utils.Command("parted -l", "таблицы разделов (GPT и MBR)")
|
||
utils.Command("blkid", "UUID и типы ФС всех устройств")
|
||
utils.Command("blkid /dev/sda1", "UUID конкретного раздела")
|
||
fmt.Println()
|
||
utils.Println(utils.ColorBold + "Разбивка диска (fdisk):" + utils.ColorReset)
|
||
utils.Code(`sudo fdisk /dev/sdb # интерактивная работа с разделами
|
||
|
||
Команды fdisk:
|
||
p — показать таблицу разделов
|
||
n — новый раздел
|
||
d — удалить раздел
|
||
t — изменить тип раздела
|
||
l — список типов разделов
|
||
w — записать изменения (опасно!)
|
||
q — выйти без сохранения
|
||
|
||
# Для GPT-дисков и дисков > 2ТБ — используйте parted или gdisk`)
|
||
|
||
utils.Println(utils.ColorBold + "Создание файловой системы (mkfs):" + utils.ColorReset)
|
||
utils.Command("mkfs.ext4 /dev/sdb1", "создать ext4")
|
||
utils.Command("mkfs.xfs /dev/sdb1", "создать xfs")
|
||
utils.Command("mkfs.ext4 -L data /dev/sdb1", "с меткой 'data'")
|
||
utils.Command("mkswap /dev/sdb2", "создать swap")
|
||
utils.Command("swapon /dev/sdb2", "активировать swap")
|
||
utils.Command("swapon -s", "показать активные swap")
|
||
utils.Command("swapoff /dev/sdb2", "отключить swap")
|
||
fmt.Println()
|
||
utils.Println(utils.ColorBold + "Проверка и восстановление ФС:" + utils.ColorReset)
|
||
utils.Command("fsck /dev/sdb1", "проверить ФС (только при размонтированной!)")
|
||
utils.Command("fsck -n /dev/sdb1", "только проверить, не исправлять")
|
||
utils.Command("e2fsck -f /dev/sdb1", "принудительная проверка ext2/3/4")
|
||
utils.Command("xfs_repair /dev/sdb1", "восстановление XFS")
|
||
|
||
utils.Println(utils.ColorBold + "Использование диска:" + utils.ColorReset)
|
||
utils.Command("df -h", "занятое и свободное место на ФС")
|
||
utils.Command("df -hT", "с типом ФС")
|
||
utils.Command("du -sh /var/log", "размер директории")
|
||
utils.Command("du -sh /*", "размер каждой директории в корне")
|
||
utils.Command("du -sh * | sort -h", "отсортировать по размеру")
|
||
utils.Command("ncdu /var", "интерактивный анализ (нужно установить)")
|
||
|
||
// ─── 23–24. Файловые системы и монтирование ───────────────────
|
||
utils.Section("23–24. Файловые системы и монтирование")
|
||
|
||
utils.Println(utils.ColorBold + "mount — монтирование:" + utils.ColorReset)
|
||
utils.Command("mount", "список всех смонтированных ФС")
|
||
utils.Command("mount /dev/sdb1 /mnt/data", "монтировать раздел")
|
||
utils.Command("mount -t ext4 /dev/sdb1 /mnt", "указать тип ФС")
|
||
utils.Command("mount -o ro /dev/sdb1 /mnt", "только чтение")
|
||
utils.Command("mount -o remount,rw /", "перемонтировать с правами записи")
|
||
utils.Command("mount UUID=abc123 /mnt/data", "монтировать по UUID")
|
||
utils.Command("mount -a", "смонтировать всё из /etc/fstab")
|
||
utils.Command("umount /mnt/data", "размонтировать")
|
||
utils.Command("umount -l /mnt/data", "ленивое размонтирование (когда занято)")
|
||
utils.Command("lsof /mnt/data", "кто использует раздел (если umount отказывает)")
|
||
fmt.Println()
|
||
utils.Println(utils.ColorBold + "/etc/fstab — автомонтирование при старте:" + utils.ColorReset)
|
||
utils.Code(`# Формат: устройство точка_монтирования тип опции dump fsck
|
||
UUID=abc123 /mnt/data ext4 defaults 0 2
|
||
/dev/sdb1 /mnt/data xfs defaults 0 0
|
||
//server/share /mnt/smb cifs credentials=/etc/samba.creds 0 0
|
||
tmpfs /tmp tmpfs defaults,size=2G 0 0
|
||
|
||
# Опции монтирования:
|
||
defaults — rw, suid, exec, auto, nouser, async
|
||
ro — только чтение
|
||
rw — чтение и запись
|
||
noexec — запрет запуска файлов
|
||
nosuid — игнорировать SUID/SGID биты
|
||
noatime — не обновлять atime (быстрее)
|
||
auto — монтировать при mount -a
|
||
noauto — не монтировать автоматически
|
||
|
||
# Столбцы dump и fsck:
|
||
# dump: 0 = не бэкапить, 1 = бэкапить
|
||
# fsck: 0 = не проверять, 1 = / (первый), 2 = остальные`)
|
||
|
||
utils.Note("Всегда используйте UUID вместо /dev/sdb1 в fstab — имена устройств могут меняться после перезагрузки.")
|
||
|
||
// ─── 25. LVM ──────────────────────────────────────────────────
|
||
utils.Section("25. Управление логическими томами — LVM")
|
||
|
||
utils.Println("LVM позволяет гибко управлять дисковым пространством:")
|
||
utils.Println("объединять несколько дисков, изменять размер томов без перезагрузки.")
|
||
fmt.Println()
|
||
utils.Code(`Структура LVM:
|
||
PV (Physical Volume) — физический диск или раздел (/dev/sdb)
|
||
VG (Volume Group) — группа PV, единый пул пространства
|
||
LV (Logical Volume) — логический том из VG (аналог раздела)
|
||
|
||
PV: /dev/sdb /dev/sdc
|
||
↓ ↓
|
||
VG: vg_data (объединённое пространство)
|
||
↓
|
||
LV: /dev/vg_data/lv_web /dev/vg_data/lv_db`)
|
||
|
||
utils.Println(utils.ColorBold + "Создание LVM:" + utils.ColorReset)
|
||
utils.Code(`# 1. Создать Physical Volume:
|
||
pvcreate /dev/sdb /dev/sdc
|
||
pvs # показать PV
|
||
pvdisplay # подробно
|
||
|
||
# 2. Создать Volume Group:
|
||
vgcreate vg_data /dev/sdb /dev/sdc
|
||
vgs # показать VG
|
||
vgdisplay vg_data
|
||
|
||
# 3. Создать Logical Volume:
|
||
lvcreate -L 20G -n lv_web vg_data # 20 ГБ
|
||
lvcreate -l 100%FREE -n lv_db vg_data # всё свободное
|
||
lvs # показать LV
|
||
lvdisplay /dev/vg_data/lv_web
|
||
|
||
# 4. Создать ФС и смонтировать:
|
||
mkfs.ext4 /dev/vg_data/lv_web
|
||
mount /dev/vg_data/lv_web /var/www`)
|
||
|
||
utils.Println(utils.ColorBold + "Расширение LV:" + utils.ColorReset)
|
||
utils.Code(`# Расширить LV на 10 ГБ:
|
||
lvextend -L +10G /dev/vg_data/lv_web
|
||
|
||
# Расширить ФС (ext4):
|
||
resize2fs /dev/vg_data/lv_web
|
||
|
||
# Одной командой (ext4):
|
||
lvextend -L +10G -r /dev/vg_data/lv_web # -r = resize ФС
|
||
|
||
# Для XFS (только увеличение):
|
||
xfs_growfs /var/www`)
|
||
|
||
utils.Println(utils.ColorBold + "Добавить диск в VG:" + utils.ColorReset)
|
||
utils.Code(`pvcreate /dev/sdd
|
||
vgextend vg_data /dev/sdd`)
|
||
|
||
// ─── 26. Программный RAID ─────────────────────────────────────
|
||
utils.Section("26. Программный RAID — MD (mdadm)")
|
||
|
||
utils.Println("RAID — избыточный массив для надёжности и/или производительности.")
|
||
fmt.Println()
|
||
utils.Code(`Уровни RAID:
|
||
RAID 0 — страйпинг (производительность), без избыточности
|
||
RAID 1 — зеркало (надёжность), нужно 2 диска, использует 50%
|
||
RAID 5 — страйп + чётность, нужно 3+ дисков, теряем 1 диск
|
||
RAID 6 — двойная чётность, нужно 4+ дисков, теряем 2 диска
|
||
RAID 10 — зеркало + страйп, нужно 4 диска, теряем до N/2`)
|
||
|
||
utils.Println(utils.ColorBold + "mdadm — управление программным RAID:" + utils.ColorReset)
|
||
utils.Code(`# Создать RAID 1 из двух дисков:
|
||
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc
|
||
|
||
# Создать RAID 5:
|
||
mdadm --create /dev/md0 --level=5 --raid-devices=3 \
|
||
/dev/sdb /dev/sdc /dev/sdd
|
||
|
||
# Состояние массива:
|
||
cat /proc/mdstat # текущее состояние
|
||
mdadm --detail /dev/md0 # подробная информация
|
||
|
||
# Сохранить конфигурацию:
|
||
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
|
||
|
||
# Добавить запасной диск:
|
||
mdadm /dev/md0 --add /dev/sde
|
||
|
||
# Удалить диск из массива:
|
||
mdadm /dev/md0 --fail /dev/sdb
|
||
mdadm /dev/md0 --remove /dev/sdb
|
||
|
||
# Остановить массив:
|
||
mdadm --stop /dev/md0`)
|
||
|
||
utils.Footer()
|
||
}
|