This is the nanobanshee evil dirty searching howto. It will teach you how to
find what you are looking for to make linux run.
Most of this howto consists of commands that stream tons of text to the
terminal. Add a "| less" to the end of a command if you want to be able to
scroll the output and search it. Also, if the output scrolls on the terminal
but doesn't show up in less, that is because it is going on the error channel,
so you need to add a "2>&1 | less" intead. For more information on this, type
"man bash" and use / to search the manual page. The / command in less uses
the same syntax as grep.
First, the main tools: grep, find and google.
The google interface is easy: you type what you want into the box. (I will
extend this section as I think of how to explain the fine art of googling)
grep is easy also. It matches strings in lines of text. All that you need to
know about it for now is contained in this example:
"^.*foo.*bar.*$" will match "foo" anywhere in the line followed by "bar"
anywhere in the line.
".*" matches anything.
Characters and numbers match themselves.
"^" matches the beginning of the line and
"$" matches the end.
Special characters sometimes need to be preceded by \ and sometimes not
(use trial and error to find out which ones).
More examples:
^foo will match "foo" only if it is at the beginning of the line.
foo$ will match "foo" only if it is at the end of the line.
The command-line use of grep is as follows:
grep -n -r thing filename(s)
The -n and -r are optional.
-n will tell you which line numbers match.
-r will dive into directories and search all the files inside.
In addition, grep can be used in a stream by omitting the filename
and adding a | to the front, like this:
| grep thing | less
or
2>&1 | grep thing | less
The find command has a totally different syntax and usage. To find a file with
the string "foo" in the name located somewhere in the /bar directory, do:
find /bar -name "*foo*"
That's it. Now it is time to explain where information is located on linux
and how to access it and search it to fix things. A good place to get a
general overview of where things are is the filesystem heirarchy
standard, located at:
http://www.pathname.com/fhs/pub/fhs-2.3.html
First, we will start with hardware and the kernel, and then move to other
areas and tasks. The interface that software uses to interact with the
hardware has been standardized so that any piece of software can run on any
computer. The one special piece of software that mediates the interaction
between all other software and the hardware is the kernel. If you have a
hardware device like a webcam or external usb hard disk that you want to
use with linux, the kernel is the place to start.
First, you need to know what hardware you have:
cat /proc/cpuinfo
cat /proc/asound/cards
cat /proc/bus/usb/*
lsusb
lspci
lshw
All of these are greppable. To find what firewire device you have:
lspci | grep 1394
The kernel configuration file can be found in a number of places:
/proc/config.gz
/boot/config* on debian
/usr/src/linux/.config if you made your own.
The format of the file is lots of lines containing CONFIGfoobar and either "not
set", "y" or "m". "not set" and "y" mean that kernel support for that piece
of hardware is either enabled or not. "m" stands for module and means that
it has been enabled, but needs to be turned on manually to work.
To find out what filesystems your kernel supports:
zgrep FS /proc/config.gz | less
To find out if ppp support is enabled:
zgrep PPP /proc/config.gz | less
Also, while building the kernel, in make menuconfig, you can search by hitting
"/".
While it is running, the kernel spits out lots of messages to either
/var/log/dmesg or /var/log/kmsg-kern.log
To find out what ethernet cards were detected at boot:
grep eth /var/log/dmesg
To watch the kernel detect a usb thing as you plug it in:
watch "dmesg | tail"
To see what IDE disks were detected:
dmesg | grep hd
To see what SCSI or usb disks were detected:
dmesg | grep sd
To see what kernel modules are loaded:
lsmod
For setting up system services such as networking interfaces, web servers, usb
hotplugging support, etc, the two places to look are the /etc scripts and the
system log file /var/log/messages or /var/log/syslog.
To look for configuration things related to bluetooth:
grep -r bluetooth /etc
find /etc -name *bluetooth*
Things related to ethernet networking:
find /etc -name "*eth*"
grep -r eth0 /etc | less
To fix a dhcp problem:
grep dhcp /var/log/syslog
To fix a login problem:
grep pam /var/log/syslog
Another big problem area is setting up Xorg.
For framebuffer kernel support:
zgrep FB /proc/config.gz
AGP and DRM support for direct rendering:
zgrep AGP /proc/config.gz
zgrep DRM /proc/config.gz
To check what Xorg modules are loaded by the X server:
grep Load /etc/X11/xorg.conf
To check font paths:
grep FontPath /etc/X11/xorg.conf
To list all the drivers used:
grep Driver /etc/X11/xorg.conf
To look at all the options:
grep Option /etc/X11/xorg.conf
To see if direct rendering is working:
glxinfo | grep irect
And the most useful of all, to check for Xorg errors:
grep EE /var/log/Xorg.0.log
For sound:
grep -r snd /etc
find /etc -name "*alsa*"
Other useful commands are alsaconf, amixer, alsamixer.
Also, to use a foo OSS app on an ALSA system, get the alsa-oss package and type
"aoss foo".
Lots and lots of greppable stuff is in /proc/asound:
/proc/asound/version
/proc/asound/pcm
/proc/asound/cards
/proc/asound/devices
For file errors, strace and lsof are the two commands to use. If you know the
file, but not the application with the problem, use lsof.
To list every shared object file currently in use:
lsof | grep "\.so" | less
To find out which application is using /dev/dsp:
lsof | grep /dev/dsp
If you know the command, but not the files it accesses, use strace to find the
files that a command foo uses:
strace foo 2>&1 | grep ^open
Try it on this example:
strace touch a 2>&1 | grep ^open
For "can't find library" errors, use:
ldd `which foo`| less
to get a list of the needed libraries. The config files to edit are:
ld.so.conf and ld.so.conf.d/*
Use those files to set the search paths for libraries, then run:
ldconfig -v | less
and make sure it finds what it needs. If you don't know where it is, find it
with:
find / -name libfoo.so*
and add the path to ld.so.conf.
Networking stuff:
To see if a network interface is up and has an ip address:
watch "ifconfig | grep addr"
To see what applications have open TCP/IP connections:
netstat -n -p | grep ^tcp
Building:
When compiling, to see the first error that needs to be fixed:
cat gcclog.txt | grep ": error: " | head -n1