2007-10-26

Tape Backups: Keeping the Tape Streaming

An LTO-3 tape drive requires a pretty high sustained data input rate in order to keep streaming. If the tape cannot be kept streaming, it will stop and restart, and possibly start “shoe-shining”: frequent stopping and restarting due to buffer under-runs. This behaviour incurs much more wear and tear on the tape and drive.

There are several things I have tried with good results to reduce or avoid this problem:

  • Disable compression on the tape drive.
  • Use previous generation media (LTO-2 media should work fine in an LTO-3 drive, but at LTO-2 speeds).
  • Use the host system’s RAM to buffer the stream.

The third option assumes your host system has quite a bit of free memory, but can be very effective. A useful utility for doing this is mbuffer. In the following example, a 1 GiB buffer is used (-m 1024M), with a tape block size of 262 144 bytes (-s 262144), and the output rate is limited to 25 MiB/s (-R 25M). The input stream is provided by tar, using the same block size (tar measures it in units of 512 bytes). You may have to tune the rate to suit the source drive and workload.

$ tar -b 512 -cpf - /.../wherever | mbuffer -s 262144 -R 25M -m 1024M -P 100 --md5 -f -o /dev/nst0

Building QEMU on Gentoo

QEMU won't compile properly with GCC version 4. On Gentoo, you can revert to another installed GCC version using the gcc-config command:

$ gcc-config -l
 [1] x86_64-pc-linux-gnu-3.4.6
 [2] x86_64-pc-linux-gnu-3.4.6-hardened
 [3] x86_64-pc-linux-gnu-3.4.6-hardenednopie
 [4] x86_64-pc-linux-gnu-3.4.6-hardenednopiessp
 [5] x86_64-pc-linux-gnu-3.4.6-hardenednossp
 [6] x86_64-pc-linux-gnu-4.1.2 *

$ gcc-config 1
$ source /etc/profile
$ emerge -av app-emulation/qemu

2007-10-24

Customer Service

I’m sure everyone has a tale of tedium while dealing with customer service. Here’s a run-down of my recent attempt to troubleshoot my new static IP address.

  • Phoned Ihug technical support to find out what my static IP address was, and if I had to request that it be enabled (which I did).
  • Noticed that the PPP connection on my modem/router was failing to be established. The DSL link was OK.
  • Phoned Ihug again to ask for help. Checked settings: username, password, VPI, VCI, etc.; all OK. Anyway, it was all working yesterday. Ihug staff are not trained for my particular model of modem (Nokia M1122) (even though it was the only model available when DSL started here), so I was directed to Nokia customer services.
  • Dialled the Nokia 0800 number I was given. Disconnected number!
  • Dialed directory services and was given the correct Nokia 0800 number (1 digit out).
  • Talked to someone from Nokia Asia support, who informed me that they only deal with Nokia phone products. They gave me the (again, wrong) 0800 number to try, and also a branch office number in Wellington.
  • Called the Wellington Nokia branch number, only to find it was a residential number.
  • Dialed directory services to confirm the Wellington number, and to find an Auckland Nokia branch number to try instead.
  • Called the Auckland Nokia branch number, and navigated the menu system to “modem support”.
  • This got me through to someone at DataComm, who informed me that they no longer do technical support for Nokia modems, and forwarded my call to another number.
  • This got me to an identical sounding menu, but this time choosing the modem support option got me a “not in service” message.
  • Called the Auckland Nokia branch number again, and opted to speak to an operator, who told me that Nokia no longer have anything to do with the modem business here, and that they no longer provide support for any modem products.
  • Called Ihug technical support to tell them of my fruitless search. The support representative tried to find someone who knew something about the M1122, but couldn’t. They suggested I consult the user manual.

So, I don’t have any Internet access at the moment, but I feel I should do Nokia a favour and tell them about the wrong telephone numbers they are giving out. However, I believe the following M1122 command should help me determine whether the problem is with the ATM link:

atmping 0 100 segment
atmping 0 100 end-to-end

I will try these out when I get home.

RIP Paul Raven

Killing Joke bass player Paul Raven died of a suspected heart attack in Geneva on October 20. It’s a bit hard to believe; I won’t ever get to see that particular configuration of the band playing live.

2007-10-09

A thought on “intellectual property”

A thought on “intellectual property”:

  • There can be nothing in the Universe that did not already have the potential to be.
  • Therefore, there is no invention—only discovery.

2007-09-30

C basics: using separate files/modules

My C programming experience is pretty limited, and recently I was trying to convert a monolithic program into separate files/modules. Here are a few notes on the process, in particular the various C language storage classes.

  • Each source file (e.g. mymodule.c) will be compiled to an object file (e.g. mymodule.o)
  • The object files are then linked together to form an executable file or image (i.e. the program file).
  • static global variables are visible to all functions within the current source file. They are not accessible to functions defined in other files.
  • Global variables are static unless declared otherwise.
  • static local variables (i.e. static variables declared within a function) are initialised at run-time but not re-initialised when the function is called.
  • extern global variables are visible to all modules, not just functions within the current source file. Use these for variables to be shared among modules/files.
  • extern variables cannot be initialised in the file declaring them as extern. However, other modules sharing them can initialise them, as they are not extern in that context.
  • If sharing a module among others, write its function prototypes in a header (.h) file, and the function definitions in a source (.c) file. Then just #include the .h file in any dependent modules (do not include the .c file, as this will double up on definitions!).

Typical compilation and linking routine to create an executable:

$ gcc -c -o mymodule.o mymodule.c
$ gcc -c -o anothermodule.o anothermodule.c
$ gcc -c -o main.o main.c
# Linking stage; note use of gcc, not ld!
$ gcc -o myprogram main.o mymodule.o anothermodule.o