Reformate o cartão SD

Reformate o cartão SD

Preciso reformatar um cartão SD de volta ao status de fábrica.

O sistema de arquivos do cartão SD usado para mídia foi corrompido. Acessar um determinado diretório faz com que o sistema de arquivos seja remontado somente leitura e não possa ser excluído. fsck.vfat afirma que não possui um método de reparo para o tipo específico de corrupção.

Responder1

LEMBRETE: comandos como este são projetados para substituir dados do sistema de arquivos. Você deve tomar muito cuidado para evitar direcionar o disco errado.

EDITAR:

Antes de formatar o cartão, você também pode realizar uma operação de descarte.

blkdiscard /dev/mmcblk0

Isso pode melhorar o desempenho - o mesmo que TRIM em um SSD SATA. A redefinição da camada de remapeamento de bloco também pode, teoricamente, ajudar a resolver a corrupção nessa camada ou em torno dela, embora esse método não seja tão bom quanto um comando dedicado de apagamento completo do dispositivo (apagamento seguro SATA). Isto pode não ser compatível com todos os leitores de cartão. No meu laptop Dell Latitude, ele redefiniu a placa para zero em um segundo. Isto implica que nesta placa afetou apenas a camada de remapeamento de blocos; ele não pode ter apagado imediatamente todos os 16 GB de flash.


Os cartões MicroSD contêm um ou mais chips flash e um pequeno microprocessador que atua como uma interface entre a especificação do cartão SD e o(s) chip(s) flash. Os cartões normalmente são formatados de fábrica para um desempenho quase ideal. No entanto, a maioria dos utilitários de particionamento e formatação padrão dos sistemas operacionais tratam os cartões como discos rígidos tradicionais. O que funciona para discos rígidos tradicionais resulta em desempenho e vida útil degradados para cartões baseados em flash

http://3gfp.com/wp/2014/07/formatting-sd-cards-for-speed-and-lifetime/

Um script está disponível para cartões de até 32GiB. Eu o modifiquei para funcionar com as versões atuais do sfdisk. A execução file -sna partição resultante retornou os mesmos números de antes, exceto pelo número de cabeças/setores por trilha. Eles não são usados ​​pelos sistemas operacionais atuais, embora aparentemente alguns bootloaders incorporados exijam 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 "$@"

informação relacionada