Necesito reformatear una tarjeta SD al estado de fábrica.
El sistema de archivos de la tarjeta SD utilizado para los medios se ha dañado. Acceder a un determinado directorio hace que el sistema de archivos se vuelva a montar en modo de solo lectura y no se puede eliminar. fsck.vfat dice que no tiene un método de reparación para el tipo específico de corrupción.
Respuesta1
RECORDATORIO: comandos como este están diseñados para sobrescribir datos del sistema de archivos. Debe tener mucho cuidado para evitar apuntar al disco equivocado.
EDITAR:
Antes de formatear la tarjeta, es posible que también desees realizar una operación de descarte.
blkdiscard /dev/mmcblk0
Esto podría mejorar el rendimiento, al igual que TRIM en un SSD SATA. En teoría, restablecer la capa de reasignación de bloques también podría ayudar a resolver la corrupción en esa capa o alrededor de ella, aunque este método no es tan bueno como un comando dedicado de borrado completo del dispositivo (borrado seguro de SATA). Es posible que esto no sea compatible con todos los lectores de tarjetas. En mi computadora portátil Dell Latitude, restableció la tarjeta a ceros en un segundo. Esto implica que en esta tarjeta solo afectó la capa de reasignación de bloques; no puede haber realizado un borrado inmediato de los 16 GB completos de memoria flash.
Las tarjetas MicroSD contienen uno o más chips flash y un pequeño microprocesador que actúa como interfaz entre la especificación de la tarjeta SD y los chips flash. Las tarjetas normalmente vienen formateadas de fábrica para un rendimiento casi óptimo. Sin embargo, la mayoría de los sistemas operativos utilizan utilidades predeterminadas de partición y formateo para tratar las tarjetas como discos duros tradicionales. Lo que funciona con los discos duros tradicionales da como resultado una degradación del rendimiento y la vida útil de las tarjetas basadas en flash
http://3gfp.com/wp/2014/07/formatting-sd-cards-for-speed-and-lifetime/
Hay un script disponible para tarjetas de hasta 32 GiB. Lo he modificado para que funcione con las versiones actuales de sfdisk
. La ejecución file -s
en la partición resultante arrojó los mismos números que antes, excepto por el número de cabezales/sectores por pista. Estos no son utilizados por los sistemas operativos actuales, aunque aparentemente algunos cargadores de arranque integrados requerirán valores específicos.
#! /bin/sh
# fdisk portion of script based on mkcard.sh v0.4
# (c) Copyright 2009 Graeme Gregory <[email protected]>
# Additional functionality by Steve Sakoman
# (c) Copyright 2010-2011 Steve Sakoman <[email protected]>
# Updated by Alan Jenkins (2016)
# Licensed under terms of GPLv2
#
# Parts of the procudure base on the work of Denys Dmytriyenko
# http://wiki.omap.com/index.php/MMC_Boot_Format
# exit if any command fails
set -e
export LC_ALL=C
format_whole_disk_fat32() {
if ! id | grep -q root; then
echo "This utility must be run prefixed with sudo or as root"
return 1
fi
local DRIVE=$1
# Make sure drive isn't mounted
# so hopefully this will fail e.g. if we're about to blow away the root filesystem
for mounted in $(findmnt -o source | grep "^$DRIVE") ; do
umount "$mounted"
done
# Make sure current partition table is deleted
wipefs --all $DRIVE
# Get disk size in bytes
local SIZE=$(fdisk -l $DRIVE | grep Disk | grep bytes | awk '{print $5}')
echo DISK SIZE – $SIZE bytes
# Note: I'm changing our default cluster size to 32KiB since all of
# our 8GiB cards are arriving with 32KiB clusters. The manufacturers
# may know something that we do not *or* they're trading speed for
# more space.
local CLUSTER_SIZE_KB=32
local CLUSTER_SIZE_IN_SECTORS=$(( $CLUSTER_SIZE_KB * 2 ))
# This won't work for drives bigger than 32GiB because
# 32GiB / 64kiB clusters = 524288 FAT entries
# 524288 FAT entries * 4 bytes / FAT = 2097152 bytes
# 2097152 bytes / 512 bytes = 4096 sectors for FAT size
# 4096 * 2 = 8192 sectors for both FAT tables which leaves no
# room for the BPB sector
if [ $SIZE -ge $(( ($CLUSTER_SIZE_KB / 2) * 1024 * 1024 * 1024 )) ]; then
echo -n "This drive is too large, >= $(($CLUSTER_SIZE_KB / 2))GiB, for this "
echo "formatting routine."
return 1
fi
# Align partitions for SD card performance/wear optimization
# Summary: start 1st partition at sector 8192 (4MiB) and align FAT32
# data to start at 8MiB (4MiB logical)
# There's a document that explains why, but its too long to
# reproduce here.
{
echo 8192,,0x0C,*
} | sfdisk -uS -q $DRIVE
sleep 1
if [ -b ${DRIVE}1 ]; then
PART1=${DRIVE}1
elif [ -b ${DRIVE}p1 ]; then
PART1=${DRIVE}p1
else
echo "Improper partitioning on $DRIVE"
return 1
fi
# Delete any old filesystem visible in new partition
wipefs --all $PART1
# Format FAT32 with 64kiB clusters (128 * 512)
# Format once to get the calculated FAT size
local FAT_SIZE=$(mkdosfs -F 32 -s $CLUSTER_SIZE_IN_SECTORS -v ${PART1} | \
sed -n -r -e '/^FAT size is/ s,FAT size is ([0-9]+) sectors.*$,\1,p')
# Calculate the number of reserved sectors to pad in order to align
# the FAT32 data area to 4MiB
local RESERVED_SECTORS=$(( 8192 - 2 * $FAT_SIZE ))
# Format again with padding
mkdosfs -F 32 -s $CLUSTER_SIZE_IN_SECTORS -v -R $RESERVED_SECTORS ${PART1}
# Uncomment to label filesystem
#fatlabel ${PART1} BOOT
}
#set -x
format_whole_disk_fat32 "$@"