Linux

Как правильно разбить жесткий диск с 4кБ секторами (Advanced Format) в Linux

У Western Digital есть быстрый способ приведения в порядок скорости записи — поставить перемычку на контакты 7-8.

Но единожды поставив, снимать ее при «живых» данных на жестком диске нельзя!
Она эмулирует только 63-й сектор, подсовывая на самом деле 64-й. Почему 64-й:

8*512Б / 4096Б = 8.

То есть нам нужен начальный сектор, кратный 8. Для совместимости, сделаем его 64-м.

Следовательно, начало ФС будет совпадать с началом 4кБ сектора и при записи на диск не будет тормозов (обычно тормоза проявляются в минимум троекратной потере скорости записи в файловую систему).

Из всего вышесказанного следует, что если разделов на диске несколько, то последующие разделы все равно необходимо будет выравнивать вручную даже при наличии перемычки!
А если перемычку вынуть, таблица разделов сместится обратно на 1 сектор. Куда денутся ваши данные вопрос сложный. Возможно, они останутся целыми и вы сможете их увидеть, вернув перемычку на место. Но те случаи, которые описаны в интернете, говорят об обратном.

Итак. Подключили новый диск, посмотрели, где он находится:

bash-3.2# fdisk -l
Disk /dev/sda: 250.0 GB, 250058268160 bytes
255 heads, 63 sectors/track, 30401 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1       30394   244139773+  fd  Linux raid autodetect
Disk /dev/sdb: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot      Start         End      Blocks   Id  System
Disk /dev/md0: 249.9 GB, 249998999552 bytes
2 heads, 4 sectors/track, 61034912 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk /dev/md0 doesn’t contain a valid partition table

Он у нас в /dev/sdb. Смотрим на передаваемый системе размер сектора:

bash-3.2# hdparm -I /dev/sdb | grep Sector size
Logical/Physical Sector size:           512 bytes

Вкупе с информацией на диске, что он Advanced Format, заключаем, что имеем дело с эмуляцией размера сектора.
Начинаем создавать разделы.

Создаем (выбрать n) primary раздел (выбрать p), указываем номер раздела (выбрать 1), начиная с First sector: 64.
Last sector можно оставить по умолчанию, если раздел будет один. Если нужно несколько разделов, в качестве Last sector выбираем число, делящееся на 4096 без остатка. Тогда стартовый сектор следующего раздела будет Last Sector + 1.

В примере указано, что раздел будет помечен как Linux raid autodetect (fd) — это на любителя (надо выбрать команду t), можете оставить Linux (83).
Далее посмотрим созданные разделы (команда p) и если все правильно, запишем таблицу разделов на диск (команда w).

bash-3.2# fdisk -u /dev/sdb
The number of cylinders for this disk is set to 121601.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p

Partition number (1-4): 1
First sector (63-1953525167, default 63): 64
Last sector or +size or +sizeM or +sizeK (64-1953525167, default 1953525167):
Using default value 1953525167

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)

Command (m for help): p
Disk /dev/sdb: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders, total 1953525168 sectors
Units = sectors of 1 * 512 = 512 bytes
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1              64  1953525167   976762552   fd  Linux raid autodetect

Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.

Создаем файловую систему с размером кластера 4096 байт:

bash-3.2# mkfs.xfs -f -b size=4096 /dev/sdb1
meta-data=/dev/sdb1         isize=256    agcount=32, agsize=7630957 blks

              =                       sectsz=512   attr=0
data        =                       bsize=4096   blocks=244190624, imaxpct=25
              =                       sunit=0      swidth=0 blks, unwritten=1
naming    =version 2           bsize=4096
log          =internal log        bsize=4096   blocks=32768, version=1
              =                       sectsz=512   sunit=0 blks
realtime   =none                extsz=65536  blocks=0, rtextents=0

Монтируем диск

bash-3.2# mkdir /mnt/hdd2

bash-3.2# mount -t xfs /dev/sdb1 /mnt/hdd2

bash-3.2# df -h |  grep sdb
/dev/sdb1             932G  1.1M  932G   1% /mnt/hdd2

Проверяем скорость записи:

bash-3.2# dd if=/dev/zero of=/mnt/hdd2/000.dd bs=128K count=1000
1000+0 records in

1000+0 records out
131072000 bytes (131 MB) copied, 1.39036 seconds, 94.3 MB/s

Увеличиваем размер записываемого файла:

bash-3.2# dd if=/dev/zero of=/mnt/hdd2/000.dd bs=128K count=10000
10000+0 records in
10000+0 records out
1310720000 bytes (1.3 GB) copied, 14.7553 seconds, 88.8 MB/s

Удаляем созданный тестом файл:

bash-3.2# rm /mnt/hdd2/000.dd

Диск готов к эксплуатации. Добавляем команды монтирования при загрузке, если надо и пользуемся.

Показать больше

Статьи на близкие темы

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Закрыть