USB 장치인 시스템이 있습니다. 호스트가 업데이트 파일을 제공할 수 있도록 functionfs를 사용하여 USB를 통해 파티션 중 하나를 노출합니다.
set -e
CONFIGFS_ROOT=/dev/gadget
CONFIGFS_DEV=$CONFIGFS_ROOT/usb_gadget/device
mkdir -p $CONFIGFS_ROOT
mount -t configfs none $CONFIGFS_ROOT
mkdir $CONFIGFS_DEV
cd $CONFIGFS_DEV
### (device-level strings etc. omitted for brevity) ###
# Set up a config
mkdir configs/mass_storage.1
mkdir configs/mass_storage.1/strings/0x409
echo "Mass-storage configuration" >configs/mass_storage.1/strings/0x409/configuration
echo 100 >configs/mass_storage.1/MaxPower
# Add the function and connect our partition
mkdir functions/mass_storage.usb
readlink -e "/dev/disk/by-label/data" >functions/mass_storage.usb/lun.0/file
# Associate the function with the first config
ln -s functions/mass_storage.usb configs/mass_storage.1
이것은 호스트가 처음 마운트하고 데이터를 쓸 때(VFAT 파일 시스템을 사용하여) 잘 작동합니다. 그런 다음 장치의 어딘가에 마운트하여 사용할 수 있습니다.
그러나 우리가 응답을 작성하고 호스트가 우리에게 더 많은 업데이트를 보내면 데이터 손상이 표시됩니다. 이는 USB 대용량 저장소 인터페이스가 블록 캐시 계층 아래의 파티션을 수정함으로써 발생하는 것으로 추측됩니다.
나는 양쪽에 동시에 마운트된 파일 시스템이 없는지 확인했고 호스트 측은 이를 사용하여 파일 eject
시스템이 삭제되고 다른 곳에 기록될 수 있음을 알렸습니다(USB 대용량 저장소이기 때문에 자동으로 제거 가능합니다). . 그러나 장치 측에서는 파티션이 로컬(플래시) 저장소이므로 제거할 수 없습니다.
저장소가 대용량 저장소 가젯 기능에 의해 기록되었을 수 있으며 캐시된 블록이 정확하다고 가정할 수 없다는 것을 장치에서 인식할 수 있도록 할 수 있는 방법이 있습니까?