SD カードを工場出荷時の状態に再フォーマットする必要があります。
メディアに使用されている SD カードのファイルシステムが破損しています。特定のディレクトリにアクセスすると、ファイルシステムが読み取り専用で再マウントされ、削除できなくなります。fsck.vfat では、特定の種類の破損に対する修復方法はないと表示されます。
答え1
注意: このようなコマンドは、ファイルシステムのデータを上書きするように設計されています。間違ったディスクをターゲットにしないように細心の注意を払う必要があります。
編集:
カードをフォーマットする前に、破棄操作を実行することもできます。
blkdiscard /dev/mmcblk0
これにより、SATA SSD の TRIM と同様に、パフォーマンスが向上する可能性があります。ブロック再マッピング レイヤーをリセットすると、理論的にはそのレイヤーまたはそのレイヤー付近の破損の解決にも役立つ可能性がありますが、この方法は専用の完全デバイス消去コマンド (SATA セキュア消去) ほど効果的ではありません。これは、すべてのカード リーダーでサポートされているわけではありません。私の Dell Latitude ラップトップでは、1 秒でカードがすべてゼロにリセットされました。これは、このカードではブロック再マッピング レイヤーのみが影響を受けたことを意味します。16 GB のフラッシュ全体を即時に消去することはできません。
MicroSD カードには、1 つ以上のフラッシュ チップと、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 "$@"