Створення оперативного диска в Linux


70

У мене є машина з 62 Гб оперативної пам’яті і магістраль, яка всього 7 ГБ, тому я думав, що я б створив диск оперативної пам’яті і компілював там. Я не є експертом Linux. В Інтернеті я знайшов інструкції для створення диску RAM:

mkfs -q /dev/ram1 8192

але я змінив 8192 на 16777216, намагаючись виділити 16 ГБ оперативного диска.

Я отримав таку помилку:

mkfs.ext2: Filesystem larger than apparent device size.
Proceed anyway? (y,n) 

У цей момент я злякався і заручив.

sudo dmidecode --type 17 | grep Size

показує

8x8192MB + 2048MB = 67584 MB

але duна /devдає 804K.

Це проблема? Чи можу я подолати цей /devрозмір?


15
Ви пробували tmpfs? Це файлова система в оперативній пам'яті, немає необхідності в ext2. mount -o size=16G -t tmpfs none /mnt/tmpfs
t-8ch

Це спрацювало! Дякую! Але поки що не дуже швидке: я думаю, що інструменти, які я використовую для створення, все ще використовують звичайний диск. Я покладу більше речей на операційний диск.
Френк

3
Розміщення самих інструментів на ramdisk не має великого значення, оскільки ядро ​​все одно буде кешувати їх у операційному режимі.
т-8ч

1
@goldilocks Це анекдотичні докази, але при компілюванні наших проектів Java з Maven, спостерігається значне прискорення роботи при використанні ramdisk. Я б припустив, що це швидше через час пошуку, ніж час для читання.
ПравописD

1
/ dev / shm, фактично / run / shm , можна використовувати; це майже завжди є.
Camille Goudeseune

Відповіді:


78

Найкращий спосіб створити операційний диск на Linux - це tmpfs. Це файлова система, яка живе в операційному режимі, тому немає необхідності в ext2. Ви можете створити tmpfs розміром 16 Гб за допомогою:

mount -o size=16G -t tmpfs none /mnt/tmpfs

2
у моїй системі, що не має нічого в / mnt, він говорить: ls: не може отримати доступ / mnt / tmpfs: Немає такого файлу чи каталогу каталогів: точка монтажу / mnt / tmpfs не існує. Це щось турбувати? Якщо я просто mkdir / mnt / tmpfs, чи це перемагає мету (створюючи tmpfs на звичайному диску - будь ласка, не полум'я, я тут новачок).
Френк

9
Вам потрібна точка монтування (каталог) як цільова, тому після створення цього каталогу (ви можете використовувати будь-який каталог, наявний вміст затінено), ви зможете встановити його за допомогою команди з відповіді.
t-8ch

1
tmpfsможе використовувати swap, який, мабуть, не хочеться на чистому диску оперативної пам'яті.
palswim

2
@RomanSusi tmpfs - це тип файлу (передається після -t). "none" - це резервний пристрій ("диск"), якого не існує для tmpfs
t-8ch

1
Можливо, варто відзначити, що вказувати розмір необов’язково. Він за замовчуванням становить половину оперативної пам’яті. Немає накладних витрат із зазначенням більшого розміру, все, що це робиться, це встановити обмеження, щоб убезпечити себе від випадкового використання всієї вашої оперативної пам’яті та вбити систему.
sourcejedi

20

Linux дуже ефективний у використанні оперативної пам'яті. Невеликий сюрприз, який ви бачите мало, якщо якісь прискорення tmpfs. Найбільші фрагменти для читання в пам'яті (і, таким чином, здатні уповільнити процес) - це інструменти (компілятор, асемблер, лінкер), і в довготривалому періоді makeвони завантажуються в пам'ять при запуску і ніколи не залишають її. Що залишилося - це читання у джерелі (написання результатів не сповільнить вас, якщо тільки сильно не обмежена пам'ять). Знову ж таки, файли заголовків comon залишатимуться навколо, лише для джерела користувача потрібно буде їх прочитати. І це навряд чи буде більше кількох мегабайт. Створення великого RAMdisk (або навіть великого використання tmpfs) може дуже сповільнити роботу (роблячи обмеження пам’яті збірки, файли на RAMdisk або на tmpfs не можуть використовувати безпосередньо звідти).


1
Що! Як їх не можна використовувати безпосередньо звідти?
Казарк

Вони знаходяться в оперативній пам’яті, але не у форматі, який можна використовувати безпосередньо.
vonbrand

2
Дійсно! Як так? (Вибачте мою повільність.)
Казарк,

8
@Kazark, для обробки виконуваних файлів у пам'яті використовуються спеціальні структури даних. Оскільки RAMdisks і tmpfsне є загальним для зберігання виконуваних файлів (RAMdisks є залишком від старих часів tmpfsвибагливих повільних дискетів і таких, призначених для строгості тимчасових даних), ніхто не вважав це досить важливим, щоб додати необхідні некрасиві хаки.
vonbrand

7
Я спробував запустити свій рейковий код із файлової системи tmpfs (RAM), і я взагалі не побачив різниці. Я дуже сподівався на помітну різницю, але мене розчарував, наскільки дивовижний Linux.
Khaja Minhajuddin

6

Проблема полягає в тому, що максимальний розмір рамбдиска, більш конкретно розміру пам'яті, до якої можна отримати доступ через драйвер ramdisk, налаштований під час компіляції, може бути перезаписаний під час завантаження, але залишається фіксованим після завантаження ядра в пам'ять. Значення за замовчуванням, ймовірно, вимірюється в Мегабайтах. Якщо я правильно пригадую, пам'ять для рамдиска зарезервована праворуч, коли завантажується драйвер, всі рамкові диски мають однаковий розмір і за замовчуванням є 16 рамкових дисків. Тож навіть вам не потрібен розмір рамбіска 16G :-)

Як зазначено в іншій відповіді, tmpfs - це те, що ви хочете використовувати. Крім того, ви не виграєте багато, маючи всю свою ОС в ramdisk / tmpfs. Просто скопіюйте свій builddir в tmpfs і виконайте компіляцію. Можливо, вам доведеться переконатися, що всі тимчасові результати записуються також у місце, яке знаходиться в tmpfs.


Насправді вони не використовують жодної пам'яті, поки ви не напишете їм речі. Межа часу завантаження - це лише межа. Навіть після заповнення пам'яті ви можете звільнити резервну копію пам'яті blockdev --flushbufs.
psusi

@psusi: чи можете ви дати нам більше інформації про це? Я можу знайти лише твердження, в яких згадується, що колись стверджувана пам'ять ramdisk ніколи не відшкодовується, наприклад, у Documentation/blockdev/ramdisk.txtджерелах ядра. І на мою відповідь: цей файл також говорить про те, що ramdisk зростає в міру споживання пам’яті, тому не всі виділяються відразу.
Bananguin

Яка інформація? Ви запускаєте команду, і вона звільняє оперативну пам'ять, припускаючи, що ви все ще не встановите її.
psusi

Звідки ти знаєш, що команда робить те, що ти кажеш, це робить? Його основна сторінка не підтверджує це, і документацію в дереві джерела ядра можна зрозуміти, що суперечить вашій інформації.
Bananguin

6
Я прочитав вихідний код і перевірив його, спробувавши його.
psusi

3

Щоб створити великий дисковий диск після завантаження, не возившись з параметрами ядра, це, здається, працює. Використовуйте tmpfs, створюйте файл, монтуйте його через цикл та монтуйте його через файлову систему:

mount -t tmpfs -o size=200M tmpfs temp/
cd temp/
dd if=/dev/zero of=disk.img bs=1M count=199
losetup /dev/loop0 disk.img
mkfs.ext4 /dev/loop0
mount /dev/loop0 temp2/

Можливо, трохи покарання за продуктивність, яке проходить через кілька різних шарів ... але принаймні це працює.


3

Крім того , tmpfsі ramfsще один варіант є /dev/ram0блоковим пристроєм. В останніх версіях Ubuntu цей пристрій за замовчуванням не існує, але його можна створити через modprobe brd.

Цей підхід є більш передбачуваним, оскільки він створює реальну ext4файлову систему і ніколи не перевищує визначений вами ліміт. Але для налаштування потрібно більше кроків, а оперативна пам’ять використовується менш ефективно.

Використання модуля ядра brd (/ dev / ram0)

Щоб створити та ініціалізувати диск 4 Гб оперативної пам’яті:

mkdir /ramdisk

modprobe brd rd_nr=1 rd_size=$((4 * 1048576))
mkfs.ext4 /dev/ram0
mount /dev/ram0 /ramdisk

rd_nrПараметр визначає , скільки дисків RAM для створення (за замовчуванням він створює 16, тобто /dev/ram0через /dev/ram15). rd_sizeПараметр розмір в кілобайтах . $(( ... ))Синтаксис дозволяє виконувати арифметичні дії в оболонці.

Щоб розмістити диск RAM, відключіть його та видаліть brdмодуль ядра:

umount /ramdisk
modprobe -r brd

Створення блокового пристрою всередині ramfs

Крім того, ви можете створити блоковий пристрій всередині ramfs:

mkdir /ramdisk-storage /ramdisk
mount -t ramfs ramfs /ramdisk-storage

truncate -s 4G /ramdisk-storage/ramdisk.img
mkfs.ext4 /ramdisk-storage/ramdisk.img
mount /ramdisk-storage/ramdisk.img /ramdisk

truncateКоманда створює порожній файл заданого розміру таким чином, що вона инициализируется (тобто споживає пам'ять) на вимогу.

Щоб розмістити диск оперативної пам'яті, змініть його та видаліть образ диска:

umount /ramdisk
rm /ramdisk-storage/ramdisk.img

Порівняння з tmpfsіramfs

Хоча tmpfsі ramfsефективніше, ніж використання блочного пристрою, нижче наведено деякі їх мінуси.

tmpfsможе перейти на диск. Це більш ефективно, але, можливо, вам потрібен чистий диск RAM:

  • Файли, з якими ви працюєте, є чутливими (наприклад, файли із зашифрованого розділу).
  • Ви робите тестування продуктивності, і не хочете, щоб введення / виведення диска було фактором (час запису SSD може сильно відрізнятися).
  • Ви розпаковуєте великий файл і не хочете зношувати свій SSD.

ramfsналаштовується легко, повертає простір після видалення файлів і використовує оперативну пам’ять ефективніше (система не буферує файли, оскільки знає, що вони є в оперативній пам'яті). Але це має свої мінуси та сюрпризи:

  • dfУтиліта не повідомляє використання простору:

    root@cello-linux:~# df -h /ramdisk
    Filesystem      Size  Used Avail Use% Mounted on
    ramfs              0     0     0    - /ramdisk
    
  • Немає параметра обмеження розміру. Якщо ви занадто багато помістите в рамбіск, ваша система зависне.

  • Рідкі файли можуть стати нерозбірливими, коли ви цього найменше очікуєте. Сьогодні вранці я скопіював зображення VM (150G, але 49G використовується на диску) у ramfs(у мене 128G оперативної пам’яті). Це спрацювало. Але коли я скопіював зramfs до місця призначення, моя система стала нечутливою. cpУтиліта , по- видимому заповнені отвори на читання , але не писати.

І те, tmpfsі ramfsінше може поводитися інакше, ніж реальна ext4файлова система. Створення блокового пристрою в оперативній пам’яті та ініціалізація цього за допомогою ext4уникає цього.

Для більш поглибленого порівняння: https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt


1

OP кількість оперативної пам'яті виражається в МБ. Отже, все, що вам потрібно там ввести - це 16384. І тоді вуаля ви б працювали.


1
Ні. "Якщо fs-size не має суфікса, він інтерпретується як потужність у два кілобайти." - людинаmkfs.ext2
sourcejedi

1

Ви можете змонтувати ramfsфайлову систему, скопіювати у неї проект і працювати звідти. Це гарантує, що ваші вхідні файли завантажуються в оперативну пам’ять, і вони не будуть перечитуватися з набагато повільнішого дисковода. Однак, як ви виявили, це, як правило, не корисна стратегія. Ви вже отримуєте точно таку ж користь.

Ramfs - це дуже проста файлова система, яка експортує механізми кешування диска Linux (кеш сторінки та кеш-пам'ять зубів) як динамічно змінна файлова система на основі оперативної пам'яті.

- https://github.com/torvalds/linux/blob/v4.18/Documentation/filesystems/ramfs-rootfs-initramfs.txt

Ви вже можете довіряти, що вхідні файли будуть кешовані в оперативній пам'яті під час першого читання. Ваші вихідні файли також кешовані, так що ви не чекаєте їх запису на диск.

Немає штучного обмеження в тому, скільки ви можете кешувати, як довго він залишається кешованим і т. Д. Кеші починають скидати лише після заповнення оперативної пам'яті. Який кеш випадає першим, обирається страхітично розробленими алгоритмами. Перше наближення - це ми описуємо його як найменш нещодавно використане. Див. Які алгоритми заміни сторінки використовуються в ядрі Linux для кешу файлів ОС?

Зауважте, що ваш текстовий редактор явно збереже fsync()файли на диску.

Якщо ви запускаєте тести програми, яка включає fsync(), запуск цих файлів у такій файловій системі ramfsможе пришвидшити їх. Ще одна стратегія - спробувати і відключити за fsync()допомогою eatmydata/ nosync.so.

Деякі інші операційні системи можуть мати конкретні обмеження, які можна обійти за допомогою ramdisk. З одного боку, відсутність будь-якого кешування файлів є причиною того, що рамкові диски були популярними в DOS .

tmpfs

tmpfsпрацює так само ramfs, як , за винятком того, що він може використовувати простір підкачки, якщо у вас є. Тобто, якщо вам потрібна оперативна пам’ять для чогось іншого, алгоритми "Найменше нещодавно використані" можуть вибирати блоки даних з tmpfs і поміняти їх на диск.

Більшість людей дотримуються tmpfs, тому що це також дозволяє обмежити загальний розмір і показує вірно використаний простір, наприклад, у dfкоманді. Я не впевнений, чому така різниця існує. Обмеження розміру tmpfsзахищає вас від випадкового заповнення всієї оперативної пам’яті та в основному знищення вашої системи. Він за замовчуванням становить половину вашої оперативної пам’яті.

Інші причини, чому написання можуть сповільнити

Сказане вище - це спрощення, адаптоване до вашого випадку. Запис у файли у вашому випадку не повинен чекати диска. Однак є деякі випадки написання, які є. Дивіться чудову публікацію в блозі, чому буферизовані записи іноді затримуються . Найдивовижніший випадок - нещодавня зміна Linux, яка називається "стабільна сторінка пише".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.