| #! /bin/sh |
| |
| # Copyright (c) 2014 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| # |
| # This script provides various data about the internal disk to show on the |
| # chrome://system page. It will run once on startup to dump output to the file |
| # /var/log/storage_info.txt which will be read later by debugd when the user |
| # opens the chrome://system page. |
| . /usr/share/misc/chromeos-common.sh |
| |
| : ${STORAGE_INFO_FILE:="/var/log/storage_info.txt"} |
| |
| SSD_CMD_0="hdparm -I" |
| SSD_CMD_1_NORMAL="smartctl -x" |
| SSD_CMD_1_ALTERNATE="smartctl -a -f brief" |
| SSD_CMD_MAX=1 |
| |
| # This match SanDisk SSD U100/i100 with any size with version *.xx.* when x < 54 |
| # Seen Error: U100 10.52.01 / i100 CS.51.00 / U100 10.01.04 |
| MODEL_BLACKLIST_0="SanDisk_SSD_[iU]100.*" |
| VERSION_BLACKLIST_0="(CS|10)\.([01234].|5[0123])\..*" |
| MODEL_BLACKLIST_1="SanDisk_SDSA5GK-.*" |
| VERSION_BLACKLIST_1="CS.54.06" |
| BLACKLIST_MAX=1 |
| |
| MMC_NAME_0="cid" |
| MMC_NAME_1="csd" |
| MMC_NAME_2="date" |
| MMC_NAME_3="enhanced_area_offset" |
| MMC_NAME_4="enhanced_area_size" |
| MMC_NAME_5="erase_size" |
| MMC_NAME_6="fwrev" |
| MMC_NAME_7="hwrev" |
| MMC_NAME_8="manfid" |
| MMC_NAME_9="name" |
| MMC_NAME_10="oemid" |
| MMC_NAME_11="preferred_erase_size" |
| MMC_NAME_12="prv" |
| MMC_NAME_13="raw_rpmb_size_mult" |
| MMC_NAME_14="rel_sectors" |
| MMC_NAME_15="serial" |
| MMC_NAME_MAX=15 |
| |
| |
| # Example of hdparm result |
| # Model=SanDisk SSD i100 32GB, FwRev=11.56.00, SerialNo=123456789012 |
| # This command extracts the model string and replaces space with an underscore. |
| get_ssd_model() { |
| echo "$1" | sed -e "s/^.*Model=//g" -e "s/,.*//g" -e "s/ /_/g" |
| } |
| |
| get_ssd_version() { |
| echo "$1" | sed -e "s/^.*FwRev=//g" -e "s/,.*//g" -e "s/ /_/g" |
| } |
| |
| is_blacklist() { |
| echo "$1" | grep -Eq $2 |
| } |
| |
| is_ssd_blacklist() { |
| local model=$1 |
| local version=$2 |
| local model_blacklist |
| local version_blacklist |
| local i |
| |
| for i in $(seq 0 ${BLACKLIST_MAX}); do |
| eval model_blacklist=\${MODEL_BLACKLIST_${i}} |
| if is_blacklist ${model} ${model_blacklist}; then |
| eval version_blacklist=\${VERSION_BLACKLIST_${i}} |
| if is_blacklist ${version} ${version_blacklist}; then |
| return 0 |
| fi |
| fi |
| done |
| return 1 |
| } |
| |
| print_ssd_info() { |
| # BUG: On some machines, smartctl -x causes SSD error (crbug.com/328587) |
| # We need to check model and firmware version of the SSD to avoid this bug. |
| |
| # SSD model and firmware version is on the same line in hdparm result |
| local hdparm_result="$(hdparm -i /dev/$1 | grep "Model=")" |
| local model="$(get_ssd_model "${hdparm_result}")" |
| local version="$(get_ssd_version "${hdparm_result}")" |
| local ssd_cmd |
| local i |
| |
| if is_ssd_blacklist "${model}" "${version}"; then |
| SSD_CMD_1=${SSD_CMD_1_ALTERNATE} |
| else |
| SSD_CMD_1=${SSD_CMD_1_NORMAL} |
| fi |
| |
| for i in $(seq 0 ${SSD_CMD_MAX}); do |
| # use eval for variable indirection |
| eval ssd_cmd=\${SSD_CMD_${i}} |
| echo "$ ${ssd_cmd} /dev/$1" |
| ${ssd_cmd} "/dev/$1" |
| echo "" |
| done |
| } |
| |
| print_mmc_info() { |
| local mmc_name |
| local mmc_path |
| local mmc_result |
| local i |
| |
| for i in $(seq 0 ${MMC_NAME_MAX}); do |
| eval mmc_name=\${MMC_NAME_${i}} |
| mmc_path="/sys/block/$1/device/${mmc_name}" |
| mmc_result="$(cat "${mmc_path}" 2>/dev/null)" |
| printf "%-20s | %s\n" "${mmc_name}" "${mmc_result}" |
| done |
| |
| mmc extcsd read "/dev/$1" |
| } |
| |
| main() { |
| local dev |
| |
| rm -f ${STORAGE_INFO_FILE} |
| touch ${STORAGE_INFO_FILE} |
| chmod 644 ${STORAGE_INFO_FILE} |
| exec > ${STORAGE_INFO_FILE} |
| |
| # We need to check both sda and sdb for internal disk because: |
| # 1) If we use rootdev command to determine the disk to check, it will return |
| # the usb stick, not the internal drive, when we boot from usb. |
| # 2) We also can not assume that sda is an internal disk because in some |
| # systems (e.g., parrot), the usb stick might be labeled as sda and the |
| # internal disk as sdb. |
| for dev in $(list_fixed_ata_disks); do |
| print_ssd_info ${dev} |
| done |
| |
| # For devices with eMMC, the internal disk will always be labeled as mmcblk0 |
| # so we can check only mmcblk0, but to be safe we will check both mmcblk0 and |
| # mmcblk1. |
| for dev in $(list_fixed_mmc_disks); do |
| print_mmc_info ${dev} |
| done |
| } |
| |
| # don't run script in test mode |
| if [ ! "$1" = "--test" ]; then |
| main |
| fi |
| |