====== 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.
{{.:media-flash.png}} {{.:removable-media.png}} {{.:ipod.png}} {{.:cellphone.png}}
{{.:disk.png}}
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 [[Řešení problémů: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.
{{.:example.png}} 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