中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助
鲲鹏小智

使用SPDK加解密特性

本特性在SPDK bdev层使能crypto特性,并通过openssl进行加解密,并可选择KAE引擎进行加解密卸载以提升加解密性能或降低CPU消耗,当前版本支持的加密算法包括对称加密算法AES_CBC,AES_CTR,SM4_CBC,SM4_CTR以及非对称加密算法RSA。

  1. 分配大页内存。

    请根据实际需求进行分配,此处以分配40000个2MB的大页为例。

    echo 0 >/sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
    echo 20000 >/sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
    echo 20000 >/sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
  2. 启动SPDK进程。
    ./build/bin/nvmf_tgt --wait-for-rpc
  3. 设置加密驱动为openssl。
    ./scripts/rpc.py bdev_crypto_set_driver -d crypto_openssl
  4. (可选)设置openssl引擎为KAE。
    ./scripts/rpc.py bdev_cryptodev_set_engine -e crypto_engine_kae
  5. 初始化程序框架。
    ./scripts/rpc.py framework_start_init
  6. 创建加密盘,以下针对当前版本支持的加密算法分别给出示例,可根据实际使用场景选择需要的加密算法并创建对应的加密盘。

    创建AES_CBC加密盘。

    针对具体命令可通过-h或spdk官方文档获取使用方法。

    [root@ceph1 spdk]# ./scripts/rpc.py bdev_aio_create -h
    usage: rpc.py [options] bdev_aio_create [-h] filename name [block_size]
    
    positional arguments:
      filename    Path to device or file (ex: /dev/sda)
      name        Block device name
      block_size  Block size for this bdev
    
    optional arguments:
      -h, --help  show this help message and exit
    ./scripts/rpc.py bdev_aio_create /dev/sda sda
    ./scripts/rpc.py bdev_crypto_create sda crypto_aes_cbc crypto_openssl 0123456789123456 -c AES_CBC

    创建AES_CTR加密盘。

    ./scripts/rpc.py bdev_aio_create /dev/sdb sdb
    ./scripts/rpc.py bdev_crypto_create sdb crypto_aes_ctr crypto_openssl 0123456789123456 -c AES_CTR

    创建SM4_CBC加密盘。

    ./scripts/rpc.py bdev_aio_create /dev/sdc sdc
    ./scripts/rpc.py bdev_crypto_create sdc crypto_sm4_cbc crypto_openssl 0123456789123456 -c SM4_CBC

    创建SM4_CTR加密盘。

    ./scripts/rpc.py bdev_aio_create /dev/sdd sdd
    ./scripts/rpc.py bdev_crypto_create sdd crypto_sm4_ctr crypto_openssl 0123456789123456 -c SM4_CTR

    创建非对称加密盘需要先创建rsa密钥,当前版本仅支持4096的rsa密钥。

    openssl genrsa -out prikey.pem 4096

    以CRT模式创建RSA加密盘。

    ./scripts/rpc.py bdev_aio_create /dev/sde sde
    ./scripts/rpc.py bdev_crypto_create sde crypto_rsa_crt crypto_openssl prikey.pem -c RSA -k2 CRT

    以NED模式创建RSA加密盘。

    ./scripts/rpc.py bdev_aio_create /dev/sdf sdf
    ./scripts/rpc.py bdev_crypto_create sdf crypto_rsa_ned crypto_openssl prikey.pem -c RSA -k2 NED
  7. 挂载nvme。

    本步骤以步骤6创建的crypto_aes_cbc 为例进行挂载nvme的操作。

    针对具体命令可通过-h或spdk官方文档获取使用方法。

    [root@ceph1 spdk]# ./scripts/rpc.py nvmf_create_subsystem -h
    usage: rpc.py [options] nvmf_create_subsystem [-h] [-t TGT_NAME] [-s SERIAL_NUMBER] [-d MODEL_NUMBER] [-a] [-m MAX_NAMESPACES] [-r] nqn
    
    positional arguments:
      nqn                   Subsystem NQN (ASCII)
    
    optional arguments:
      -h, --help            show this help message and exit
      -t TGT_NAME, --tgt_name TGT_NAME
                            The name of the parent NVMe-oF target (optional)
      -s SERIAL_NUMBER, --serial-number SERIAL_NUMBER
                            Format: 'sn' etc Example: 'SPDK00000000000001'
      -d MODEL_NUMBER, --model-number MODEL_NUMBER
                            Format: 'mn' etc Example: 'SPDK Controller'
      -a, --allow-any-host  Allow any host to connect (don't enforce allowed host NQN list)
      -m MAX_NAMESPACES, --max-namespaces MAX_NAMESPACES
                            Maximum number of namespaces allowed
      -r, --ana-reporting   Enable ANA reporting feature
    ./scripts/rpc.py nvmf_create_transport -t TCP -u 16384 -m 8 -c 8192
    ./scripts/rpc.py nvmf_create_subsystem nqn.2024-08.io.spdk:crypto_aes_cbc -a -s SPDK00000000000001 -d SPDK_Controller1
    ./scripts/rpc.py nvmf_subsystem_add_ns nqn.2024-08.io.spdk:crypto_aes_cbc crypto_aes_cbc
    ./scripts/rpc.py nvmf_subsystem_add_listener nqn.2024-08.io.spdk:crypto_aes_cbc -t TCP -a 90.90.82.112 -s 4420
    nvme discover -t tcp -a 90.90.82.112 -s 4420
    nvme connect -t tcp -n "nqn.2024-08.io.spdk:crypto_aes_cbc" -a 90.90.82.112 -s 4420 -g -G
  8. 读写测试。
    fio -filename=/dev/nvme0n1 -direct=1 -iodepth=64 -thread -rw=randwrite -ioengine=libaio -bs=4k -size=10G -numjobs=1 -group_reporting -name=mytest --verify_pattern=0x12345678 -verify=pattern -do_verify=1
    fio -filename=/dev/nvme0n1 -direct=1 -iodepth=64 -thread -rw=randread -ioengine=libaio -bs=4k -size=10G -numjobs=1 -group_reporting -name=mytest --verify_pattern=0x12345678 -verify=pattern -do_verify=1