덮어쓰지 않고 USB 플래시 드라이브에 사용자 정의 일련 번호 저장

덮어쓰지 않고 USB 플래시 드라이브에 사용자 정의 일련 번호 저장

저는 USB 플래시 드라이브를 많이 사용하고 있습니다. USB 드라이브의 이벤트를 추적하고 싶습니다. 구체적으로는 테스트를 수행하고 f3, 드라이브를 포맷하고, 드라이브에 데이터를 씁니다.

일련 번호를 그대로 유지하면서 드라이브에서 다양한 작업을 수행할 수 있도록 드라이브에 디지털 태그를 지정하는 방법(예: UUID 사용)을 찾고 있습니다. 다른 사람이 드라이브를 사용하고 포맷한 후에도 나중에 일련 번호를 읽을 수 있었으면 좋겠습니다.

USB 장치에서 보고된 일련 번호를 사용해 보았지만 대부분의 드라이브에는 고유 식별 정보가 저장되어 있지 않다는 사실을 금방 발견했습니다.

그래서 저는 해당 문자열을 드라이브에 쓰고 다시 읽어서 올바르게 저장되었는지 확인할 수 있도록 자체 CRC와 연결을 사용하여 UUID를 생성하는 수고를 겪었습니다.

그러나 일련 번호를 파일 시스템에 기록한다는 것은 드라이브가 가득 차면 일련 번호의 모든 복사본을 덮어쓰게 된다는 것을 의미합니다.

최근 아이디어는 일련 번호를 저장할 수 있도록 드라이브를 분할하고 분할되지 않은 1MB의 빈 공간을 남겨 두는 것입니다.

이는 드라이브의 유용성에 미미한 영향을 미치지만 드라이브가 다시 분할되지 않는 한 드라이브를 어느 정도 안정적으로 식별할 수 있게 해줍니다.

이상적으로는 각 드라이브가 대용량 저장 드라이브 칩에 UUID를 기록하고 이를 보고하는 것입니다. 하지만 저는 드라이브를 만들지 않습니다.

나는 다음과 같은 일련 번호 생성을 고려했습니다 (Bash).

UUID=$(uuidgen)
CK=$(echo "$UUID" | cksum | cut -c -8)
SN="SN:$UUID:$CK;"
echo $SN

이는 UUID를 생성하고 UUID의 CRC 합계를 계산하여 합계의 처음 8자만 남깁니다(길이는 다양할 수 있고 패턴을 효율적으로 검색하려면 일정한 길이가 필요하기 때문입니다). 그런 다음 데이터 스트림에서 숫자를 추출하고 손상되지 않았는지 확인하는 데 사용할 수 있는 일부 태그와 연결합니다.

일련번호 예:

SN:7199e42e-465b-4baf-96b6-a109247d3f4b:39272476;
SN:aa795142-fa2e-4929-b93b-e991f95a74cd:40619286;
SN:43f93702-eda9-4089-9a81-d21172e051bf:37174302;

그런 다음 다음과 같이 일련 번호의 무결성을 확인할 수 있습니다.

SN="SN:7199e42e-465b-4baf-96b6-a109247d3f4b:39272476;"
UUID=$(echo "$SN" | cut -d':' -f2)
CK=$(echo "$SN" | cut -d':' -f3 | cut -d';' -f1)
if [[ $(echo "$UUID" | cksum | cut -c -8) == $CK ]]; then
    echo "SN is fine"
else echo "SN is corrupted"; fi

다음을 사용하여 드라이브에서 일련 번호를 추출할 수도 있습니다 grep.

cat /dev/sdX | grep -E "SN:.{8}-.{4}-.{4}-.{4}-.{12}:.{8};" -o

그런 다음 일련 번호 목록을 가져와 일치하는 체크섬이 있는 번호를 찾을 때까지 평가합니다.

잠재적으로 결함이 있는 드라이브를 사용하고 있기 때문에 최소한 하나의 사본이 유지되도록 여러 사본에 일련 번호를 기록해야 합니다.

물론 플래시를 직접 만들지 않고도 내가 하려는 일을 달성할 수 있는 더 좋은 방법이 있는지 궁금합니다.

편집자: 우드와드

고유 식별자를 얻기 위해 드라이브 자체의 다양한 읽기 전용 정보를 사용해 볼 수 있습니다.

$ udevadm info /dev/sdd | grep -e "ID_MODEL" -e "ID_SERIAL" -e "ID_VENDOR"
E: ID_MODEL=Flash_Disk
E: ID_MODEL_ENC=Flash\x20Disk\x20\x20\x20\x20\x20\x20
E: ID_MODEL_ID=6387
E: ID_SERIAL=Generic_Flash_Disk_97C06F44-0:0
E: ID_SERIAL_SHORT=97C06F44
E: ID_VENDOR=Generic
E: ID_VENDOR_ENC=Generic\x20
E: ID_VENDOR_ID=058f

$ udevadm info /dev/sdd | grep -e "ID_MODEL" -e "ID_SERIAL" -e "ID_VENDOR" | md5sum | cut -d' ' -f1
7b7f63b829b6301cdf35d71eed9bb707

그러나 여기서는 동일한 값을 반환하는 많은 드라이브를 만나게 될 것이라고 거의 확신합니다. 이로 인해 이 접근 방식은 쓸모 없게 됩니다.

편집 2:

거의 1600개의 데이터 포인트를 축적했고 대부분의 드라이브는 고유한 해시를 생성하는 것 같지만 여전히 동일한 해시를 반환하는 드라이브가 약 400개 있으므로 이 방법만으로는 충분하지 않습니다.

답변1

장치의 ID는 ID_SERIAL종종 장치의 신원을 확인하는 데 사용될 수 있습니다.

이는 장치 자체의 속성이므로 여러 형식에 걸쳐 지속되지만, 내가 아는 한 동일한 이유로 변경할 수 없습니다.

다음을 실행하여 얻을 수 있습니다.udevadm info /dev/sdX | grep ID_SERIAL=

답변2

지속적인 장치 이름 지정(다른 마운트 지점에 동일한 이름)은 달성하기 어려운 목표입니다. 아래와 같이 여러 UUID가 여러 컨테이너(파일 시스템, 마운트 지점 등)에 생성됩니다.자세한 설명은 여기.

UUID(실제로는 WWID(Worldwide Identifier))USB 장치의 하드웨어에 의해 제공됨연결은 다음과 같이 제공될 수 있습니다.

ls -l /dev/disk/by-id/

그러나 모든 장치가 이러한 번호를 지원하는 것은 아닙니다.

답변3

일부 플래시 드라이브는 포맷 후 고유하게 식별할 수 없습니다. 가장 좋은 방법은 사용자 정의 파티션 UUID를 설정하거나 더 나은 스토리지로 업그레이드하는 것입니다.

https://superuser.com/questions/1247972/change-uuid-of-vfat-partition

관련 정보