Obsah

DiskDebug

DiskDebug - skript, který za vás vyhledá informace při problémech s disky - interními, externími, flash paměti, mp3 přehrávače apod.

Skript se spouští přes gksudo, a výsledný soubor výsledky.txt se zkopíruje do fóra. Pro podrobnější návod se podívejte na Jak dodat informace do fóra.

Text skriptu ke zkopírování

#! /bin/bash

Devkit(){
which udisks &> /dev/null || { echo "$RANDOM - udisks není v systému"; return; }
for i in /dev/[sh]d[a-z]*; do
        udisks --show-info $i
done
}

if [[ `whoami` != "root" ]]; then
        zenity --info --title="DiskDebug" --text="Musíš být root!\nSpouštěj skript přes gksudo."
        exit 1
fi

##### zde je možné přidávat příkazy ######
DiskPrikazy=( "foo" "dmesg" "lsusb" "fdisk -l" "parted -l" "mount" "blkid -c /dev/null" "ls -l /media" "Devkit" )
SystemPrikazy=( "foo" "uname -a" "cat /etc/lsb-release" "free -m" "df -Th" )
##########################################

TempSoubor=`mktemp`

# adresář, z kterého spouštíme skript
AktAdresar=$(cd $(dirname "$0");pwd)
# existuje AktAdresar?
# pokud ne, přepokládej $HOME nebo /tmp
[[ -z $AktAdresar ]] && AktAdresar="$HOME"
[[ -z $AktAdresar ]] && AktAdresar=/tmp

PocetDiskPrikazu=$((${#DiskPrikazy[@]} - 1))
PocetSystemPrikazu=$((${#SystemPrikazy[@]} - 1))
CelkemPrikazu=$(($PocetDiskPrikazu * 2 + $PocetSystemPrikazu + 15))

zenity --info --title="DiskDebug" --text="Krok č.1/2:\n\nOdpoj zařízení pomocí \"Odpojit\" (pokud je vidět ikona).\n Potom ho vysuň fyzicky z počítače, nebo ho vypni.\n\nAž bude odpojené, nebo pokud již bylo odpojené, klikni OK."
# progress bar
# pokud klikne uživatel Cancel, nestačí to dát do proměnné - je to v souboru $TempSoubor
# ten se pak testuje v průběhu skriptu a la '[[ -s $TempSoubor ]] && exit 1'
exec 3> >(zenity --progress --title="DiskDebug" --percentage=0 --auto-close --width=300 || echo cancel > $TempSoubor)

j=1
for i in $(seq 1 $PocetDiskPrikazu); do
                prikaz=${DiskPrikazy[$i]}
                echo $(($j * 100 / $CelkemPrikazu)) >&3
                echo "# ${j}/${CelkemPrikazu} - ${prikaz}" >&3
                $prikaz &> /tmp/$i.txt
                [[ -s $TempSoubor ]] && exit 1
                ((j++))
                sleep 0.2
done

zenity --info --title="DiskDebug" --text="Krok č.2/2:\n\nZnovu připoj nebo zapni zařízení.\n\nAž bude připojené, klikni OK."
for i in {1..14}; do
                echo $(($j * 100 / $CelkemPrikazu)) >&3
                echo "# ${j}/${CelkemPrikazu} - Sbírám data..." >&3
                [[ -s $TempSoubor ]] && exit 1
                ((j++))
                sleep 1
done

exec &> "$AktAdresar/výsledky.txt"

for i in $(seq 1 $PocetDiskPrikazu); do
        echo $(($j * 100 / $CelkemPrikazu)) >&3
        prikaz=${DiskPrikazy[$i]}
        echo "# ${j}/${CelkemPrikazu} - ${prikaz}" >&3
        echo
        echo $prikaz
        echo ---------------------------
        $prikaz | diff -wB - /tmp/$i.txt
        [[ -s $TempSoubor ]] && exit 1
        ((j++))
        sleep 0.2
done

for i in $(seq 1 $PocetSystemPrikazu); do
        echo $(($j * 100 / $CelkemPrikazu)) >&3
        prikaz=${SystemPrikazy[$i]}
        echo "# ${j}/${CelkemPrikazu} - ${prikaz}" >&3
        echo
        echo $prikaz
        echo ---------------------------
        $prikaz
        [[ -s $TempSoubor ]] && exit 1
        ((j++))
        sleep 0.2
done

if zenity --question --title="DiskDebug" --text="Hotovo.\n\nByl vytvořen soubor $AktAdresar/výsledky.txt.\n\nChceš ho rovnou otevřít?"; then
        editor="gnome-text-editor"
        which "$editor" &> /dev/null || editor=gedit
        $editor "$AktAdresar/výsledky.txt" &
fi

exit 0

Technické detaily (není nutné znát)

Základem skriptu je vytvoření výpisu příkazů uvedených v proměnné DiskPrikazy před a po připojení zařízení. Tyto výpisy se pak porovnávají pomocí příkazu diff, takže výsledkem jsou zprávy týkající se pouze přidaného zařízení.

Příkaz zenity pouze zobrazuje okénka s instrukcemi.

K výpisu jsou ještě připojeny obecné systémové příkazy (proměnná SystemPrikazy), které vypíší informace o systému a jeho kondici.

Příklad možného obsahu souboru výsledky.txt (připojen flash disk 1GB, souborový systém FAT, identifikační číslo 3538:0054, připojen na /media/8C3A-3BB0, bez větších chyb, zaplněn z 5%):

dmesg
---------------------------
669,689d668
< [ 2682.300043] end_request: I/O error, dev fd0, sector 0
< [ 2682.328027] end_request: I/O error, dev fd0, sector 0
< [ 2690.316035] usb 1-4: new high speed USB device using ehci_hcd and address 3
< [ 2690.451331] usb 1-4: configuration #1 chosen from 1 choice
< [ 2690.505460] Initializing USB Mass Storage driver...
< [ 2690.505622] scsi4 : SCSI emulation for USB Mass Storage devices
< [ 2690.505925] usbcore: registered new interface driver usb-storage
< [ 2690.505931] USB Mass Storage support registered.
< [ 2690.506919] usb-storage: device found at 3
< [ 2690.506924] usb-storage: waiting for device to settle before scanning
< [ 2695.504188] usb-storage: device scan complete
< [ 2695.505299] scsi 4:0:0:0: Direct-Access     Generic  USB Flash Disk   0.00 PQ: 0 ANSI: 2
< [ 2695.505888] sd 4:0:0:0: Attached scsi generic sg3 type 0
< [ 2695.522417] sd 4:0:0:0: [sdc] 1974271 512-byte logical blocks: (1.01 GB/963 MiB)
< [ 2695.523390] sd 4:0:0:0: [sdc] Write Protect is off
< [ 2695.523394] sd 4:0:0:0: [sdc] Mode Sense: 00 00 00 00
< [ 2695.523397] sd 4:0:0:0: [sdc] Assuming drive cache: write through
< [ 2695.528271] sd 4:0:0:0: [sdc] Assuming drive cache: write through
< [ 2695.528280]  sdc: sdc1
< [ 2695.696238] sd 4:0:0:0: [sdc] Assuming drive cache: write through
< [ 2695.696248] sd 4:0:0:0: [sdc] Attached SCSI removable disk

lsusb
---------------------------
2d1
< Bus 001 Device 003: ID 3538:0054 Power Quotient International Co., Ltd Flash Drive (2GB)

fdisk -l
---------------------------
29,38d28
<
< Disk /dev/sdc: 1010 MB, 1010826752 bytes
< 255 heads, 63 sectors/track, 122 cylinders
< Units = cylinders of 16065 * 512 = 8225280 bytes
< Disk identifier: 0x91f72d24
<
<    Device Boot      Start         End      Blocks   Id  System
< /dev/sdc1               1         123      987104    b  W95 FAT32
< Partition 1 has different physical/logical endings:
<      phys=(121, 254, 63) logical=(122, 227, 40)

parted -l
---------------------------
29,37d28
< Model: Generic USB Flash Disk (scsi)
< Disk /dev/sdc: 1011MB
< Sector size (logical/physical): 512B/512B
< Partition Table: msdos
<
< Number  Start   End     Size    Type     File system  Flags
<  1      32.3kB  1011MB  1011MB  primary  fat32
<
<

mount
---------------------------
15d14
< /dev/sdc1 on /media/8C3A-3BB0 type vfat (rw,nosuid,nodev,uhelper=devkit,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,flush)

blkid -c /dev/null
---------------------------
11d10
< /dev/sdc1: LABEL="" UUID="8C3A-3BB0" TYPE="vfat"

uname -a
---------------------------
Linux lean 2.6.31-17-generic #54-Ubuntu SMP Thu Dec 10 16:20:31 UTC 2009 i686 GNU/Linux

cat /etc/lsb-release
---------------------------
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=9.10
DISTRIB_CODENAME=karmic
DISTRIB_DESCRIPTION="Ubuntu 9.10"

free -m
---------------------------
             total       used       free     shared    buffers     cached
Mem:           993        637        356          0         39        325
-/+ buffers/cache:        272        720
Swap:         1051          0       1051

df -h
---------------------------
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda8              15G  3.7G   10G  28% /
udev                  497M  288K  497M   1% /dev
none                  497M  140K  497M   1% /dev/shm
none                  497M   72K  497M   1% /var/run
none                  497M  8.0K  497M   1% /var/lock
none                  497M     0  497M   0% /lib/init/rw
/dev/sdb1              78G   38G   37G  51% /home
/dev/sdc1             963M   44M  919M   5% /media/8C3A-3BB0