Introducing 

Prezi AI.

Your new presentation assistant.

Refine, enhance, and tailor your content, source relevant images, and edit visuals quicker than ever before.

Loading…
Transcript

week 5

Linux admin

Running Services at Boot

Although most people consider a computer to be either on or off, in Ubuntu and Linux in general, there are a number of states in between. Known as runlevels, they define what system services are started upon boot. These services are simply applications running in the background that provide some needed function to your system, such as getting information from your mouse and sending it to the display; or a service could monitor the partitions to see whether they have enough free space left on them. Services are typically loaded and run (also referred to as being started) during the boot process, in the same way as Microsoft Windows services are. For a while, Ubuntu used a system known as Upstart instead of the classic and venerable SysVinit; Upstart had a special backward-compatibility layer that can use runlevels in the way that Linux veterans are accustomed to doing for services not otherwise handled by Upstart. Starting in 2015, Ubuntu has switched to another system called systemd. There is more on runlevels, Upstart and systemd later in this chapter.

Next, the BIOS looks on the bootable volume for boot code in the partition boot sector also known as the Master Boot Record (MBR) of the first hard disk. The MBR contains the boot loader code and the partition table—think of it like an index for a book, plus a few comments on how to start reading the book. If the BIOS finds a boot loader, it loads the boot loader code into memory. At that point, the BIOS’s job is completed, and it passes control of the system to the boot loader.

As computing has evolved, the BIOS began to be a limiting factor because some of its limitations were not easy to overcome. Intel was the first company to notice this as they developed their Itanium systems back in the late 1990s. That work eventually became the foundation for the Unified Extensible Firmware Interface (UEFI).

UEFI serves a similar role to BIOS and has replaced BIOS in most modern systems. For most end users, the difference is negligible, except that if you have a UEFI computer, you may need to do some research to install Ubuntu. UEFI firmware often has a BIOS-mode that allows the firmware to work like a traditional BIOS and that is more easily compatible, especially if you are installing Ubuntu as the sole operating system on the computer, rather than as a dual-boot. There were some significant problems early on, but those seem to have lessened as the Linux community learned more about UEFI and made things more easily compatible. To learn more, especially if you are having trouble, see https://help.ubuntu.com/community/UEFI.

One interesting aspect of using UEFI involves hard disk partitioning. When UEFI is used with Windows 8.x or 10, often the partitioning is set up using GPT (GUID Partition Table) rather than the existing MBR (master boot record) standard. You can use GPT with Ubuntu, but if only Ubuntu is to be installed on the drive, it is often easier to reformat the hard disk to use MBR. As with BIOS and UEFI, most people do not need to know or care whether they are using MBR or GPT. To learn more, see http://www.howtogeek.com/193669/whats-the-difference-between-gpt-and-mbr-when-partitioning-a-drive/.

The boot loader locates the Linux kernel on the disk and loads it into memory. After that task is completed, the boot loader passes control of the system to the Linux kernel. You can see how one process builds on another in an approach that enables many different operating systems to work with the same hardware.

Loading the Linux Kernel

In a general sense, the kernel manages the system resources. As the user, you do not often interact with the kernel, but instead you interact with the applications that you are using. Linux refers to each application as a process, and the kernel assigns each process a number called a process ID (PID). Traditionally, the Linux kernel loads and runs a process named init, which is also known as the “ancestor of all processes” because it starts every subsequent process. The traditional init system was SysVinit. It has been replaced by newer options. Until recently, Ubuntu replaced init with Upstart, which was written by Ubuntu developers and made available for any distribution to use. Upstart has now been replaced by systemd as of Ubuntu 15.04. This chapter walks through the traditional SysVinit method first and then provides details on Upstart and systemd.

This next step of the boot process traditionally begins with a message that the Linux kernel is loading, and a series of messages that are printed to the screen, giving you the status of each command. A failure should display an error message. The quiet option may be passed to the kernel at boot time to suppress many of these messages. Ubuntu does not display these messages by default, but instead uses a boot process created by the Fedora/Red Hat developers called Plymouth that is fast and incorporates a beautiful boot screen.

If the boot process were halted at this point, the system would just sit idle and the screen would be blank. To make the system useful for users, you need to start the system services. Those services are some of the applications that enable you to interact with the system.

The init command traditionally boots a Linux system to a specific system state, commonly referred to as its runlevel.

Runlevels determine which of the many available system services are started, as well as in which order they start. A special runlevel is used to stop the system, and a special runlevel is used for system maintenance. As you will see, there are other runlevels for special purposes.

You traditionally use runlevels to manage the system services running on a Linux computer. All these special files and scripts are set up during installation, but you can change and control them manually.

With the integration of systemd, much of the interest and concern about runlevels is unnecessary. This is because systemd replaces much of the functionality previously performed by runlevels. For example, you don’t even see the runlevel concept used anymore, but instead you hear generic terms like booting into the default.target, multi-user.target, graphical.target, or reboot.target. This information remains in the book for historic context, but most users can simply skim the runlevel sections.

System Services and Runlevels

Runlevel Definitions

he runlevels are defined in a traditional Linux system in /etc/init.d. Some distributions use the traditional /etc/inittab file to manage boot services. Ubuntu has not used this for several years. Because it is not standard in Ubuntu, this book does not cover /etc/inittab.

Each runlevel tells the init command what services to start or stop. Although runlevels might all have custom definitions, Ubuntu has adopted some standards:

Image Runlevel 0—Known as “halt,” this runlevel shuts down the system.

Image Runlevel 1—This is a special runlevel, defined as “single,” which boots Ubuntu to a root access shell prompt where only the root user may log in. It has networking, X, and multi-user access turned off. This is the maintenance or rescue mode. It enables the system administrator to perform work on the system, make backups, or repair configuration or other files.

Image Runlevels 2–5—These runlevels aren’t used in Ubuntu in any way that distinguishes them from each other, but are often used in other Linux distributions.

Image Runlevel 6—This runlevel reboots the system.

Runlevel 1 (also known as single-user mode or maintenance mode) is most commonly used to repair file systems and change the root password on a system when the password has been forgotten. Trespassers with physical access to the machine can also use runlevel 1 to access your system.

matthew@seymour:~$ ls /etc/rc1.d/

K10jackd K20rsync K20vboxdrv K80cups S70pppd-dns

K15pulseaudio K20saned K20winbind README S90single

K20acpi-support K20saslauthd K74bluetooth S30killprocs

K20kerneloops K20speech-dispatcher K77ntp S70dns-clean

These scripts, as with all scripts in the rc*.d directories, are actually symbolic links to system service scripts that reside in the /etc/init.d directory.

The rc1.d links are prefaced with a letter and number, such as K15 or S10. The K or S in these prefixes indicate whether a particular service should be killed (K) or started (S) and pass a value of stop or start to the appropriate /etc/init.d script. The number in the prefix executes the specific /etc/init.d script in a particular order. The symlinks have numbers to delineate the order in which they are started. Nothing is sacred about a specific number, but some services need to be running before others are started. You would not want your Ubuntu system to attempt, for example, to mount a remote Network File System (NFS) volume without first starting networking and NFS services.

Traditionally, Ubuntu boots into runlevel 5 by default, which means it starts the system as normal and leaves you inside the X Window System looking at the graphical login prompt. It knows what runlevel 5 needs to load by looking in the rc*.d directories in /etc. Ubuntu contains directories for rc0.d through to rc5.d and rcS.d.

Assuming that the value is 1, the rc script executes all the scripts under the /etc/rc.1 directory and then launches the graphical login.

If Ubuntu is booted to runlevel 1, for example, scripts beginning with the letter K followed by scripts beginning with the letter S under the /etc/rc1.d directory are then executed:

Booting into the Default Runlevel

Understanding init Scripts and the Final Stage of Initialization

case "$1" in

start)

start

;;

stop)

stop

;;

restart)

restart

;;

reload)

reload

;;

status)

rhstatus

;;

condrestart)

[ -f /var/lock/subsys/smb ] && restart :

;;

*)

echo $"Usage: $0 {start stop restart status condrestart}"

exit 1

esac

Each /etc/init.d script, or init script, contains logic that determines what to do when receiving a start or stop value. The logic might be a simple switch statement for execution, as in this example:

Although you can use the scripts to customize the way that the system runs from power-on, absent the replacement of the kernel, this script approach also means that you do not have to halt the system in total to start, stop, upgrade, or install new services.

Note that not all scripts use this approach and that other messages might be passed to the service script, such as restart, reload, or status. Also, not all scripts respond to the same set of messages (with the exception of start and stop, which they all have to accept by convention) because each service might require special commands.

After all the system scripts have been run, your system is configured and all the necessary system services have been started. If you are using a runlevel other than 5, the final act of the init process is to launch the user shell—bash, tcsh, zsh, or any of the many command shells available. The shell launches and you see a login prompt on the screen.

You can configure what services run at startup from the Dash with a search for Startup Applications (shown in Figure 15.1). Here Ubuntu lists all the services that you can have automatically start at boot time. They are usually all enabled by default, but you can uncheck the ones you don’t want and click OK. It is not recommended that you disable services randomly “to make things go faster.” Some services might be vital for the continuing operation of your computer, such as the graphical login manager and the system communication bus.

Controlling Services at Boot with Administrative Tools

Changing Runlevels

matthew@seymour:~$ sudo telinit 2

Today, the same thing would be done using this systemd command:

matthew@seymour:~$ systemctl default

After making changes to system services and runlevels, you can use the telinit command to change runlevels on-the-fly on a running Ubuntu system. Changing runlevels this way enables system administrators to alter selected parts of a running system to make changes to the services or to put changes into effect that have already been made (such as reassignment of network addresses for a networking interface).

For example, in the past a system administrator could quickly change the system to maintenance or single-user mode by using the telinit command with its S option like this:

matthew@seymour:~$ sudo telinit S

Today, the same thing would be done using this systemd command:

matthew@seymour:~$ sudo systemctl rescue

The telinit command uses the init command to change runlevels and shut down currently running services. However, under systemd, telinit is deprecated.

After booting to single-user mode, you used to then return to multi-user mode, like this:

Troubleshooting Runlevel Problems

Reordering or changing system services during a particular runlevel is rarely necessary when using Ubuntu unless some disaster occurs. But system administrators should have a basic understanding of how Linux boots and how services are controlled in order to perform troubleshooting or to diagnose problems. By using additional utilities such as the dmesg less command to read kernel output after booting or by examining system logging with cat /var/log/messages less, it is possible to gain a bit more detail about what is going on when faced with troublesome drivers or service failure.

Starting and Stopping Services Manually

If you change a configuration file for a system service, it is usually necessary to stop and restart the service to make it read the new configuration. If you are reconfiguring the X server, it is often convenient to change from runlevel 5 to runlevel 1 to make testing easier and then switch back to runlevel 5 to reenable the graphical login. If a service is improperly configured, it is easier to stop and restart it until you have it configured correctly than it is to reboot the entire machine.

The traditional way to manage a service (as root) is to call the service’s /etc/init.d name on the command line with an appropriate keyword, such as start, status, restart, or stop. For example, to start the Apache web server, call the /etc/init.d/apache2 script like this:

matthew@seymour:~$ sudo /etc/init.d/apache2 start

Starting apache 2.2 web server

The script executes the proper programs and reports the status of it/them. Stopping services is equally easy, using the stop keyword.

Using Upstart

Starting in 2015, Ubuntu has switched to systemd instead of Upstart. This content is being retained in the book for users of LTS versions like 14.04 LTS that are still supported, but for anyone doing a new installation, you should skip this section and move immediately to the next section, systemd. If you are upgrading from an earlier release of Ubuntu, you may benefit from reading https://wiki.ubuntu.com/SystemdForUpstartUsers.

Upstart was originally developed for Ubuntu. It is an event-based replacement for the /sbin/init daemon and System-V init system. It handles starting of tasks and services during boot and stops them during shutdown. It also supervises them while the system is running and is intended to become a way to have tasks and services start or stop automatically based on specific events that happen rather than having to call a script manually to start or stop them. This is a big change and a big deal because it will make the overall system much more flexible, configurable, and responsive to conditions.

Basically, in Upstart, tasks and services are started and stopped by events. Events are generated as other tasks and services are started and stopped and may be received from any other process on the system. Services may be respawned if they die unexpectedly and communication with the init daemon occurs over D-Bus. Planned features that have not yet been implemented include the ability for events to be created at timed intervals or at scheduled times or as files or directories are changed and the creation of user services that users can start and stop themselves. This means that eventually Upstart jobs could even replace the venerable cron and do things previously impossible on any UNIX or Linux version.

For now, Upstart is being used for many jobs including boot and shutdown, but not all services have Upstart jobs written. Those that exist reside as expected in /etc/init and are easily accessible in the same basic manner as init jobs. If an Upstart job exists and you try to manage it using the traditional method, you get a message like this:

matthew@seymour:~$ sudo /etc/init.d/ufw stop

[sudo] password for matthew:

Rather than invoking init scripts through /etc/init.d, use the service(8)

utility, e.g. service ufw stop

Since the script you are attempting to invoke has been converted to an

Upstart job, you may also use the stop(8) utility, e.g. stop ufw

ufw stop/waiting

Starting 2015, Upstart has been replaced with systemd. systemd was developed at the same time as Upstart and the two have been competing for the title of “init replacement of the future.” systemd won. There isn’t much point in learning a ton about Upstart, other than what you need for the moment. The future lies with systemd.

To interact with systemd, you typically use the systemctl command. The main interactions you are likely to have with systemd involve starting and stopping services. Table 15.1 shows commands related to services.

Starting 2015, Upstart has been replaced with systemd. systemd was developed at the same time as Upstart and the two have been competing for the title of “init replacement of the future.” systemd won. There isn’t much point in learning a ton about Upstart, other than what you need for the moment. The future lies with systemd.

To interact with systemd, you typically use the systemctl command. The main interactions you are likely to have with systemd involve starting and stopping services. Table 15.1 shows commands related to services.

systemd

Boot Repair

Sometimes, such as when you install both Windows and Ubuntu on the same hard drive, boot problems can develop. Boot Repair is a simple GUI tool to fix those problems. Typically, it just reinstalls GRUB2, but using the program is a much easier solution for many users. The program is not yet in the Ubuntu repositories, although plans for including it have been discussed. In the meanwhile, should you need it, take a look at https://help.ubuntu.com/community/Boot-Repair or the official documentation at http://sourceforge.net/projects/boot-repair/.

Console-Based Monitoring

matthew@seymour:~$ gedit &

[1] 9649

system monitoring tools

Those familiar with UNIX system administration already know the ps, or process display, command commonly found on most flavors of UNIX. Because of the close relationship between Linux and UNIX, it also includes this command, which enables you to see the current processes running on the system and who owns them and how resource-hungry they are.

Although the Linux kernel has its own distinct architecture and memory management, it also benefits from enhanced use of the /proc file system, the virtual file system found on many UNIX flavors. Through the /proc file system, you can communicate directly with the kernel to get a deep view of what is currently happening. Developers tend to use the /proc file system as a way of extracting information from the kernel and for their programs to manipulate that information into human-readable formats. A full discussion of the /proc file system is beyond the scope of this book. To get a better idea of what it contains you can take a look at http://en.tldp.org/LDP/Linux-Filesystem-Hierarchy/html/proc.html for an excellent and in-depth guide.

Processes can also be controlled at the command line, which is important because you might sometimes have only a command-line interface. Whenever an application or command is launched, either from the command line or a clicked icon, the process that comes from the kernel is assigned an identification number called a process ID (PID). This number is shown in the shell if the program is launched via the command line:

In this example, gedit has been launched in the background, and the (bash) shell reported a shell job number ([1] in this case). A job number or job control is a shell-specific feature that allows a different form of process control, such as sending or suspending programs to the background and retrieving background jobs to the foreground. (See your shell’s man pages for more information if you are not using bash.)

The second number displayed (9649 in this example) represents the PID. You can get a quick list of your processes by using the ps command like this:

matthew@seymour:~$ ps

PID TTY TIME CMD

9595 pts/0 00:00:00 bash

9656 pts/0 00:00:00 gedit

9657 pts/0 00:00:00 ps

As you can see, the output includes the PID along with other information, such as the name of the running program. As with any UNIX command, many options are available; the proc man page has a full list. One useful option is -e, which lists all processes running on the system. Another is aux, which provides a more detailed list of all the processes. You should also know that ps works not by polling memory, but through the interrogation of the Linux /proc or process file system.

The /proc directory contains many files, some of which include constantly updated hardware information (such as battery power levels and so on). Linux administrators often pipe the output of ps through grep to display information about a specific program, like this:

matthew@seymour:~$ ps aux grep bash

matthew 9656 0.0 0.1 21660 4460 pts/0 Ss 11:39 0:00 bash

Using the kill Command to Control Processes

The kill command is a basic UNIX system command. You can communicate with a running process by entering a command into its interface, such as when you type into a text editor. But some processes (usually system processes rather than application processes) run without such an interface, and you need a way to communicate with them as well, so you use a system of signals. The kill system accomplishes that by sending a signal to a process, and you can use it to communicate with any process. The general format of the kill command is as follows: matthew@seymour:~$ kill option PID

This tells the process with PID to stop; you supply the actual PID. However, without a signal option, there is no guarantee that a process will be killed because programs can catch, block, or ignore some terminate signals (and this is a good thing, done by design).

matthew@seymour:~$ kill -9 PID

This includes a signal for kill that cannot be caught (9 is the number of the SIGKILL signal); you can use this combination when the plain kill shown previously does not work. Be careful, though. Using this does not allow a process to shut down gracefully, and shutting down gracefully is usually preferred because it closes things out that the process might have been using and ensures that things such as logs are written before the process disappears. Instead, try this first.

matthew@seymour:~$ kill -1 PID

This is the signal to “hang up”—stop—and then clean up all associated processes as well (1 is the number of the SIGHUP signal).

In fact, some system administrators and programmers prefer something like this progression of signals:

kill -15 sends a SIGTERM, which is a clean shutdown that flushes data that needs to be written to disk, cleans up memory registers, and closes the PID.

kill -1, mentioned above, sends a SIGHUP, which cleans up and usually also causes the program to restart.

kill -2 sends a SIGINT, which is an interrupt from the keyboard, the equivalent to sending a CTRL+C. Say you want to stop a program that is running in the background as a daemon instead of in the terminal foreground, this is a good way to do it.

kill -11 sends a SIGSEGV, which causes the problem to experience a segmentation fault and close. It does not flush data to disk, but it may create a core dump file that could be useful for debugging and learning why the program was misbehaving (or behaving exactly as you told it to behave, but not as you intended it to behave).

kill -9 sends a SIGKILL, which should be used as a last resort because it does not sync any data. Nothing is written to disk, no logging, no debugging, nothing. You stop the PID (usually, but not always), but you get nothing that helps you either save data that needed to be written to disk or assists you in figuring out what happened.

As you become proficient at process control and job control, you will learn the utility of a number of kill options. You can find a full list of signal options in the kill man page.

Using Priority Scheduling and Control

Two useful applications included with Ubuntu are the nice and renice commands. They are covered in Chapter 12, “Command-Line Master class Part 2.” Along with nice, system administrators can also use the time command to get an idea of how much time and what proportion of a system’s resources are required for a task, such as a shell script. (Here, time is used to measure the duration of elapsed time; the command that deals with civil and sidereal time is the date command.) This command is used with the name of another command (or script) as an argument, like this: matthew@seymour:~$ sudo time -p find / -name conky

/home/matthew/conky

/etc/conky

/usr/lib/conky

/usr/bin/conky

real 30.19

user 1.09

sys 2.77

Output of the command displays the time from start to finish, along with the user and system time required. Other factors you can query include memory, CPU usage, and file system input/output (I/O) statistics. See the time command’s man page for more details.

The top command is covered in Chapter 12, “Command-Line Master class Part 2.” It has some even-more-powerful cousins worth mentioning here.

One option for monitoring resource usage called htop. It is not installed by default, but is available from the Ubuntu software repositories and is worth a minute or two of your consideration after you’re familiar with top. Here are some key differences:

In htop, you can scroll the list vertically and horizontally to see all processes and complete command lines.

In top you are subject to a delay for each unassigned key you press (especially annoying when multikey escape sequences are triggered by accident).

htop starts faster (top seems to collect data for a while before displaying anything).

In htop you don’t need to type the process number to kill a process; in top you do.

In htop you don’t need to type the process number or the priority value to renice a process; in top you do.

htop supports mouse operation; top doesn’t.

top is older, hence, more used and tested.

See http://hisham.hm/htop/ for more details, if you are interested.

Although top includes some memory information, the free utility displays the amount of free and used memory in the system in kilobytes. (The -m switch displays in megabytes.) On one system, the output looks like this:

matthew@seymour:~$ free

total used free shared buffers cached

Mem: 4055680 3327764 727916 0 280944 2097568

-/+ buffers/cache: 949252 3106428

Swap: 8787512 0 8787512

This output describes a machine with 4GB of RAM memory and a swap partition of 8GB. Note that none of the swap is being used and that the machine is not heavily loaded. Linux is very good at memory management and “grabs” all the memory it can in anticipation of future work.

Another useful system-monitoring tool is vmstat (virtual memory statistics). This command reports on processes, memory, I/O, and CPU, typically providing an average since the last reboot; or you can make it report usage for a current period by telling it the time interval in seconds and the number of iterations you desire, like this:

matthew@seymour:~$ vmstat 5 10

This runs vmstat every five seconds for 10 iterations.

Use the uptime command to see how long it has been since the last reboot and to get an idea of what the load average has been; higher numbers mean higher loads.

Disk Space

Along with system load, it is important to keep an eye on the amount of free hard drive space that your computer has remaining.

It is easy to do this, mainly by using the df command, as follows:

matthew@seymour:~$ df

open up your server and type in the command.

What do you see?

Discuss with your class mates.

Now do do this command df - h

story 2

story 3

Disk Quotas

products & services

Disk quotas are a way to restrict the usage of disk space either by user or by groups. Although rarely—if ever—used on a local or standalone workstation, quotas are definitely a way of life at the enterprise level of computing. Usage limits on disk space not only conserve resources, but also provide a measure of operational safety by limiting the amount of disk space any user can consume.

Disk quotas are more fully covered in Chapter 13, “Managing Users.”

Many of the services and programs that run on your computer save data in log files. Typical data include success and error messages for processes that are attempted and lists of actions. Some of these log files are extremely technical while others are easily read and parsed by regular users, if you know what you are looking for. Most log files can be found in /var/log/ or its subdirectories.

Typically, these logs are used to learn about something that happened recently, so most admins are interested in the most recent entries. In this case, using tail is common to read just the most recent 10 lines:

matthew@seymour:~$ tail /var/log/boot.log

Run the above command.

what do you see?

Discuss.

Checking Log Files

Rotating Log Files

Log files are great, but sometimes they can get unwieldy as time passes and more information is logged. Rotating log files prevents that problem. Rotating a log file means to archive the current log file, start a fresh log, and delete older log files. This means you always have a current log file to peruse, the previous log file, and that the log files never grow too large.

Typically, log rotation is set up by an administrator to happen nightly, at a time when the system is not being heavily used. This is done with a utility called logrotate, running as a cron job (cron is described in Chapter 14, “Automating Tasks and Shell Scripting”).

Ubuntu comes with logrotate installed. There is a cron job already set as well. You can find the script at /etc/cron.daily/logrotate. This file is a bash script and looks like this:

#!/bin/sh

# Clean nonexistent log file entries from status filecd /var/lib/logrotatetest -e

status touch statushead -1 status > status.cleansed 's/"//g' status while read

logfile datedo [ -e "$logfile" ] && echo "\"$logfile\" $date"done >> status.cleanmv

status.clean status

test -x /usr/sbin/logrotate exit 0/usr/sbin/logrotate /etc/logrotate.conf

Graphical Process and System Management Tools

The GNOME and KDE desktop environments offer a rich set of network and system- monitoring tools. Graphical interface elements, such as menus and buttons, and graphical output, including metering and real-time load charts, make these tools easy to use. These clients, which require an active X session and (in some cases) root permission, are included with Ubuntu.

If you view the graphical tools locally while they are being run on a server, you must have X properly installed and configured on your local machine. Although some tools can be used to remotely monitor systems or locally mounted remote file systems, you have to properly configure pertinent X11 environment variables, such as $DISPLAY, to use the software or use the ssh client’s -X option when connecting to the remote host.

System Monitor

You can find a graphical monitoring tool called System Monitor by searching the Dash. This tool is informative, easy to use and understand, and very useful. It has tabs for information about running processes, available resources, and local file systems.

Conky

Conky is a highly configurable, rather complex system monitor that is light on system resources and can give you information about nearly anything. The downside is that you need to learn how to configure it. Simply installing Conky from the software repositories only gets you started. However, for those who want specific information displayed on our desktop at all times, it is invaluable and well worth the time it takes to figure it out. We give an example here, but to truly appreciate the power, flexibility, and possibilities of Conky, visit http://conkyhardcore.com/ and this long-running thread on the Ubuntu Forums http://ubuntuforums.org/showthread.php?t=281865.

Conky uses text files for configuration and is often started using a short script. The example shown in Figure 16.1 is from Matthew’s personal configuration on his desktop and is intended as a simple example to get you started.

product 2

product 3

Learn more about creating dynamic, engaging presentations with Prezi