1. 目前嵌入式设备,如andorid,大部分使用了emmc存储介质,文件系统一般都设计为ext4系统,更好的使用日志型的特点。
2. 使用时,如果有用户数据分区,一般都要做挂载修复等动作。
如果是系统存储分区,可以直接使用只读文件系统进行挂载使用。如果需要可读写,则需要设计为可读写的属性,如果使用时,不进行挂载修复,则可能严重时会导致数据错误,或分区损坏等。
3. 修复一般分为,判断分区类型,卸载,修复,挂载。代码可以参考:
repair_dev_node()
{
dev_node=$1
[ ! -b ${dev_node} ] && return 1
[ ! -e "/extconf/tools/fsck.ext4" ] && return 2
echo "........ repair ${dev_node} start! ........"
ret=1
times=1
tune2fs -c 1 ${dev_node}
/extconf/tools/fsck.ext4 -y ${dev_node}
ret=$?
while [ ${ret} -ne 0 ]
do
echo "======== repair ${dev_node} ${times} times ========"
let times++
sleep 1
/extconf/tools/fsck.ext4 -y ${dev_node}
ret=$?
[ ${ret} -eq 0 ] && return 0
[ ${times} -ge 10 ] && return 3
done
return 0
}
check_emmc_mount()
{
mount_ret=0
/bin/mountpoint -q /opt/emmc/
#if [ $? -eq 0 ] && [ -b "$(cat /proc/mounts | grep /opt/emmc | awk '{print $1}')" ]; then
if [ $? -eq 0 ]; then
let mount_ret++
fi
/bin/mountpoint -q /opt/line/
#if [ $? -eq 0 ] && [ -b "$(cat /proc/mounts | grep /opt/line | awk '{print $1}')" ]; then
if [ $? -eq 0 ]; then
let mount_ret++
fi
return ${mount_ret}
}
EMMCCARD_CORRESPOND_USB_DEV="../devices/soc/10040000.ehci/usb1/1-2/1-2:1.0"
EMMC_DEV_NODE=""
USB_STORAGE_BUS=$(ls /sys/block/sd* -l | awk '{print $NF}')
EMMCCARD_CHAR_CNT=$(echo ${EMMCCARD_CORRESPOND_USB_DEV} | tr -d '\n' | wc -c)
for bus in ${USB_STORAGE_BUS}
do
bus_c=$(echo ${bus} | tr -d '\n' | head -c ${EMMCCARD_CHAR_CNT})
#echo ${bus}
#echo ${bus_c}
if [ "${EMMCCARD_CORRESPOND_USB_DEV}" = "${bus_c}" ]; then
EMMC_DEV_NODE=$(echo ${bus} | tr -d '\n' | awk -F/ '{print $NF}')
break
fi
done
[ -z "${EMMC_DEV_NODE}" ] && return 1
check_emmc_mount
ret=$?
[ ${ret} -eq 2 ] && return 2
if [ -n "${EMMC_DEV_NODE}" ]; then
#echo ${EMMC_DEV_NODE}
emmc_dir_node=/dev/${EMMC_DEV_NODE}1
line_dir_node=/dev/${EMMC_DEV_NODE}2
if [ -b ${emmc_dir_node} ] && [ -b ${line_dir_node} ]; then
emmc_dir_node_fs=$(/sbin/blkid ${emmc_dir_node} | awk -F= '{print $NF}' | tr -d '"')
line_dir_node_fs=$(/sbin/blkid ${emmc_dir_node} | awk -F= '{print $NF}' | tr -d '"')
if [ "${emmc_dir_node_fs}" = "ext4" ]; then
echo ${emmc_dir_node} >> /tmp/.mount_emmc.log
repair_dev_node ${emmc_dir_node}
[ $? -eq 0 ] && echo "++++++++ repair ${emmc_dir_node} successfully! ++++++++" || echo "-------- repair ${emmc_dir_node} failed! --------"
sync
#rm -rf /opt/emmc/ && mkdir -p /opt/emmc/
/bin/mount -t ext4 ${emmc_dir_node} /opt/emmc/ >> /tmp/.mount_emmc.log
[ $? -eq 0 ] && echo ${emmc_dir_node} | tr -d '\n' > /tmp/.emmcinserted
fi
if [ "${line_dir_node_fs}" = "ext4" ]; then
echo ${line_dir_node} >> /tmp/.mount_line.log
repair_dev_node ${line_dir_node}
[ $? -eq 0 ] && echo "++++++++ repair ${line_dir_node} successfully! ++++++++" || echo "-------- repair ${line_dir_node} failed! --------"
sync
#rm -rf /opt/line/ && mkdir -p /opt/line/
/bin/mount -t ext4 ${line_dir_node} /opt/line/ >> /tmp/.mount_line.log
[ $? -eq 0 ] && echo ${line_dir_node} | tr -d '\n' > /tmp/.lineinserted
fi
else
return 4
fi
fi
其中fsck.ext4 参数,可以选择-y,意思是交互的选择都同意,这样严重的错误提醒,都同意进行修复,防止停留在交互选项,系统启动不起来的问题。