RAM-диск в Linux
Какие устройства доступны для создания RAM-диска
# ls -l /dev/ram*
brw-r--r-- 1 root root 1, 1 фев 19 15:41 /dev/ram
brw-rw---- 1 root disk 1, 0 фев 19 12:41 /dev/ram0
brw-rw---- 1 root disk 1, 1 фев 19 12:41 /dev/ram1
brw-rw---- 1 root disk 1, 10 фев 19 12:41 /dev/ram10
brw-rw---- 1 root disk 1, 11 фев 19 12:41 /dev/ram11
brw-rw---- 1 root disk 1, 12 фев 19 12:41 /dev/ram12
brw-rw---- 1 root disk 1, 13 фев 19 12:41 /dev/ram13
brw-rw---- 1 root disk 1, 14 фев 19 12:41 /dev/ram14
brw-rw---- 1 root disk 1, 15 фев 19 12:41 /dev/ram15
brw-rw---- 1 root disk 1, 2 фев 19 12:41 /dev/ram2
brw-rw---- 1 root disk 1, 3 фев 19 12:41 /dev/ram3
brw-rw---- 1 root disk 1, 4 фев 19 12:41 /dev/ram4
brw-rw---- 1 root disk 1, 5 фев 19 12:41 /dev/ram5
brw-rw---- 1 root disk 1, 6 фев 19 12:41 /dev/ram6
brw-rw---- 1 root disk 1, 7 фев 19 12:41 /dev/ram7
brw-rw---- 1 root disk 1, 8 фев 19 12:41 /dev/ram8
brw-rw---- 1 root disk 1, 9 фев 19 12:41 /dev/ram9
Это блочное устройство
# fdisk -l /dev/ram0
Диск /dev/ram0: 16 MiB, 16777216 байт, 32768 секторов
Единицы: секторов по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер I/O (минимальный/оптимальный): 512 байт / 512 байт
Создаём файловую систему на устройстве /dev/ram0
# mkfs -t ext2 /dev/ram0
mke2fs 1.43.7 (16-Oct-2017)
Discarding device blocks: done
Creating filesystem with 16384 1k blocks and 4096 inodes
Filesystem UUID: e5844f0b-f969-4ba0-b3db-74783ecef616
Superblock backups stored on blocks:
8193
Allocating group tables: done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
Создаём точку монтирования для файловой системы /dev/ram0
# mkdir /mnt/ram0
Монтируем файловую RAM-диска
# mount /dev/ram0 /mnt/ram0/
# df -m /dev/ram0
Файловая система 1M-блоков Использовано Доступно Использовано% Cмонтировано в
/dev/ram0 16 1 15 1% /mnt/ram0
RAM-диск это блочное устройство с UUID его файловой системы
# file -s /dev/ram0
filesystem data (mounted or unclean), UUID=e5844f0b-f969-4ba0-b3db-74783ecef616 (large files)
# tune2fs -l /dev/ram0
tune2fs 1.43.7 (16-Oct-2017)
Filesystem volume name: <none>
Last mounted on: <not available>
Filesystem UUID: e5844f0b-f969-4ba0-b3db-74783ecef616
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: ext_attr resize_inode dir_index filetype sparse_super large_file
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl
Filesystem state: not clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 4096
Block count: 16384
Reserved block count: 819
Free blocks: 15723
Free inodes: 4085
First block: 1
Block size: 1024
Fragment size: 1024
Reserved GDT blocks: 63
Blocks per group: 8192
Fragments per group: 8192
Inodes per group: 2048
Inode blocks per group: 256
Filesystem created: Mon Feb 19 20:36:51 2018
Last mount time: n/a
Last write time: Mon Feb 19 20:37:47 2018
Mount count: 1
Maximum mount count: -1
Last checked: Mon Feb 19 20:36:51 2018
Check interval: 0 (<none>)
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 128
Default directory hash: half_md4
Directory Hash Seed: bc5f163d-d9fe-47fe-ad20-15dc6551695b
Копируем файл на RAM-диск
# cp /mnt/path/books/К*.* /mnt/ram0/
Файл скопирован
# ls /mnt/ram0/
lost+found 'Кэнтрелл Основы Slackware Linux.pdf'
Соль RAM-диска:
Если в iS-DOS на ZX Spectrum организовать RAM-диск, то скорость доступа к файлам лежащим на RAM-диске будет быстрее чем в Линукс 64 бит на SSD.
Недостаток:
При потере питания всё содержимое RAM-диска будет потеряно.
RAM-диск в Linux
Продолжение
На самом деле пользы от 16-тиметрового RAM-диска почти никакой.
И в Линукс и в iS-DOS на ZX Spectrum общий принцип тот же:
Хотим RAM-диск в 500 мегабайт и рассчитываем размер в килобайтах
# echo '1024*500' | bc -l
512000
Добавляем параметр ядру (последний в строке, размер в килобайтах)
# cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-3.14.79-std-def-alt0.M70P.2 ... reboot=bios acpi_backlight=vendor ramdisk_size=512000
Общий объём памяти в мегабайтах
# free -m
total used free shared buffers cached
Mem: 2011 396 1615 0 44 225
-/+ buffers/cache: 125 1885
Swap: 2311 0 2311
Создаём файловую
# mkfs -t ext2 /dev/ram0
mke2fs 1.43.7 (16-Oct-2017)
Discarding device blocks: done
Creating filesystem with 131072000 4k blocks and 32768000 inodes
Filesystem UUID: 48924d07-6f49-492b-b7cb-82ab683c37eb
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000
Allocating group tables: done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
Создаём точку монтирования
# mkdir /mnt/ram0
Монтируем
# mount /dev/ram0 /mnt/ram0/
# free -m
total used free shared buffers cached
Mem: 2011 398 1612 0 44 226
-/+ buffers/cache: 126 1884
Swap: 2311 0 2311
Вот теперь есть где развернуться:
# df -m /dev/ram0
Файловая система 1M-блоков Использовано Доступно Использовано% Cмонтировано в
/dev/ram0 485 3 457 1% /mnt/ram0
Скорость доступа к файлам лежащим на RAM-диске будет быстрее, чем если бы они лежали на SSD.
При этом памяти RAM-диск будет занимать столько, сколько занимают расположенные на нём файлы. Но при удалении файлов память освобождаться не будет. Разумно (до того как, а не после) рассчитывайте объём RAM-диска.
Что делать с RAM-диском потом?
Поступаем почти так же как и в iS-DOS на ZX Spectrum:
Сохраняем RAM-диск в файл:
(расширение blk - файл блочного устройства; расширение принятое для драйверов блочных устройств в операционной системе iS-DOS, включая драйверы RAM-диска iS-DOS)
# dd if=/dev/ram0 of=/mnt/sda1/opt/ram0.blk bs=20M
Перед перезагрузкой не забыть о параметре ядру
# cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-3.14.79-std-def-alt0.M70P.2 ... ramdisk_size=512000
Объём памяти до возврата RAM-диска
# free -m
total used free shared buffers cached
Mem: 2011 404 1606 0 45 231
-/+ buffers/cache: 127 1883
Swap: 2311 0 2311
# df -m /dev/ram0
Файловая система 1M-блоков Использовано Доступно Использовано% Cмонтировано в
udevfs 5 0 5 0% /dev
Возвращаем RAM-диск:
# dd if=/mnt/sda1/opt/ram0.blk of=/dev/ram0 bs=20M
Соответственно изменился и объём занятой памяти
# free -m
total used free shared buffers cached
Mem: 2011 1328 683 0 42 656
-/+ buffers/cache: 629 1382
Swap: 2311 0 2311
Монтируем RAM-диск
# mount /dev/ram0 /mnt/ram0/
и получаем то, что на нём лежало до перезагрузки
# df -m /dev/ram0
Файловая система 1M-блоков Использовано Доступно Использовано% Cмонтировано в
/dev/ram0 485 425 35 93% /mnt/ram0
# ls -1 /mnt/ram0/
'[2009]_Викинги_mpeg4.mp4'
lost+found
Голубой_Гром.240.mp4
При достаточном объёме памяти там может лежать всё что угодно. Скорость доступа к файлам, равна скорости шины памяти, - самая быстрая скорость доступа.
Почему постоянно упоминалась iS-DOS для ZX Spectrum?
Чтобы показать, что общий принцип тот же вне зависимости не только от операционной системы, но и не зависит от аппаратной платформы. Он такой же как и на платформе Home Computer 27 лет назад.