| #!/usr/bin/env bash |
| # Copyright 2017 The Fuchsia Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| set -eu |
| |
| get_confirmation() { |
| echo -n "Press 'y' to confirm: " |
| read CONFIRM |
| if [[ "$CONFIRM" != "y" ]]; then |
| echo "[format_sdcard] Aborted due to invalid confirmation" |
| exit 1 |
| fi |
| } |
| |
| if [[ $OSTYPE != "linux-gnu" ]]; then |
| echo "[format_sdcard] Script is currently Linux-exclusive" |
| exit 1 |
| fi |
| |
| SCRIPT_DIR=$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd) |
| |
| lsblk |
| echo "Enter the name of a block device to format: " |
| echo " This will probably be of the form 'sd[letter]', like 'sdc'" |
| echo -n "> " |
| read DEVICE |
| |
| # Ensure that device exists |
| echo -n "[format_sdcard] Checking that device exists: $DEVICE ..." |
| DEVICE_PATH="/dev/$DEVICE" |
| if [[ ! -e "$DEVICE_PATH" ]]; then |
| echo " FAILED" |
| echo "[format_sdcard] ERROR: This device does not exist: $DEVICE_PATH" |
| exit 1 |
| fi |
| echo " SUCCESS" |
| |
| # Ensure that the device is a real block device |
| echo -n "[format_sdcard] Checking that device is a known block device..." |
| if [[ ! -e "/sys/block/$DEVICE" ]]; then |
| echo " FAILED" |
| echo "[format_sdcard] ERROR: /sys/block/$DEVICE does not exist." |
| echo " Does $DEVICE refer to a partition?" |
| exit 1 |
| fi |
| echo " SUCCESS" |
| |
| # Try to check that the device is a USB stick |
| echo -n "[format_sdcard] Checking if device is USB: $DEVICE ..." |
| READLINK_USB=$(readlink -f "/sys/class/block/$DEVICE/device" | { grep -i "usb" || true; }) |
| if [[ -z "$READLINK_USB" ]]; then |
| echo " FAILED" |
| echo "[format_sdcard] ERROR: Cannot confirm that device is a USB stick" |
| echo "[format_sdcard] ERROR: Please insert USB stick and retry" |
| exit 1 |
| fi |
| echo " SUCCESS" |
| |
| sudo umount "${DEVICE_PATH}1" || true |
| |
| # Ensure the device is not mounted |
| echo -n "[format_sdcard] Checking that device is not mounted: $DEVICE ..." |
| if [[ -n $(df -Hl | grep "$DEVICE") ]]; then |
| echo " FAILED" |
| echo "[format_sdcard] ERROR: Your device appears to be mounted: " |
| echo "..." |
| df -Hl | grep "$DEVICE" |
| echo "..." |
| echo "[format_sdcard] ERROR: Please unmount your device and retry" |
| exit 1 |
| fi |
| echo " SUCCESS" |
| |
| # Confirm that the user knows what they are doing |
| sudo -v -p "[sudo] Enter password to confirm information about device: " |
| sudo sfdisk -l "$DEVICE_PATH" |
| echo "[format_sdcard] ABOUT TO COMPLETELY WIPE / FORMAT: $DEVICE_PATH" |
| get_confirmation |
| echo "[format_sdcard] ARE YOU 100% SURE? This will hurt if you get it wrong." |
| get_confirmation |
| |
| # Create three new partitions on the device, 1GB for root and divide the |
| # remaining space into 2 pieces for data and bootfs |
| |
| # Determine how many bytes we have available on this disk. |
| BLK_DEV_SIZE=`sudo blockdev --getsize64 $DEVICE_PATH` |
| BLK_DEV_SIZE_MB=$((BLK_DEV_SIZE/1048576)) |
| |
| if [ "$BLK_DEV_SIZE_MB" -lt 3000 ]; then |
| echo " FAILED" |
| echo "[format_sdcard] ERROR: SD Card must be at least 4GB" |
| exit 1 |
| fi |
| |
| |
| sudo dd if=/dev/zero of="$DEVICE_PATH" bs=512 count=1 |
| |
| |
| |
| |
| DATA_PTN_START=4259840 |
| DATA_PTN_END=4521983 |
| DATA_PTN_SIZE=$((DATA_PTN_END-DATA_PTN_START+1)) |
| DATA_PTN_SIZE_B=$(((DATA_PTN_END - DATA_PTN_START + 1)*512)) |
| |
| echo "Using Data Partition Size = ${DATA_PTN_SIZE_B} bytes" |
| |
| sudo sfdisk -uS "$DEVICE_PATH" << EOF |
| ${DATA_PTN_START} ${DATA_PTN_SIZE} 0x0b - |
| |
| EOF |
| |
| DATA_PTN_PATH="${DEVICE_PATH}1" |
| |
| sudo mkfs.fat ${DEVICE_PATH}1 |
| |
| # Function to attempt unmounting a mount point up to three times, sleeping |
| # a couple of seconds between attempts. |
| function umount_retry() { |
| set +e |
| TRIES=0 |
| while (! sudo umount $1); do |
| ((TRIES++)) |
| if [[ ${TRIES} > 2 ]]; then |
| echo "[format_sdcard] Unable to umount $0" |
| exit 1 |
| fi |
| sleep 2 |
| done |
| set -e |
| } |
| |
| # Copy the necessary files to the root partition |
| MOUNT_PATH=`mktemp -d` |
| sudo mount "$DATA_PTN_PATH" "$MOUNT_PATH" |
| trap "umount_retry \"${MOUNT_PATH}\" && rm -rf \"${MOUNT_PATH}\" && echo \"Unmounted succesfully\"" INT TERM EXIT |
| |
| sudo dd if=fip/gxl/u-boot.bin.sd.bin of="$DEVICE_PATH" conv=fsync,notrunc bs=1 count=444 |
| sudo dd if=fip/gxl/u-boot.bin.sd.bin of="$DEVICE_PATH" conv=fsync,notrunc bs=512 skip=1 seek=1 |
| |
| |
| |
| echo " SUCCESS" |