I recently bought a SanDisk Ultra 16GB microSD without SD Adapter from lazada, the price is Php 222, currently at 60% discount. There are a lot of positive reviews about it, so I chose Cash-On-Delivery and ordered two of them.
After 13 hours, the order arrived in a lazada plastic packaging with a bubble wrap inside.

I immediately tested the product using a program called F3 and it stands for “Fight Fake Flash“ or “Fight Flash Fraud“. It is available in the Debian GNU/Linux package repository and you can install it using the command

$ sudo apt install f3

If your distribution does not have that package, I will advise you to build and install it yourself.

Building and Installation

Download the latest release on https://github.com/AltraMayor/f3/releases
or just clone the entire repository (this requires git):

$ git clone https://github.com/AltraMayor/f3/

Uncompress the downloaded tar.gz and cd to that directory:


$ tar xvf f3-7.1.tar.gz
$ cd f3-7.1/
$ make
$ sudo make install

Output of commands:


$ ls
$ tar xvf f3-7.1.tar.gz 
f3-7.1/
f3-7.1/.gitignore
f3-7.1/LICENSE
f3-7.1/Makefile
f3-7.1/README.rst
f3-7.1/changelog
f3-7.1/doc/
f3-7.1/doc/Makefile
f3-7.1/doc/conf.py
f3-7.1/doc/contribute.rst
f3-7.1/doc/history.rst
f3-7.1/doc/index.rst
f3-7.1/doc/introduction.rst
f3-7.1/doc/usage.rst
f3-7.1/f3brew.c
f3-7.1/f3fix.c
f3-7.1/f3probe.c
f3-7.1/f3read.1
f3-7.1/f3read.c
f3-7.1/f3write.c
f3-7.1/f3write.h2w
f3-7.1/libdevs.c
f3-7.1/libdevs.h
f3-7.1/libprobe.c
f3-7.1/libprobe.h
f3-7.1/libutils.c
f3-7.1/libutils.h
f3-7.1/log-f3wr
f3-7.1/utils.c
f3-7.1/utils.h
f3-7.1/version.h

user@debian:~/Downloads$ cd f3-7.1/
user@debian:~/Downloads/f3-7.1$ make
cc -std=c99 -Wall -Wextra -pedantic -MMD -ggdb   -c -o utils.o utils.c
cc -std=c99 -Wall -Wextra -pedantic -MMD -ggdb   -c -o f3write.o f3write.c
cc -o f3write utils.o f3write.o  -lm
cc -std=c99 -Wall -Wextra -pedantic -MMD -ggdb   -c -o f3read.o f3read.c
cc -o f3read utils.o f3read.o 

user@debian:~/Downloads/f3-7.1$ ls
changelog  f3brew.c  f3probe.c  f3read.1  f3read.d  f3write    f3write.d    f3write.o  libdevs.h   libprobe.h  libutils.h  log-f3wr  README.rst  utils.d  utils.o
doc        f3fix.c   f3read     f3read.c  f3read.o  f3write.c  f3write.h2w  libdevs.c  libprobe.c  libutils.c  LICENSE     Makefile  utils.c     utils.h  version.h

user@debian:~/Downloads/f3-7.1$ ./f3read
f3read: The disk path was not specified
Try `f3read --help' or `f3read --usage' for more information.

user@debian:~/Downloads/f3-7.1$ sudo make install
install -d /usr/local/bin
install -m755 f3write f3read /usr/local/bin
install -d /usr/local/share/man/man1
install -m644 f3read.1 /usr/local/share/man/man1
ln -sf f3read.1 /usr/local/share/man/man1/f3write.1

Building the extra tools (f3probe,f3fix,f3brew):


$ sudo apt-get install libudev1 libudev-dev libparted0-dev
$ make extra
$ sudo make install-extra

Output of commands:


$ sudo apt-get install libudev1 libudev-dev libparted0-dev
Reading package lists... Done
Building dependency tree       
Reading state information... Done
libudev1 is already the newest version (232-25+deb9u4).
The following packages were automatically installed and are no longer required:
  geoip-database-extra libjs-openlayers libwireshark8 libwiretap6 libwscodecs1 libwsutil7
Use 'sudo apt autoremove' to remove them.
The following additional packages will be installed:
  libblkid-dev libdevmapper-dev libparted-dev libpcre3-dev libpcre32-3 libselinux1-dev libsepol1-dev uuid-dev
Suggested packages:
  parted-doc
The following NEW packages will be installed:
  libblkid-dev libdevmapper-dev libparted-dev libparted0-dev libpcre3-dev libpcre32-3 libselinux1-dev libsepol1-dev libudev-dev uuid-dev
0 upgraded, 10 newly installed, 0 to remove and 0 not upgraded.
Need to get 2,334 kB of archives.
After this operation, 7,832 kB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://ftp.debian.org/debian stretch/main amd64 libudev-dev amd64 232-25+deb9u4 [91.3 kB]
Get:2 http://ftp.debian.org/debian stretch/main amd64 uuid-dev amd64 2.29.2-1+deb9u1 [83.9 kB]
Get:3 http://ftp.debian.org/debian stretch/main amd64 libblkid-dev amd64 2.29.2-1+deb9u1 [196 kB]                                                                      
Get:4 http://ftp.debian.org/debian stretch/main amd64 libsepol1-dev amd64 2.6-2 [309 kB]                                                                               
Get:5 http://ftp.debian.org/debian stretch/main amd64 libpcre32-3 amd64 2:8.39-3 [248 kB]                                                                              
Get:6 http://ftp.debian.org/debian stretch/main amd64 libpcre3-dev amd64 2:8.39-3 [647 kB]                                                                             
Get:7 http://ftp.debian.org/debian stretch/main amd64 libselinux1-dev amd64 2.6-3+b3 [184 kB]                                                                          
Get:8 http://ftp.debian.org/debian stretch/main amd64 libdevmapper-dev amd64 2:1.02.137-2 [68.6 kB]                                                                    
Get:9 http://ftp.debian.org/debian stretch/main amd64 libparted-dev amd64 3.2-17 [346 kB]                                                                              
Get:10 http://ftp.debian.org/debian stretch/main amd64 libparted0-dev all 3.2-17 [161 kB]                                                                              
Fetched 2,334 kB in 1min 4s (36.4 kB/s)                                                                                                                                
Selecting previously unselected package libudev-dev:amd64.
(Reading database ... 300897 files and directories currently installed.)
Preparing to unpack .../0-libudev-dev_232-25+deb9u4_amd64.deb ...
Unpacking libudev-dev:amd64 (232-25+deb9u4) ...
Selecting previously unselected package uuid-dev:amd64.
Preparing to unpack .../1-uuid-dev_2.29.2-1+deb9u1_amd64.deb ...
Unpacking uuid-dev:amd64 (2.29.2-1+deb9u1) ...
Selecting previously unselected package libblkid-dev:amd64.
Preparing to unpack .../2-libblkid-dev_2.29.2-1+deb9u1_amd64.deb ...
Unpacking libblkid-dev:amd64 (2.29.2-1+deb9u1) ...
Selecting previously unselected package libsepol1-dev:amd64.
Preparing to unpack .../3-libsepol1-dev_2.6-2_amd64.deb ...
Unpacking libsepol1-dev:amd64 (2.6-2) ...
Selecting previously unselected package libpcre32-3:amd64.
Preparing to unpack .../4-libpcre32-3_2%3a8.39-3_amd64.deb ...
Unpacking libpcre32-3:amd64 (2:8.39-3) ...
Selecting previously unselected package libpcre3-dev:amd64.
Preparing to unpack .../5-libpcre3-dev_2%3a8.39-3_amd64.deb ...
Unpacking libpcre3-dev:amd64 (2:8.39-3) ...
Selecting previously unselected package libselinux1-dev:amd64.
Preparing to unpack .../6-libselinux1-dev_2.6-3+b3_amd64.deb ...
Unpacking libselinux1-dev:amd64 (2.6-3+b3) ...
Selecting previously unselected package libdevmapper-dev:amd64.
Preparing to unpack .../7-libdevmapper-dev_2%3a1.02.137-2_amd64.deb ...
Unpacking libdevmapper-dev:amd64 (2:1.02.137-2) ...
Selecting previously unselected package libparted-dev:amd64.
Preparing to unpack .../8-libparted-dev_3.2-17_amd64.deb ...
Unpacking libparted-dev:amd64 (3.2-17) ...
Selecting previously unselected package libparted0-dev.
Preparing to unpack .../9-libparted0-dev_3.2-17_all.deb ...
Unpacking libparted0-dev (3.2-17) ...
Setting up libsepol1-dev:amd64 (2.6-2) ...
Setting up uuid-dev:amd64 (2.29.2-1+deb9u1) ...
Processing triggers for libc-bin (2.24-11+deb9u3) ...
Processing triggers for man-db (2.7.6.1-2) ...
Setting up libpcre32-3:amd64 (2:8.39-3) ...
Setting up libudev-dev:amd64 (232-25+deb9u4) ...
Setting up libpcre3-dev:amd64 (2:8.39-3) ...
Setting up libblkid-dev:amd64 (2.29.2-1+deb9u1) ...
Setting up libselinux1-dev:amd64 (2.6-3+b3) ...
Setting up libdevmapper-dev:amd64 (2:1.02.137-2) ...
Setting up libparted-dev:amd64 (3.2-17) ...
Setting up libparted0-dev (3.2-17) ...
Processing triggers for libc-bin (2.24-11+deb9u3) ...

$ make extra
cc -std=c99 -Wall -Wextra -pedantic -MMD -ggdb   -c -o libdevs.o libdevs.c
cc -std=c99 -Wall -Wextra -pedantic -MMD -ggdb   -c -o libprobe.o libprobe.c
cc -std=c99 -Wall -Wextra -pedantic -MMD -ggdb   -c -o f3probe.o f3probe.c
cc -o f3probe libutils.o libdevs.o libprobe.o f3probe.o  -lm -ludev
cc -std=c99 -Wall -Wextra -pedantic -MMD -ggdb   -c -o f3brew.o f3brew.c
cc -o f3brew libutils.o libdevs.o f3brew.o  -lm -ludev
cc -std=c99 -Wall -Wextra -pedantic -MMD -ggdb   -c -o f3fix.o f3fix.c
cc -o f3fix libutils.o f3fix.o  -lparted

$ sudo make install-extra
install -d /usr/local/bin
install -m755 f3probe f3brew f3fix /usr/local/bin

I am not going to use the f3probe, f3fix and f3brew in this post maybe sometime later I will.
If you do not want to use the command line interface, there are 3rd party projects that aims to create a Graphical User Interface for F3.
The official documentation can be found here: https://fight-flash-fraud.readthedocs.io/en/stable/introduction.html

The Sandisk ultra microSD cannot be found on the official website of sandisk, either it is new or just a clone of an original sandisk ultra. The serial number printed on the microSD card cannot be matched to an authentic sandisk product.
We will now test it using the F3 program.
I used my HUAWEI 3G dongle’s microSD card reader function for this, so the speed is limited. The result is on the picture below:

Insert the microSD to the slot, insert the 3G dongle to the USB port and mount it. Open your shell window (terminal) and change directory to the new storage device that is plugged in.
Issue a command:

$ f3write .

This will fill up an entire drive until their free space is zero. After filling up the drive, exit the terminal and eject the drive and insert it again.
After inserting it again, open your terminal change directory and issue a new command to verify if the files are altered or corrupted: $ f3read .
The maximum size of the card with a FAT32 filesystem is 14.83 Gigabytes (GB) (8 bits = 1 Byte). The average speed writing speed is 4.90 MegaByte/second, this is limited by your card reader in this case my dongle.
It’s average reading speed is 5.82 MegaByte/second, as you can see there is no altered or corrupted files. This means that the card is authentic. The second test is to find out if the Raspberry Pi can boot with the microSD card.

This card is a Class 10 microSD but the UHS-1 logo is missing on the card. Class 10 SD cards has maximum write speed of 10 MB/s. Class 6 has 6 MB/s and 4 has 5 MB/s write speed.

Surprisingly, my Raspberry Pi 3B+ booted up this card and at the dmesg log it shows the following info:


[    1.032901] mmc0: host does not support reading read-only switch, assuming write-enable
[    1.040765] mmc0: new high speed SDHC card at address aaaa
[    1.043689] mmcblk0: mmc0:aaaa SC16G 14.8 GiB
[    1.048598]  mmcblk0: p1 p2
[    1.082836] mmc1: new high speed SDIO card at address 0001

I will now count the days until this card stops working. I have optimized my Raspbian to reduce SD card wear and set the logs to RAM.

Except where otherwise noted, this work is licensed under Creative Commons Attribution-ShareAlike 4.0 International License (http://creativecommons.org/licenses/by-sa/4.0/).
I hope that this post is useful to you, if you liked this post you may support me via liberapay. Thank you for your support.

Donate using Liberapay