重新格式化 SD 卡

重新格式化 SD 卡

我需要将 SD 卡重新格式化回出厂状态。

用于媒体的 SD 卡文件系统已损坏。访问某个目录会导致文件系统以只读方式重新挂载,并且无法删除。 fsck.vfat 表示它没有针对特定类型损坏的修复方法。

答案1

提醒:这样的命令旨在覆盖文件系统数据。您必须格外小心,以避免定位错误的磁盘。

编辑:

在格式化卡之前,您可能还需要执行丢弃操作。

blkdiscard /dev/mmcblk0

这可能会提高性能 - 与 SATA SSD 上的 TRIM 相同。重置块重新映射层理论上也可能有助于解决该层或周围的损坏,尽管此方法不如专用的完整设备擦除命令(SATA 安全擦除)。并非所有读卡器都支持此功能。在我的 Dell Latitude 笔记本电脑上,它在一秒钟内将卡重置为全零。这意味着在这张卡上它只影响块重映射层;它无法立即擦除整个 16GB 闪存。


MicroSD 卡包含一个或多个闪存芯片和一个小型微处理器,充当 SD 卡规范和闪存芯片之间的接口。卡通常在工厂格式化以获得接近最佳的性能。但是,大多数操作系统默认分区和格式化实用程序将这些卡视为传统硬盘驱动器。适用于传统硬盘的方法会导致闪存卡的性能和使用寿命下降

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

脚本可用于最大 32GiB 的卡。我已将其修改为与当前版本的sfdisk.在生成的分区上运行file -s返回的数字与之前相同,但每个磁道的磁头/扇区数除外。当前操作系统不使用这些值,尽管显然某些嵌入式引导加载程序需要特定值。

#! /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 "$@"

相关内容