Содержание

Диск

Создание разделов - fdisk, parted, cfdisk, mkfs

sudo fdisk -c -u /dev/LVG/LVM

Важно! Начало раздела должно начинаться с 2048

Форматирование - mkfs

Список всех дисков с разделами и размерами в системе:

lsblk

Список всех дисков с их UUID и ФС:

blkid

Информация о контроллере:

lshw -class disk -class storage

Информация о HDD:

sudo lshw -short -C disk

Информация SMART необходимого HDD

sudo smartctl -x /dev/sda

Проверка состояния

http://wiki.colobridge.net/linux/проверка_состояния_жестких_дисков_в_linux

sudo smartctl -a /dev/nvme0

NVMe

Установка

Установка

sudo apt install -y nvme-cli

Показатели, счётчики error-log должны быть 0

Показатели, счётчики error-log должны быть 0

nvme list
sudo nvme smart-log /dev/nvme0
sudo nvme error-log /dev/nvme0


https://internet-lab.ru/nvme-cli_cmd

Тестирование

cdm.sh

cdm.sh

#!/bin/bash
 
#https://gist.github.com/mrlioncub/6e1db0f17f80f7b310a6dd776dd8c2a4
 
LOOPS=5 #How many times to run each test
SIZE=1024 #Size of each test, multiples of 32 recommended for Q32 tests to give the most accurate results.
WRITEZERO=0 #Set whether to write zeroes or randoms to testfile (random is the default for both fio and crystaldiskmark); dd benchmarks typically only write zeroes which is why there can be a speed difference.
 
QSIZE=$(($SIZE / 32)) #Size of Q32Seq tests
SIZE+=m
QSIZE+=m
 
if [ -z $1 ]; then
    TARGET=$HOME
    echo "Defaulting to $TARGET for testing"
else
    TARGET="$1"
    echo "Testing in $TARGET"
fi
 
 
 
echo "Configuration: Size:$SIZE Loops:$LOOPS Write Only Zeroes:$WRITEZERO
Running Benchmark,  please wait...
"
 
fio --loops=$LOOPS --size=$SIZE --filename="$TARGET/.fiomark.tmp" --stonewall --ioengine=libaio --direct=1 --zero_buffers=$WRITEZERO --output-format=json \
  --name=Bufread --loops=1 --bs=$SIZE --iodepth=1 --numjobs=1 --rw=readwrite \
  --name=Seqread --bs=$SIZE --iodepth=1 --numjobs=1 --rw=read \
  --name=Seqwrite --bs=$SIZE --iodepth=1 --numjobs=1 --rw=write \
  --name=512kread --bs=512k --iodepth=1 --numjobs=1 --rw=read \
  --name=512kwrite --bs=512k --iodepth=1 --numjobs=1 --rw=write \
  --name=SeqQ32T1read --bs=$QSIZE --iodepth=32 --numjobs=1 --rw=read \
  --name=SeqQ32T1write --bs=$QSIZE --iodepth=32 --numjobs=1 --rw=write \
  --name=4kread --bs=4k --iodepth=1 --numjobs=1 --rw=randread \
  --name=4kwrite --bs=4k --iodepth=1 --numjobs=1 --rw=randwrite \
  --name=4kQ32T1read --bs=4k --iodepth=32 --numjobs=1 --rw=randread \
  --name=4kQ32T1write --bs=4k --iodepth=32 --numjobs=1 --rw=randwrite \
  --name=4kQ8T8read --bs=4k --iodepth=8 --numjobs=8 --rw=randread \
  --name=4kQ8T8write --bs=4k --iodepth=8 --numjobs=8 --rw=randwrite > "$TARGET/.fiomark.txt"
 
SEQR="$(($(cat "$TARGET/.fiomark.txt" | grep -A15 '"name" : "Seqread"' | grep -w bw | cut -d: -f2 | sed s:,::g)/1024))MB/s IOPS=$(cat "$TARGET/.fiomark.txt" | grep -A15 '"name" : "Seqread"' | grep -m1 iops | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
SEQW="$(($(cat "$TARGET/.fiomark.txt" | grep -A80 '"name" : "Seqwrite"' | grep -w bw | grep -v '_' | sed 2\!d | cut -d: -f2 | sed s:,::g)/1024))MB/s IOPS=$(cat "$TARGET/.fiomark.txt" | grep -A80 '"name" : "Seqwrite"' | grep iops | sed '7!d' | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
F12KR="$(($(cat "$TARGET/.fiomark.txt" | grep -A15 '"name" : "512kread"' | grep -w bw | cut -d: -f2 | sed s:,::g)/1024))MB/s IOPS=$(cat "$TARGET/.fiomark.txt" | grep -A15 '"name" : "512kread"' | grep -m1 iops | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
F12KW="$(($(cat "$TARGET/.fiomark.txt" | grep -A80 '"name" : "512kwrite"' | grep -w bw | grep -v '_' | sed 2\!d | cut -d: -f2 | sed s:,::g)/1024))MB/s IOPS=$(cat "$TARGET/.fiomark.txt" | grep -A80 '"name" : "512kwrite"' | grep iops | sed '7!d' | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
SEQ32R="$(($(cat "$TARGET/.fiomark.txt" | grep -A15 '"name" : "SeqQ32T1read"' | grep -w bw | cut -d: -f2 | sed s:,::g)/1024))MB/s IOPS=$(cat "$TARGET/.fiomark.txt" | grep -A15 '"name" : "SeqQ32T1read"' | grep -m1 iops | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
SEQ32W="$(($(cat "$TARGET/.fiomark.txt" | grep -A80 '"name" : "SeqQ32T1write"' | grep -w bw | grep -v '_' | sed 2\!d | cut -d: -f2 | sed s:,::g)/1024))MB/s IOPS=$(cat "$TARGET/.fiomark.txt" | grep -A80 '"name" : "SeqQ32T1write"' | grep iops | sed '7!d' | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
FKR="$(($(cat "$TARGET/.fiomark.txt" | grep -A15 '"name" : "4kread"' | grep -w bw | cut -d: -f2 | sed s:,::g)/1024))MB/s IOPS=$(cat "$TARGET/.fiomark.txt" | grep -A15 '"name" : "4kread"' | grep -m1 iops | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
FKW="$(($(cat "$TARGET/.fiomark.txt" | grep -A80 '"name" : "4kwrite"' | grep -w bw | grep -v '_' | sed 2\!d | cut -d: -f2 | sed s:,::g)/1024))MB/s IOPS=$(cat "$TARGET/.fiomark.txt" | grep -A80 '"name" : "4kwrite"' | grep iops | sed '7!d' | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
FK32R="$(($(cat "$TARGET/.fiomark.txt" | grep -A15 '"name" : "4kQ32T1read"' | grep -w bw | cut -d: -f2 | sed s:,::g)/1024))MB/s IOPS=$(cat "$TARGET/.fiomark.txt" | grep -A15 '"name" : "4kQ32T1read"' | grep -m1 iops | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
FK32W="$(($(cat "$TARGET/.fiomark.txt" | grep -A80 '"name" : "4kQ32T1write"' | grep -w bw | grep -v '_' | sed 2\!d | cut -d: -f2 | sed s:,::g)/1024))MB/s IOPS=$(cat "$TARGET/.fiomark.txt" | grep -A80 '"name" : "4kQ32T1write"' | grep iops | sed '7!d' | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
FK8R="$(($(cat "$TARGET/.fiomark.txt" | grep -A15 '"name" : "4kQ8T8read"' | grep -w bw | sed 's/        "bw" : //g' | sed 's:,::g' | awk '{ SUM += $1} END { print SUM }')/1024))MB/s IOPS=$(cat "$TARGET/.fiomark.txt" | grep -A15 '"name" : "4kQ8T8read"' | grep iops | sed 's/        "iops" : //g' | sed 's:,::g' | awk '{ SUM += $1} END { print SUM }' | cut -d. -f1)"
FK8W="$(($(cat "$TARGET/.fiomark.txt" | grep -A80 '"name" : "4kQ8T8write"' | grep -w bw | sed 's/        "bw" : //g' | sed 's:,::g' | awk '{ SUM += $1} END { print SUM }')/1024))MB/s IOPS=$(cat "$TARGET/.fiomark.txt" | grep -A80 '"name" : "4kQ8T8write"' | grep '"iops" '| sed 's/        "iops" : //g' | sed 's:,::g' | awk '{ SUM += $1} END { print SUM }' | cut -d. -f1)"
 
echo -e "
Results:  
\033[0;33m
Sequential Read: $SEQR
Sequential Write: $SEQW
\033[0;32m
512KB Read: $F12KR
512KB Write: $F12KW
\033[1;36m
Sequential Q32T1 Read: $SEQ32R
Sequential Q32T1 Write: $SEQ32W
\033[0;36m
4KB Read: $FKR
4KB Write: $FKW
\033[1;33m
4KB Q32T1 Read: $FK32R
4KB Q32T1 Write: $FK32W
\033[1;35m
4KB Q8T8 Read: $FK8R
4KB Q8T8 Write: $FK8W
"
 
rm "$TARGET/.fiomark.txt"
rm "$TARGET/.fiomark.tmp"


fio

Тест скорости записи и чтения с помощью fio (тестируется диск в точке монтирования которого запускается команда):

fio --loops=5 --size=1000m --filename=fiotest.tmp --stonewall --ioengine=libaio --direct=1   --name=Seqread --bs=1m --rw=read   --name=Seqwrite --bs=1m --rw=write   --name=512Kread --bs=512k --rw=randread   --name=512Kwrite --bs=512k --rw=randwrite   --name=4kQD32read --bs=4k --iodepth=32 --rw=randread   --name=4kQD32write --bs=4k --iodepth=32 --rw=randwrite && rm fiotest.tmp

dd

Тест скорости записи и чтения с помощью dd (тестируется диск в точке монтирования которого запускается команда):

dd if=/dev/zero of=tempfile bs=1M count=1024 conv=fdatasync #Запись
dd if=tempfile of=/dev/null bs=1M count=1024 #Чтение
rm tempfile

hdparm

Тест чтения с помощью hdparm:

sudo hdparm -tT /dev/sda

iozone

Тест с помощью iozone:

iozone -a /dev/sda

Ключ -a запускает iozone в автоматическом режиме, в котором утилита будет использовать для тестирования block size от 4k до 16384k (16M), и размер файлов от 64k до 524288k (512M).

Все результаты скорости указаны в KB/Sec.

Сохранить результат на диск:

iozone -a -b ioresults.xls

https://rtfm.co.ua/linux-proverka-skorosti-chteniya-zapisi-hdd/

LVM

Создать карту разделов LVM:

sudo kpartx -av /dev/GROUP/disk

теперь разделы доступны в /dev/mapper/GROUP-disk..
После работ с разделами, обязательно удаляем карту разделов LVM:

sudo kpartx -dv /dev/GROUP/disk

Файловая система

uid

Узнать uid:

sudo blkid

ext4

Резервные блоки

По умолчанию 5% блоков файловой системы будут зарезервированы для суперпользователя, чтобы избежать фрагментации и «позволить демонам, принадлежащим root, продолжать корректно функционировать после того, как непривилегированным процессам будет запрещена запись в файловую систему»

Не резервировать блоки при создании (device будет отформатирован!):

mkfs.ext4 -m 0 /dev/device

Установить резерв в 1% (на существующей фс, без форматирования):

tune2fs -m 1 /dev/device

Проверить:

disk=/dev/sdg
echo Disk Size: $(($(tune2fs -l $disk | grep '^Block count:' | sed -r 's/Block count:\s+//')*$(tune2fs -l $disk | grep '^Block size:' | sed -r 's/Block size:\s+//')/1024**3))GB
echo Reserved Size: $(($(tune2fs -l $disk | grep '^Reserved block count:' | sed -r 's/Reserved block count:\s+//')*$(tune2fs -l $disk | grep '^Block size:' | sed -r 's/Block size:\s+//')/1024**3))GB
echo Reserved: $(($(tune2fs -l $disk | grep '^Reserved block count:' | sed -r 's/Reserved block count:\s+//')*$(tune2fs -l $disk | grep '^Block size:' | sed -r 's/Block size:\s+//')/1024**3/($(tune2fs -l $disk | grep '^Block count:' | sed -r 's/Block count:\s+//')*$(tune2fs -l $disk | grep '^Block size:' | sed -r 's/Block size:\s+//')/1024**3/100)))%

https://wiki.archlinux.org/title/ext4#Reserved_blocks

Увеличение раздела с помощью parted

Смотрим текущие разделы:

sudo parted /dev/xvda print
  Model: Xen Virtual Block Device (xvd)
  Disk /dev/xvda: 64,4GB
  Sector size (logical/physical): 512B/512B
  Partition Table: msdos
 
  Number  Start   End     Size    Type     File system     Flags
   1      1049kB  7000MB  6999MB  primary  ext4
   2      7000MB  11,0GB  4000MB  primary  linux-swap(v1)
   3      11,0GB  42,9GB  31,9GB  primary  ext4

Необходимо увеличить 3 раздел. Удаляем и создаем с новым размером его:

sudo parted /dev/xvda rm 3
sudo parted /dev/xvda mkpart p ext4 11,0GB 64,4GB

Проверяем и увеличиваем саму фс:

sudo e2fsck -f /dev/xvda3
sudo resize2fs /dev/xvda3

https://www.linux.org.ru/forum/admin/6908707

Дефрагментация

e4defrag

swap

Показать размеры памяти и swap:

free -mh

vm.swappiness — параметр, который определяет при каком потреблении памяти в % начинает задействоваться swap.

sysctl vm.swappiness

Отключить задействование swap:

#текущая сессия
sysctl -w vm.swappiness=0
#при старте системы
echo vm.swappiness = 0 | sudo tee -a /etc/sysctl.conf

Отключить swap можно с помощью:

sudo swapoff -a

или определенный swap, если их несколько:

sudo swapoff /dev/xvda2

Создать/форматировать swap на разделе:

sudo mkswap /dev/sdc2

Увеличить swap на «лету».

Создать образ необходимого раздела, пример в 1GB (1024 по 1MB):

sudo dd if=/dev/zero of=/swap1 bs=1M count=1024

Создать фс и назначить права:

sudo mkswap /swap1
chmod 600 /swap1

Подключить:

sudo swapon /swap1

Для автоматической загрузки добавить в /etc/fstab:

/swap1   swap   swap   defaults   0   0

Копирование диска

cat

Сразу сжимаем:

sudo cat /dev/sda1 | gzip >sda1.img

Обратная операция:

sudo zcat sda1.img >/dev/sdb1

dd

Копирование раздела/образа

sudo dd if=/dev/sda1 of=/dev/sdb1 bs=8M conv=noerror

Сразу сжимаем:

sudo dd if=/dev/sda1 bs=8M conv=noerror | gzip -c> sda1.dd.gz

Обратная операция:

gzip -dc sda1.dd.gz | dd of=/dev/sdb1 bs=8M conv=noerror

Сжимаем и отправляем на по ssh:

dd if=/dev/sda | gzip | ssh user@backup-host "dd of=book/sda.gz"

Обратная операция:

ssh user@backup-host "dd if=book/sda.gz" | gzip -d | dd of=/dev/sda

http://help.ubuntu.ru/wiki/backup
http://habrahabr.ru/post/233961/ - Копирование разделов жесткого диска
http://rudenko.net.ua/?p=195 - Резервирование жёсткого диска при помощи dd поверх ssh

Планировщик ввода-вывода

Посмотреть текущие значения:

grep -r " " /sys/block/sd*/queue/scheduler

Установить необходимое значение, например для диска sda планировщик deadline:

echo deadline > /sys/block/sda/queue/scheduler

Автоматическую установку режима можно сделать через udev. Создаем /etc/udev/rules.d/65-hdd-deadline.rules:

ACTION=="add|change", KERNEL=="sda", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="deadline"

http://blog.tataranovich.com/2014/05/deadline-scheduler-for-ssd.html - Включение планировщика DEADLINE для SSD дисков

http://serverfault.com/questions/463580/still-getting-aacraid-host-adapter-abort-request-errors-after-following-recomme - Still getting aacraid: Host adapter abort request errors after following recommended steps

Описание

Описание

Планировщик NOOP

Планировщик NOOP (no-operate) является самым простым. Он помещает все входящие запросы ввода-вывода в простой буфер типа FIFO (First-In, First-Out — первый вошел, первый вышел) и затем просто запускает их на исполнение. Использует минимальное количество инструкций процессора на операцию ввода-вывода для выполнения простейшей функциональности: слияние и сортировка запросов«. Данный планировщик предполагает, что сами устройства хранения данных будут оптимизировать быстродействие операций ввода-вывода (например, внешний RAID-контроллер или SAN). Потенциально, планировщик NOOP будет хорошо работать с устройствами хранения данных, которые не имеют механических частей для чтения данных (т.е. головок диска). Причина кроется в том, что данный планировщик не делает никаких попыток оптимизировать движение головок, выполняя простейшее слияние запросов, что также помогает повышению пропускной способности диска. Поэтому такие устройства хранения как флэш-диски, SSD-диски, USB-накопители и т.п., которые имеют очень малое время поиска данных (seek time) могут получить преимущество, используя планировщик NOOP.

Deadline IO Scheduler (планировщик предельных сроков)

Основополагающим принципом работы является гарантированное время запуска запросов ввода-вывода на обслуживание. Он сочетает в себе такие возможности как слияние запросов, однонаправленный алгоритм лифта и устанавливает предельный срок на обслуживание всех запросов (отсюда и такое название). Он поддерживает две специальные «очереди сроков выполнения» (deadline queues) в дополнение к двум отдельным «отсортированным очередям» на чтение и запись (sorted queues). Задания в очереди сроков выполнения сортируются по времени исполнения запросов по принципу «меньшее время — более раннее обслуживание — ближе к началу очереди». Очереди на чтение и запись сортируются на основе запрашиваемого ими номера сектора (алгоритм лифта).
Данный планировщик действительно помогает пропускной способности в случаях чтения с секторов с большим номером блока (на внешних областях диска — прим.перев.). Операции чтения могут иногда заблокировать приложения, поскольку пока они выполняются, приложения ждут их завершения. С другой стороны, операции записи могут выполняться гораздо быстрее, поскольку они производятся в дисковый кэш (если только вы не отключили его использование). Более медленные операции чтения с внешних областей диска перемещаются к концу очереди, а более быстрые операции чтения с более близких областей поступят на обслуживание раньше.
Deadline scheduler очень полезен для некоторых приложений. В частности, в системах реального времени используется данный планировщик, поскольку в большинстве случаев, он сохраняет низкое время отклика (все запросы обслуживаются в короткий временной период). Также было отмечено, что он также хорошо подходит для систем баз данных, которые имеют диски без поддержки TCQ.

CFQ IO Scheduler (планировщик с полностью честной очередью)

CFQ (Completely Fair Queue — планировщик с полностью честной очередью) IO scheduler в настоящее время является планировщиком по умолчанию в ядре Linux. Он использует и слияние запросов и алгоритм лифта. При работе CFQ синхронно размещает запросы на ввод-вывод от процессов в ряд очередей на каждый процесс (per-process queues). Затем он выделяет отрезки времени (timeslices) для каждой очереди на доступ к диску. Длина отрезков времени и количество запросов в очереди, которые будут обслужены, зависит от приоритета ввода-вывода конкретного процесса. Асинхронные запросы от всех процессов объединяются в несколько очередей по одной на каждый приоритет.

http://oit-company.ru/publ/planirovshhiki_vvoda_vyvoda_v_linux/2-1-0-130


RAM диск

tmpfs

tmpfs перемещает неиспользуемые страницы в swap

Создать диск 1GB:

mount -t tmpfs -o size=1G,mode=0700 tmpfs /ramdisk

Изменить размер диска:

mount -o remount,size=2G /ramdisk

ramfs

ramfs использует всю память

Создать диск:

mount -t ramfs -o mode=0700 ramfs /ramdisk