
저는 TinyCore의 RAM 내 버전(Linux 버전 4.19.10-tinycore)을 배포하기 위해 pxelinux를 사용하고 있습니다. 최신 BIOS(현재)를 갖춘 Z270-A 마더보드에서 실행되고 있습니다. PXE는 레거시 모드로 부팅됩니다.
네트워크를 통해 SSD 이미지를 배포하고 RandomAccessFile을 사용하여 작성하는 Java 애플리케이션을 작성했습니다. 글을 쓸 때 이상한 행동을 경험했습니다. 특히 다음과 같습니다.
print_req_error: I/O error, dev sda, sector 42319888
Buffer I/O error on dev sda, logical block 5289986, async page read
ata1: EH complete
ata1.00: Enabling discard_zeroes_data
ata1.00: exception Emask 0x0 SAct 0x40000 SErr 0x0 action 0x0
ata1.00: irq_stat 0x40000008
ata1.00: failed command: READ FPDMA QUEUED
ata1.00: cmd 60/08:90:10:c0:85/00:00:02:00:00/40 tag 18 ncq dma 4096 in
res 41/40:00:10:c0:85/00:00:02:00:00/40 Emask 0x409 (media error) <F>
ata1.00: status: { DRDY ERR }
ata1.00: error: { UNC }
ata1.00: configured for UDMA/133
sd 0:0:0:0: [sda] tag#18 UNKNOWN(0x2003) Result: hostbyte=0x00 driverbyte=0x08
sd 0:0:0:0: [sda] tag#18 Sense Key : 0x3 [current]
sd 0:0:0:0: [sda] tag#18 ASC=0x11 ASCQ=0x4
sd 0:0:0:0: [sda] tag#18 CDB: opcode=0x28 28 00 02 85 c0 10 00 00 08 00
print_req_error: I/O error, dev sda, sector 42319888
Buffer I/O error on dev sda, logical block 5289986, async page read
ata1: EH complete
ata1.00: Enabling discard_zeroes_data
NCQ를 비활성화하려고 시도했지만 libata.force=noncq
소용이 없었습니다.
이상한 점은,내 프로그램을 사용하여 장치를 지운 dd if=/dev/zero of=/dev/sda bs=1M
다음 다시 데이터를 쓰려고 할 때 이러한 오류가 발생하지 않습니다. 드라이브를 0으로 채우면 문제가 해결되는 것처럼 보이지만 시간이 많이 걸리고 장치 상태에 도움이 되지 않습니다.
이러한 이유로 실제 데이터를 쓰기 전에 위 명령을 시뮬레이션하기 위해 0을 쓰는 방식으로 이미지를 작성하는 프로그램을 구현했습니다. 그럼에도 불구하고 오류가 계속 발생합니다.
smartctl -a /dev/sda
나쁜 징후는 보이지 않습니다. 저는 Silicon Power S55 및 Micron 1100과 같은 여러 장치에서 이런 일이 발생하는 것을 보았습니다.오직이 설정에서 발생합니다. 설치된 Ubuntu 18.04 버전에서는 이런 일이 발생하지 않았습니다(RAM이 아닌 디스크에서 실행됨).
RAM에는 결함이 없으며 memtest로 테스트했습니다. Corsair RM1000i에서 실행되는 모든 케이블은 양호합니다.
다음은 출력입니다.dmesg. 이 문제를 해결할 방법을 찾을 수 없는 것 같습니다. 이 시점에서 길을 잃었습니다. 또한, 여기는smartctl산출.
편집: 항상 같은 부문에서 발생하는 것은 아닙니다. 때로는 과거에 잘 작동했던 부문에서 이런 일이 발생합니다. 무작위로 보입니다.
EDIT2: 내 프로그램은 /dev/sda
파일로 열리고 해당 파일에서 I/O를 실행합니다(이것이 디스크에 쓰는 방법입니다).
답변1
메시지가 실제로 잘못된 오류인 것 같습니다. Java 코드를 변경했습니다. FileOutputStream
이제 다음 편리한 라이브러리를 사용합니다.http://www.nicecode.eu/java-streams-for-direct-io/
JNA를 사용하여 파일에 대한 기본 I/O 액세스를 제공하며 O_DIRECT 플래그를 설정할 수 있습니다. 라이브러리를 수정하여 버퍼를 BLOCK_SIZE(512바이트)에서 512KB(512*1024)로 늘렸습니다. 버퍼 크기는 블록 크기의 배수여야 하며 O_DIRECT의 경우 512바이트여야 합니다. 이런 방식으로 속도는 Java의 기본이 아닌 구현과 비슷할 정도로 합리적입니다.
md5sum
이전에 테스트한 Silicon Power SSD나 새로운 Micron SSD 모두에 대해 더 이상 오류가 없으며 모든 데이터가 유효합니다( 를 사용하여 확인됨 ).