現在真實的持久化內存對於我們普通人來說還不可用,在進行實驗和測試的時候可能需要我們模擬持久化內存來進行使用。
現在在一臺主機(沒有服務器o(╥﹏╥)o)上測試劃分一塊內存區域來進行持久化內存的模擬。
環境:Ubuntu 18.04,一臺普通的Dell臺式機,運行內存 8 G。
從Linux 4.0以來,Linux內核就具備了對持久性內存設備和仿真的支持,但是,爲了便於配置,建議使用比4.2更新的內核。
在內核中,使用對文件系統的DAX擴展創建了一個支持PMEM的環境。某些發行版(如Fedora 24及更高版本)內置了DAX / PMEM支持。
要了解內核是否支持DAX和PMEM,可以使用以下命令:
# egrep ‘(DAX|PMEM)’ /boot/config-`uname –r`
如果內置了支持就會輸出類似如下的內容:
CONFIG_X86_PMEM_LEGACY_DEVICE=y
CONFIG_X86_PMEM_LEGACY=y
CONFIG_BLK_DEV_RAM_DAX=y
CONFIG_BLK_DEV_PMEM=m
CONFIG_FS_DAX=y
CONFIG_FS_DAX_PMD=y
CONFIG_ARCH_HAS_PMEM_API=y
但是很遺憾,我們的Ubuntu 18.04沒有內置對DAX/PMEM的支持,所以輸入上述命令什麼輸出都沒有:
接下來就在Ubuntu 18.04上模擬持久化內存。
由於在Ubuntu 18.04上默認沒有支持DAX和PMEM,所以需要我們重新編譯內核,並在編譯內核的配置選項中加入相關設置。
在這裏重新編譯內核,我選擇的版本是Linux-4.15。
首先輸入命令:
make nconfig
進入到如下的配置界面,由於照片是直接用手機拍攝的,所以有一點歪,還請見諒。
配置PMEM和DAX
Device Drivers
NVDIMM Support
<M>PMEM;
<M>BLK;
<*>BTT
<*>NVDIMM DAX
配置PMEM
先進入到Device Drivers中
在Device Drivers中找到NVDIMM Support,需要將菜單欄向下翻,裏面的內容並不只是我們看到的第一頁,NVDIMM Support 不在第一頁上:
進入到NVDIMM Support 中,將裏面的內容都選中:
<M>PMEM;
<M>BLK;
<*>BTT
<*>NVDIMM DAX
配置文件系統DAX
使用esc回到make nconfig的初始頁面
File System
<*>Direct Access support
處理器特性設置
使用esc回到make nconfig的初始頁面
Processor type and features
<*>Support non-standard NVDIMMs and ADR protected memory
其實上述所有過程,在Linux-4.15中默認都已經做了,也就是我只要 make nconfig就可以了~
所有這些配置好之後就開始編譯以及安裝內核:
# make -j8
# make modules_install install
然後進入到新編譯的內核Linux-4.15中
使用下面的命令打印出e820表:
dmesg | grep e820
得到如下的內容:
[ 0.000000] e820: BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009d7ff] usable
[ 0.000000] BIOS-e820: [mem 0x000000000009d800-0x000000000009ffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000001fffffff] usable
[ 0.000000] BIOS-e820: [mem 0x0000000020000000-0x00000000201fffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000020200000-0x0000000040003fff] usable
[ 0.000000] BIOS-e820: [mem 0x0000000040004000-0x0000000040004fff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000040005000-0x00000000d197dfff] usable
[ 0.000000] BIOS-e820: [mem 0x00000000d197e000-0x00000000d19c0fff] ACPI NVS
[ 0.000000] BIOS-e820: [mem 0x00000000d19c1000-0x00000000d6d7dfff] usable
[ 0.000000] BIOS-e820: [mem 0x00000000d6d7e000-0x00000000d6ffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000d7000000-0x00000000d7741fff] usable
[ 0.000000] BIOS-e820: [mem 0x00000000d7742000-0x00000000d77fffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000d7800000-0x00000000d7fb3fff] usable
[ 0.000000] BIOS-e820: [mem 0x00000000d7fb4000-0x00000000d7ffffff] ACPI data
[ 0.000000] BIOS-e820: [mem 0x00000000d8000000-0x00000000d9720fff] usable
[ 0.000000] BIOS-e820: [mem 0x00000000d9721000-0x00000000d97fffff] ACPI NVS
[ 0.000000] BIOS-e820: [mem 0x00000000d9800000-0x00000000daf23fff] usable
[ 0.000000] BIOS-e820: [mem 0x00000000daf24000-0x00000000dafa5fff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000dafa6000-0x00000000dafa6fff] usable
[ 0.000000] BIOS-e820: [mem 0x00000000dafa7000-0x00000000df9fffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000f8000000-0x00000000fbffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000fec00000-0x00000000fec00fff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000fed00000-0x00000000fed03fff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000fed1c000-0x00000000fed1ffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000ff000000-0x00000000ffffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000100000000-0x000000021f5fffff] usable
上述的usable就是我們可以使用的,從中可以劃分部分區域來作爲我們的持久化內存,在這裏建議選取:
[ 0.000000] BIOS-e820: [mem 0x0000000100000000-0x000000021f5fffff] usable,其中0x0000000100000000就是4G,我們需要配置grub來設置
vi /etc/default/grub
我在裏面直接配置4G的空間來模擬持久化內存,在grub中添加如下語句,表示從4G開始,空間爲4G大小的內存空間用來模擬持久化內存。
GRUB_CMDLINE_LINUX="memmap=4G!4G"
配置好後,更新grub:
sudo update-grub
使用下面的命令查看是否成功:
可以看到,這塊區域已經被模擬爲了持久化內存,然後我們在主機 /dev目錄下可以看到pmem0的設備:
現在就可以對模擬的持久化內存進行使用了~
使用方式——建立DAX文件系統
以ext4文件系統爲例
mkdir /mnt/pmemdir
mkfs.ext4 /dev/pmem0
mount -o dax /dev/pmem0 /mnt/pmemdir
這樣就將目錄 /mnt/pmem掛載到了持久化內存上,這個目錄在之後的使用過程中就會用到。
參考: