NVMe SSD Trim在数据安全中的作用

Trim在SCSI 里面的同等命令叫做UNMAP,NVMe里面叫Deallocate,文件系统叫做discard。通过trim指令可以告诉SSD哪些数据已经不需要了,可以内部擦除。

在SSD存储系统中,定期主动执行trim指令,能够减少因IO触发的写放大,从而提升IO性能。另外,主动trim后,再次读取返回0,这样使client无法读取已经删除的数据,有利于数据安全(隐私),特别是在公有云中,存储系统主动trim是很有必要的。以下是原理解释和代码验证。

NVMe接收到Deallocate Command后,会标记这些数据块,再次读这些数据块对应的LBA 时返回0。
Zeroout ioctl 通过__blkdev_issue_zeroout发送写0命令,在block层,拆分成128KB blocksize,要求偏移量和长度512B对齐。
NVMe:The NVM Express command set has a generic Dataset Management command, for hinting the host's intent to the storage device on a set of block ranges. One of its operations, deallocate performs trim. It also has a Write Zeroes command that provides a deallocate hint and allows the disk to trim and return zeroes.
 参考:https://en.wikipedia.org/wiki/Trim_(computing)

代码验证:

#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <stdint.h>
#include <string.h>
#include <malloc.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>

#define BLKDISCARD	_IO(0x12,119)
#define OFFSET (0)
#define BUF_SIZE (512<<10)
static int trim_test(int fd, uint64_t start, uint64_t len)
{
	uint64_t r[2];
	r[0] = start;
	r[1] = len;
	return ioctl(fd, BLKDISCARD, &r);
}

int main()
{
	int fd;
	char* dev_name = "/dev/nvme";
	void* buf = NULL;

	fd = open(dev_name, O_RDWR | O_DIRECT);
	if (fd < 0)
	{
		perror("Failed to open device");
		return errno;
	}
	buf = memalign(4096,BUF_SIZE);
	memset(buf, 0, BUF_SIZE);
	strcpy(buf,"ssd trim test");
	strcpy(buf + BUF_SIZE - 4096,"ssd trim test");
	int len = pwrite(fd, buf, BUF_SIZE, OFFSET);
	if (len < 0)
	{
		perror("write device failed");
		return errno;
	}
	memset(buf, 0, BUF_SIZE);
	len = pread(fd, buf, 4096, OFFSET);
	printf("before trim:%s\n", (char*)buf);
	memset(buf, 0, BUF_SIZE);
	len = pread(fd, buf, 4096, OFFSET+BUF_SIZE-4096);
	printf("without trim:%s\n", (char*)buf);
	if (trim_test(fd,OFFSET,4096) < 0)
	{
		perror("failed to trim");
		return errno;
	}
	memset(buf, 0, BUF_SIZE);
	len = pread(fd, buf, 4096, OFFSET);
	printf("after trim:%s\n", (char*)buf);
	memset(buf, 0, BUF_SIZE);
	len = pread(fd, buf, 4096, OFFSET+BUF_SIZE-4096);
	printf("without trim:%s\n", (char*)buf);
	
	return 0;
}

结果在trim之后数据消失,说明能够保护数据安全,也提供了另外一种删除数据的方法:

before trim:ssd trim test
without trim:ssd trim test
after trim:
without trim:ssd trim test

NVMe SSD Trim在数据安全中的作用_未冬生-CSDN博客_nvme trim

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: NVMe SSD写入数据的过程可以通过以下步骤来描述。首先,主机将数据发送到IO submission queue,这是一个用于存储待写入数据的队列。然后,SSD控制器从IO submission queue获取数据,并将其写入SSD的NAND闪存芯片。写入过程SSD控制器会将数据分成小块,称为页,然后逐页写入到NAND闪存芯片。每个页通常包含几KB的数据。写入完成后,SSD控制器会将写入操作的结果发送到completion queue,以通知主机写入操作的完成。这样,主机就可以对SSD上的数据进行读写操作了。\[2\] NVMe SSD的DWPD(Diskful Writes Per Day)参数是一个重要的评测数据,它表示在预期寿命内,SSD可以每天完整写入其所有容量的次数。这个参数可以作为参考SSD寿命和性能的重要指标。\[1\] SSD的存储容量取决于其拥有的NAND闪存芯片的数量,现代技术使得SSD可以具有与传统硬盘驱动器(HDD)相似的存储容量。\[3\] #### 引用[.reference_title] - *1* [聊一聊 NVMe SSD 存储介质](https://blog.csdn.net/hffwj/article/details/121423957)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [PCIe和NVMe SSD初始化过程简介](https://blog.csdn.net/mm624191030/article/details/121244565)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【转】SSD、HDD、NVMe区别](https://blog.csdn.net/jsCPB/article/details/127903690)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值