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