Saya membeli kartu SD 64 GB dari eBay. Ini berfungsi dengan baik ketika saya membakar gambar ARM Arch Linux dan menggunakannya untuk mem-boot Raspberry Pi saya.
Namun, ketika saya mencoba membuat partisi ext4 tunggal di atasnya untuk menggunakan semua kapasitas kartu, kesalahan terjadi. mkfs.ext4
selalu berakhir dengan bahagia; Namun, partisi tidak dapat mount
diedit, selalu menimbulkan kesalahan dan dmesg
menampilkan pesan-pesan kernel Cannot find journal
. Ini telah terbukti menjadi kasus di setidaknya dua platform: Arch Linux ARM dan Ubuntu 13.04.
Di sisi lain, saya dapat membuat dan me-mount partisi FAT32 tanpa kesalahan (pemeriksaan kapasitas penuh belum dilakukan).
Saya mendengar bahwa beberapa orang jahat dapat mengubah antarmuka kartu SD untuk melaporkan kapasitas yang salah ke OS (yaitu kartu tersebut benar-benar hanya 2 GB tetapi ia melaporkan dirinya sendiri sebagai 64 GB) untuk menjual kartu dengan harga yang lebih baik.
Saya tahu bahwa alat seperti badblocks
ada bagi saya untuk memeriksa kartu SD untuk blok buruk. Bisakah badblocks
mendeteksi masalah seperti ini? Jika tidak, solusi apa yang ada bagi saya untuk menguji kartu?
Saya idealnya ingin tahu apakah saya dicurangi atau tidak; jika hasilnya menunjukkan saya baru saja menerima barang yang buruk, saya dapat kembali ke penjual saja, lebih baik melaporkan ke eBay bahwa seseorang mencoba menipu saya.
MEMPERBARUI
operasi dan pesan:
~$ sudo mkfs.ext4 /dev/sde1
mke2fs 1.42.5 (29-Jul-2012)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
4096000 inodes, 16383996 blocks
819199 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
500 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
~$ dmesg | tail
...
[4199.749118]...
~$ sudo mount /dev/sde1 /mnt
mount: wrong fs type, bad option, bad superblock on /dev/sde1,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so
~$ dmesg | tail
...
[ 4199.749118]...
[ 4460.857603] JBD2: no valid journal superblock found
[ 4460.857618] EXT4-fs (sde1): error loading journal
MEMPERBARUI
Saya telah menjalankan badblocks /dev/sde
tetapi tidak melaporkan kesalahan. Itu berarti sisa penyebabnya adalah:
Mobil SD bagus tetapi karena beberapa alasan
mke2fs
ataumount
atau kernel memiliki bug yang menyebabkan masalah.Saya ditipu dengan cara yang
badblocks
tidak bisa mendeteksi kekalahan. Ini masuk akal karena saya pikirbadblocks
hanya melakukan beberapa tes tulis-baca di tempat. Namun, penipu dapat membuat akses ke area keluar tautan kembali ke beberapa blok masuk. Dalam hal ini cek baca-baca di tempat tidak dapat mendeteksi masalah.
Jika tidak ada aplikasi yang dapat melakukan tes yang tepat, saya pikir saya dapat mencoba menulis program C sederhana untuk mengujinya.
sumber
dmesg
menampilkan pesan-pesan kernel dan saya yakin itu muncul bersamaan dengan kesalahan karena saya melakukan itu sebelum dan sesudah dan membandingkannya. Saya belum memeriksasyslog
karena saya yakindmesg
akan menampilkan pesan.Jawaban:
Jika ada yang melihat ini nanti: Seseorang menulis alat sumber terbuka yang disebut "F3" untuk menguji kapasitas kartu SD dan media lainnya. Itu dapat ditemukan di hompage proyek dan di Github .
sumber
Kecurangan sekarang telah dikonfirmasi oleh langkah-langkah berikut:
Hasilkan file data acak. (4194304 = 4 × 1024 × 1024 = 4 MiB, ukuran total = 40 × 4 MiB = 160 MiB)
Perintah:
Salin data ke kartu SD. (2038340 × 4096 = 8153600 KiB = 7962,5 MiB)
Perintah:
Baca kembali data dari kartu SD.
Perintah:
Tunjukkan hasilnya
Perintah:
Apa yang terjadi? Kami mengamati celah nol. Ini merupakan indikator bahwa data acak belum benar-benar ditulis ke kartu. Tetapi mengapa data kembali setelahnya
1a81000
? Jelas kartu memiliki cache internal.Kami juga dapat mencoba menyelidiki perilaku cache.
tidak memberikan hasil, yang berarti bahwa sampah yang dihasilkan tidak memiliki pola seperti itu. Namun,
punya 4 pertandingan.
Jadi inilah mengapa ia melewati
badblocks
pemeriksaan. Tes lebih lanjut dapat menunjukkan bahwa kapasitas sebenarnya adalah 7962,5 MB, atau sedikit kurang dari 8 GB.Saya menyimpulkan bahwa ini sangat tidak mungkin hanya kegagalan perangkat keras acak, tetapi lebih cenderung menjadi semacam kecurangan (yaitu, penipuan). Saya ingin tahu tindakan apa yang bisa saya ambil untuk membantu korban lainnya.
Pembaruan 11/05/2019
Orang-orang bertanya kepada saya tentang bagaimana cara mengetahui
seek
parameter yang benar2038399
. Saya melakukan lebih banyak pengalaman daripada yang saya tunjukkan di atas. Pada dasarnya Anda harus menebak sejak awal. Anda harus menebak ukuran data yang tepat, dan Anda harus menebak di mana korupsi data itu. Tetapi Anda selalu dapat menggunakan metode membagi dua untuk membantu.Dalam komentar di bawah, saya pikir saya berasumsi bahwa langkah kedua di atas (menyalin data ke kartu SD) hanya menyalin 1 sektor. Tapi saya tidak melakukan kesalahan ini dalam pengalaman saya. Alih-alih,
seek
itu untuk menunjukkan bahwa pada langkah "tampilkan hasil" offset1000
hanya terjadi di sektor kedua data. Jikaseek
sektor 2038399, korupsi di sektor 2038400.sumber
bs=4194304 count=40
saat membaca dari/dev/urandom
tetapibs=4096 count=40960
ketika menulis ke dan membaca dari kartu SD? (Mereka secara matematis setara; masing-masing 167772160 bytes.)seek
, jadi saya hanya menulis 1 sektor ke kartu, yang menghemat jumlah transfer data. Sebabnya, ketika bereksperimen saya menggunakan blok data yang lebih besar, ini sebabnya file data yang dihasilkan adalah 160MiB.sudo dd if=test.orig of=/dev/sde seek=2038399 bs=4096
. Dan jelas Anda benar; itu menggunakanseek
. Dan, ya, secara teknis, itu tidak digunakancount
. … (Lanjutan)count
spesifikasi,dd
transfer seluruh input (mis., itu mentransfer hingga EOF atau kesalahan). Jadi perintah itu mentransfer seluruh kontentest.orig
, yaitu 40.960 catatan masing-masing 4096 byte, dengan total 167772160 byte (seperti yang saya katakan).Pertama-tama, baca jawaban F3 oleh @Radtoo. Itu cara yang benar.
Entah bagaimana saya melewatkannya, dan mencoba caranya sendiri:
buat file uji 1gb:
dd if=/dev/urandom bs=1024k count=1024 of=testfile1gb
tulis salinan file itu ke sdcard (64 adalah ukuran sdcard dalam gb):
for i in $(seq 1 64); do dd if=testfile1gb bs=1024k of=/media/sdb1/test.$i; done
periksa MD5 file (semua kecuali yang terakhir, tidak lengkap, harus cocok):
md5sum testfile1gb /media/sdb1/test.*
sumber
Cara paling sederhana untuk menguji kapasitas penuh kartu SD adalah mengisinya dengan file, lalu memverifikasi file-file itu benar:
diff -qr /directory/on/computer /directory/on/SD
Atau, Anda dapat menggunakan program untuk menulis pola, atau rantai hash, ke file, dan kemudian memverifikasi bahwa mereka benar.
Seperti yang ditunjukkan oleh @Earthy Engine , penting untuk mengisi kartu SD, lalu membaca data, sebagai pendekatan tradisional yang hanya menulis sekumpulan kecil data, lalu membacanya, terkecoh dengan kartu SSD palsu.
sumber
Saya menulis skrip kecil yang melakukan hal berikut.
-membuat direktori sementara ke USB target atau kartu SC
-membuat file referensi 5MB yang dibuat secara acak dengan md5sum checksum -menyalin file referensi ke target dan menghasilkan cek md5sum dari target untuk mengkonfirmasi keberhasilan baca / tulis -mengisi target ke kapasitas (100%) atau berhenti ketika kesalahan checksum terjadi -Setelah skrip berhenti secara alami, ini akan menampilkan ukuran target yang dilaporkan, jumlah Digunakan dan Gratis.Dengan skrip ini saya menyimpulkan bahwa saya ditipu oleh penjual ebay yang melewatkan microSD 8GB untuk 64GB
sumber
Orang dapat menulis urutan angka (setiap baris adalah 16 byte) dan kemudian memverifikasi isinya:
Kemudian verifikasi lewati == output (menggunakan sampel kecil nilai lewati yang lebih kecil dari jumlah catatan tertulis) misalnya lewati = 9876 :
Atau, buat sampel 20 lokasi dengan satu liner:
of=tempFileOnSD
, jika Anda ingin menghindari penghancuran data yang disimpan kartu Anda (hanya relevan jika itu bukan palsu)sumber
seq -w 0 123456789012345 > /dev/yourSdHere
danseq -w 0 123456789012345 | cmp - /dev/yourSdHere
?