편집 2:
질문:
USB를 통해 Android에서 복사된 파일에 대해 Linux에 표시되는 파일 수정 시간은 stat
파일이 생성된 후 Android의 시간대 설정을 변경하면 영향을 받습니다.
재공연:
- 라이브 USB에서 Ubuntu 20.4(또는 Linux Mint 21)를 부팅합니다.
- Android(버전 11이 있고 9의 효과도 관찰함)에서는 날짜 시간과 시간대를 수동으로 설정하고 오프라인 모드로 설정합니다.
- USB를 통해 Android를 Linux에 연결합니다.
- Android에서 파일을 선택하고 파일 관리자를 통해 Linux의 location_1에 복사합니다.
stat
복사된 파일(location_1에 있는 파일)에서 실행합니다.- USB를 분리합니다(중요).
- Android의 시간대를 시간 단위로 변경하세요.
- USB를 다시 연결합니다.
- Android에서 동일한 파일을 location_2로 복사합니다.
stat
복사된 파일(location_2에 있는 파일)에서 실행합니다.Modify
온라인에서 몇 시간 만에 차이점을 확인해 보세요 .
작동하다:
2013년에 누군가가 질문을 했습니다.USB를 통해 Android와 Linux 간에 파일을 전송하는 방법은 무엇입니까?. 2018년의 업데이트된 답변에 따르면 mtp가 작동한다고 나와 있습니다.
이제 대부분의 Linux 배포판은 MTP와 잘 작동하는 것 같습니다. 내 경험상 Mint(Ubuntu 기반)는 기본적으로 잘 작동합니다.
실제로 USB로 장치를 연결하고, Nemo(GUI) 아이콘을 클릭하고, 스토리지를 마운트하면 GUI에서 파일을 전송할 수 있습니다.
방금 시간대가 중요하다는 것을 알았습니다. 휴대폰의 시간대를 변경하면 파일 수정 시간이 변경됩니다. Linux로 복사하면 stat
장치의 시간대에 관계없이 이러한 시간과 Linux 시간대(프레스)가 유지되므로 파일의 "원래"(모바일) 시간대 수정 정보가 손실됩니다. 제 생각에는 물리적으로 근접한 장치가 동일한 시간대로 설정되는 경우가 많기 때문에 거의 나타나지 않지만 이는 이상적인 효과는 아닙니다.
mtp
이 효과는 사물이 작동하는 방식 으로 인한 것입니까 , 아니면 다른 요인에 따라 달라질 수 있습니까? 파일을 복사할 때 두 장치가 모두 동일한 시간대로 설정되어 있는지 확인하지 않고 올바른 시간으로 복사하는 방법에 대한 제안 사항이 있습니까? 티아
추신: 버그를 보고하고 싶은데 Mint, Ubuntu, Debian, Kernel 등 어디에 있는지 잘 모르겠습니다.
추가된 예:
Android의 경우 파일 시간대 +1, Linux 시간대 +1
Android 수정 시간은 Linux Mint 21 시스템 기반 Nemo의 Android 파일 관리자 및 mtp 마운트에서 확인할 수 있습니다(예: 9:45:00).
ext4 fs로 복사한 후 Android의 시간대를 +3으로 변경하는 것을 stat
보여줍니다 (만약의 경우 USB 제거/재삽입/재설치). ext4의 다른 곳에 동일한 파일을 복사하면 Linux의 시간대가 +3으로 변경되는 것을 보여줍니다 . 두 번째 사본의 경우 다음 이 표시됩니다.Modify:
9:45:00.000000000 +0100
stat
11:45:00.000000000 +0100
stat
13:45:00.000000000 +0300
참고: GUI를 통해 도시별로 시간대를 선택할 때(그런데 Linux에서 다른 방법은 모르겠습니다) 날짜 저장 가능성으로 인해 결과가 1시간 정도 차이가 날 수 있습니다.
답변1
Android의 원시 타임스탬프: 9:45:00.000000000 +0100
= 8:45:00 UTC.
Android의 시간대를 +0300으로 변경하고 파일을 Linux로 전송한 후:
11:45:00.000000000 +0100
= 10:45:00 UTC
MTP 프로토콜 사양(ZIP 파일의 MTPforUSB-IFv1.1.pdf 페이지 22)은 타임스탬프를 ISO 8601 호환 날짜/시간 문자열로 처리하도록 프로토콜에 지시하지만 안타깝게도 시간대 표시는 없습니다.임의로 선택할 수 있는.
전송 중에 타임스탬프가 변경된다는 사실은 Android MTP 구현이 실제 파일 시스템 타임스탬프(UTC와 동일할 수 있음)를 사용하는 것이 아니라 Android UI에 표시되는 현지화된 타임스탬프를 사용하고 있음을 나타냅니다.
이 오류가 발생할 수 있는 세 가지 메커니즘을 발견했습니다.
- 안드로이드는 가능하다현지화된 타임스탬프를 UTC로 잘못 변환하는 중전송용현재의이미 UTC 형식으로 된 원시 파일 시스템 타임스탬프를 전송하는 대신 Android 시간대입니다. 이 경우 Android MTP 구현에는 Linux 구현에서도 사용되는 UTC 형식의 타임스탬프가 포함됩니다.
- Android는 Android에서 현지 시간을 사용하여 타임스탬프를 전송합니다.현재의시간대이지만,시간대가 지정되지 않았습니다.MTP DateTime 문자열에서 Linux는 타임스탬프가 자체 현지 시간대에 있다고 가정합니다.
- Android는 Android 현재 시간대의 현지 시간을 사용하여 타임스탬프를 전송하고 DateTime 문자열로 시간대를 지정하지만 Linux MTP 구현시간대 정보를 사용하지 않음, 자체 현지 시간대가 있다고 가정합니다.
Wireshark와 Linux usbmon
커널 모듈을 사용하여 USB 트래픽을 덤프하면 오류의 원인을 확인할 수 있습니다.
Linux에서 시간대를 변경한 후 두 번째 사본:
13:45:00.000000000 +0300
= 10:45:00 UTC = 11:45:00 +0100
실제 Linux 측 타임스탬프(및 오류)는 첫 번째 복사본과 정확히 동일합니다. 13:45:00 +0300 및 11:45:00 +0100 은 모두 동일한 순간인 10:00 UTC 를 참조하기 때문입니다. 동일한 타임스탬프가 다른 현지 시간대를 사용하여 렌더링됩니다.
Linux에서 처음으로 전송된 파일의 타임스탬프를 보면 이제 수정 시간도 13:45:00 +0300이어야 합니다. 이는 이제 현지 시간으로 포맷된 모든 타임스탬프가 +0300 시간대를 사용하여 표시되기 때문입니다.