Thursday, 11 August 2016

Adventures with USB to SATA/PATA bridges

If you have a spare SATA hard drive or DVD burner, or a PATA DVD burner lying around, you may be tempted, like me, to connect it to your computer using a USB adaptor, to function as an outboard drive, using one of the many identical adaptors you can buy on eBay for a few dollars. You will need an external power supply of course, and I'm assuming you have one lying around too. All these experiments were done on a Raspberry Pi 2.


The first one I bought looked like this. It also came with a SATA cable and a Molex to SATA power adapter cable. Note the there are two PATA interfaces, one for 3.5 inch HDs and DVDs and one for 2.5 inch HDs on opposite sides. For the 2.5 inch HDs no power supply is needed, as the power comes from USB.

The lsusb command shows that this uses the JMicron 20337 chip:

ID 152d:2338 JMicron Technology Corp. / JMicron USA Technology Corp. JM20337 Hi-Speed USB to SATA & PATA Combo Bridge


There are a couple of quirks with it. The first is that the chip will not be detected unless the HD/DVD side is plugged in and powered up. The other is that the 40 pin (3.5 inch) PATA side can be plugged into the HD/DVD offset by one pin if you are not careful, because the plug is slightly narrower than the socket, and the key is also a bit smaller than the slot. The second is that the Molex power connector may jam against the PATA connector. In fact this is a cause of accidental offset if you plug the Molex connector in first. The problem is a wing on the connector near the wire end that makes it take up more room. I snipped off one wing with cutters.

Using this adaptor with a DVD burner was fine, the drive appeared as /dev/sr0, and I was able to use brasero to burn optical media. However experience with 3.5 inch SATA HDs was unsatisfactory. If data rates are too fast, the chip is apt to disconnect and then the Linux driver tries to reset the USB interface but this never works. It seemed to work ok with 2.5 inch laptop PATA drives. The disk appears as /dev/sda, as the SD card drive is /dev/mm-something.


I bought a second USB adaptor, this time only for SATA devices. This one came as a rather fat USB dongle with SATA and e-SATA sockets on the side. You may have to use a hub if it blocks other USB sockets on your computer from being used. The lsusb command shows that this uses the JMicron 20329 chip.

ID 152d:2329 JMicron Technology Corp. / JMicron USA Technology Corp. JM20329 SATA Bridge

There is an intriguing message in the system log:

Quirks match for vid 152d pid 2329: 8020

I haven't looked at the driver source, but the message seems to suggest that the driver copes with this one better. When I used it with a SATA HD, there were no disconnects and resets. So this is the one I will use to interface to the HD, using the 20337 only for the DVD drive.

You may see USB adapters that plug directly onto the back of the drive. Those are for 2.5 inch drives only as the power comes from USB.

All the devices mentioned here are USB 2.0. USB 3.0 adapters are available, and only worth it for SATA HDs, but I don't have a great need for speed so I'll let them get cheaper before I buy one.

Monday, 1 August 2016

How to display Korean characters on openSUSE Leap 42.1

If you do a web search for this you will find a confusing amount of information for various distros. Some of it will relate to Korean keyboard input. At the moment I just want to display Korean characters instead of a square box with the Unicode; input comes later.

It turns out that the openSUSE developers have made it really easy. Here is the Reddit post that solved my problem: Korean fonts in openSUSE

There isn't much I can add to this solution except to mention that it installed a whole bunch of packages to cater for input methods (several, which I intend to explore later), KDE, Mozilla (Firefox and Thunderbird), Libreoffice, and even GIMP. So all those subsystems are sorted out in one fell swoop.

The other thing I want to mention is that other languages can be added to the secondary support list in YaST so presumably this solution will work for those.

I'm sorry if this doesn't help you with other distros. Hopefully your distro implemented a comprehensive solution in the configuration tool. Try that before you delve too deeply into the system.

Saturday, 23 July 2016

"$@" is a shell idiom

TL;DR: Use "$@" when you want to pass arguments unchanged to a function or program.

When you read the shell documentation you will see that there are two main ways to refer to all the arguments for passing to a function or program: $* and "$@". What is the difference? This test script will demonstrate it:

#!/bin/sh

testargs() {
       echo testargs: $# arguments
       showargs $*
       showargs "$@"
}

showargs() {
       echo showargs: $# arguments
       for i
       do
               echo $i
       done
}

testargs 1 2 3
testargs word 'quoted phrase' word

The result should be:
testargs: 3 arguments
showargs: 3 arguments
1
2
3
showargs: 3 arguments
1
2
3
testargs: 3 arguments
showargs: 4 arguments
word
quoted
phrase
word
showargs: 3 arguments
word
quoted phrase
word
As you can see, the difference is manifest when an argument has whitespace. "$@" preserves the arguments, not parsing it again to break up at whitespace in arguments. Think if it as an idiom meaning pass arguments verbatim.

Why would you ever use $* though? Here's a place where you shouldn't use "$@".
su -c "$*" user
If you were to use "$@" and it contained multiple arguments, only the first argument would be used by -c and the others would follow, causing a syntax error. This however means that if you want to pass arguments with whitespace to -c, you have to quote them and escape the quotes too.

Saturday, 9 July 2016

Installing Linuxmint 18 on RAID 1

TL;DR: Can't be done easily.

I had a PC with dual disks that I was running under openSUSE Leap 42.1 in RAID 1. I wanted to install Linuxmint 18 on it before giving it away.

First problem I encountered was that the partitioner in the installer knows nothing about RAID.

After some reading I found that the solution is to use gparted to create the RAID partitions first. But gparted didn't know how to do this. I figured out that the mdadm tool was missing, so I did:

apt-get install mdadm

Note that this installs to RAM as it's a live filesystem so needs to be redone if the install is restarted. Also there are some post-install script errors but mdadm gets installed.

Now with gparted I could create the RAID partitions and assemble them. Alternatively it can be done from the command line:

mdadm --assemble --scan

Now md0 and md1 appeared on the list of "disks" in the partitioner and I could assign them to / and /home.

The system installation went fine until it was time to install GRUB. It failed when it couldn't do

grub-install /dev/sdb /dev/sda

Changing the target to just /dev/sda and clicking Continue did nothing. This seems to be an installer bug.

So I did this from the command line:

mount /dev/md0 /mnt
grub-install --root-directory=/mnt /dev/sda
umount /mnt

When I rebooted from disk it stopped at the GRUB prompt. So I tried to boot manually.

grub> linux /boot/vmlin.... --root=/dev/md0
grub> initrd /boot/initrd...
grub> boot

The ... are where you should use TAB completion to select the kernel and initramfs images respectively. Unfortunately this failed when systemd tried to mount the root partition. The reason is that the raid modules are not present in the stock initramfs file. This was built by the Linuxmint 18 distributors.

At this point I gave up. Obviously Linuxmint 18 isn't designed to support this kind of RAID installation. If you want to go further you should rebuild the initramfs with the RAID modules included. Do let us know if you overcome this next hurdle.

And remember if you get it to work, you should install the mdadm package permanently, as it's not part of the default package set.

Monday, 19 October 2015

Enable EXIF rotation for geeqie on openSUSE

I found that while I could rotate a JPEG image from the Edit > Orientation menu, I could not Apply Orientation to Image Content. For this extra programs are required. For JPEG it is exiftran, so I installed that package. For other image formats other packages might be required.

However that by itself is not enough, because geeqie uses a desktop spec file and a helper script to do the rotation for a variety of image types. In the desktop spec file, the helper script is specified as geeqie-rotate. Unfortunately this is in /usr/lib/geeqie and not on the search path.

My solution was to make symlinks from /usr/lib/geeqie/* to /usr/local/bin so that the desktop spec file could invoke the helper script.

Now I can easily fix up those vertical pictures generated by a camera without an orientation sensor.

Thursday, 28 May 2015

Adding fonts to OpenNX

One of my users needed to use NX (version 3) due to working over a lower bandwidth connection. I followed the instructions to install a FreeNX server on CentOS. The user followed the instructions to install an OpenNX client on Windows.

Unfortunately many glyphs came out as squares in CAD applications. After some research, I arrived at these conclusions:

  1. NX version 3 uses client side fonts. It is also possible to use an X font server, but that partly defeats the purpose of NX since the fonts will have to be served over the connection. The reason OpenNX couldn't render all glyphs is because it is distributed with only a basic set of fonts.
  2. NX version 4 doesn't require client side fonts. Unfortunately it is not free software.
Looking into OpenNX, I saw that it uses Xming underneath, with a font directory. Well, what if I installed more fonts there?

I fetched the Xming-fonts installer package from Sourceforge and ran it, selecting the dejavu fonts as well.

I renamed the misc and TTF font directories under OpenNX (typically C:\Program Files\OpenNX\share\Xming\fonts), then copied the misc, TTF and dejavu font directories from Xming (typically C:\Program Files\Xming\fonts) into the OpenNX directory.

I edited (as administrator) the font-dirs file in the Xming root directory under OpenNX to add the paths of the extra font directories for TTF and dejavu.

I started a NX session, opened a terminal window and ran xlsfonts, and voila, I had a much larger set of fonts. The CAD applications ran without missing fonts.

PS: A caveat, when you paste the client DSA key from the server into OpenNX, make sure you end it with a newline or the key cannot be parsed.

Friday, 10 April 2015

Found duplicate PV: using /dev/... not /dev/...

When you mix software RAID1 (md) and LVM, in some situations you can get this message:

Found duplicate PV: using /dev/sdb1 not /dev/md0 ...

and the LVM doesn't assemble. The exact device names may differ, of course. But how does this happen?

What happened that at some point vgscan was run and read partition(s) that were later made into RAID1 members and saw a Physical Volume (PV) UUID on it. Since the PV UUID of a RAID1 array is identical to the PV UUID of the members, you get duplicate(s).

RAID1 members are usually not candidates for PVs, as vgscan  normally excludes such devices from consideration. However there is a cache: /etc/lvm/cache/.cache which may contain outdated entries. In the example above it contained an entry for /dev/sdb1 which should have been filtered out by virtue of being in a RAID array. The solution is simple: just run vgscan again to update the cache. But you may have a problem if the device is needed for booting up. If the root devices is on a different partition or you have a rescue DVD you might be able to mount the root filesystem containing /etc read-write and refresh the cache.

Some articles suggest editing the lvm.conf file to specify a filter to exclude the RAID1 members. Try refreshing the cache first before you resort to this as it should just work.

This problem occurred in the context of converting in-situ a filesystem on a single disk to reside in a RAID1.