Multiple FLRig with Persistent Device Mapping
Multiple FL Rig configurations
So you have multiple transceivers with CAT control being controlled by a single PC (Linux of course); this is easy enough to control with multiple instances of FLRIG as you just start it with:
% flrig --config-dir /home/mylogin/radio1 (etc)
If you use gnome you can also add launchers with different names such as
/usr/local/share/applications/flrig-radio1.desktop
and make sure you edit to name and pick up the desired configuration:
[Desktop Entry]
Name=Flrigi Radio1
GenericName=Amateur Radio Rig Control
Comment=Amateur Radio Communications
Exec=flrig --config-dir /home/mylogin/radio1
Icon=flrig
Terminal=false
Type=Application
Categories=Network;HamRadio;

USB Device Persistence
The main issue remaining is when you switch USB connectors on in a different order and the serial convertor ones for the CAT appear inconsistently to be /dev/ttyUSB0…N.
Turns out you can use udev rules to map symbolic links to the USB device by looking up vendor and product in the udev rules. I have also added the serial number of the device as I have two USB adaptors on my ICOM with the same chip . USB id for CAT and PTT/Sound. Use lsusb and similar tools to find the vendor, product and serial numbers of your devices.
For instance when I type lsusb fro radio devices I get:
YAESU
Bus 008 Device 007: ID 08bb:29c3 Texas Instruments PCM2903C Audio CODEC
Bus 008 Device 006: ID 10c4:ea70 Silicon Labs CP2105 Dual UART Bridge
Bus 008 Device 005: ID 0424:2512 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
ICOM
Bus 002 Device 022: ID 0d8c:0024 C-Media Electronics, Inc. USB Advanced Audio Device
Bus 002 Device 024: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC
Bus 002 Device 023: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC
Bus 002 Device 021: ID 058f:6254 Alcor Micro Corp. USB Hub
and so I created a
/etc/udev/rules.d/50-radios.rulesfile as below
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea70", ATTRS{serial}=="011F4194", SYMLINK+="YAESU", MODE="0666"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A4001jMj", SYMLINK+="ICOM1", MODE="0666"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A20e1voc", SYMLINK+="ICOM2", MODE="0666"
Update: After some digging around to see how I can get the two Yaesu ports from the same device with the same serial with distinct SYMLINKs - I found that you could enumerate the "interface number" from teh usb data and allocate to an environment variable -= so the YAESU line above has been replaced by:
SUBSYSTEMS=="usb", ENV{.LOCAL_ifNum}="$attr{bInterfaceNumber}"
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea70", ATTRS{serial}=="011F4194", SYMLINK+="YAESU%E{.LOCAL_ifNum}", MODE="0666"
So now when I plug the devices in any order I can use the symlinks /dev/ICOM1 etc in flrig to have a persistent device irrespective of when/where this was mapped. Currently, these look like this:
lrwxrwxrwx 1 root root 7 Dec 13 16:46 /dev/ICOM1 -> ttyUSB4
lrwxrwxrwx 1 root root 7 Dec 13 16:46 /dev/ICOM2 -> ttyUSB5
lrwxrwxrwx 1 root root 7 Dec 13 08:28 /dev/YAESU00 -> ttyUSB1
lrwxrwxrwx 1 root root 7 Dec 13 08:28 /dev/YAESU01 -> ttyUSB2
So essentially, as long as you use the symbolic link it matters not what ttyUSB number the device is mapped to.
Remember to restart the udev service to pick up the new rules ( or reboot ).
udevadm control --reload-rules && udevadm trigger
Update 2: Now I have a QMX I wanted that to appear as /dev/QMXxx so added additional rules, the whole set now looks like:
SUBSYSTEMS=="usb", ENV{.LOCAL_ifNum}="$attr{bInterfaceNumber}"
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea70", ATTRS{serial}=="011F4194", SYMLINK+="YAESU%E{.LOCAL_ifNum}", MODE="0666"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A4001jMj", SYMLINK+="ICOM1", MODE="0666"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A20e1voc", SYMLINK+="ICOM2", MODE="0666"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="a34c", SYMLINK+="QMX%E{.LOCAL_ifNum}", MODE="0666"
Disclaimer: This code is
from a hardware engineer turned hacker, it most likely aint pretty, it
most likely can be done better but …. it works
Amateur DMR – Retevis RT84 UK Code plug
So I am new to this DMR thing that is taking over Amateur radio on UHF repeaters and so a new handheld was procured. Unfortunately there was no code-plug available to pre-program and no compatible UK plugs from other radios in the wild.
A lot of conversion and merging allowed me to create a UK codeplug with all VHF/UHF repeaters (analogue and DMR), simplex and talk groups.
Here it is for those who need 🙂
https://cceb.info/short/rt84ukcodeplug
Disclaimer: This code is
from a hardware engineer turned hacker, it most likely aint pretty, it
most likely can be done better but …. it works.
Rural Broadband Solved
Superfast is now available here in semi-rural East Dorset. What a road it has been to get here and the solution involves a personal microwave point-to-point link to a neighbour some distance down the road.
When me moved in here around 11 years ago, the “broadband” was 512kbps on a good day and dead on a bad day. After numerous nudges to OpenReach they replaced hundreds of meters of overhead copper with dozens of splices and we were up to 5,000-6,700kbps ( and the lady on the corner could suddenly hear her relative in Australia when he phoned on a Friday – giving you some indication of the line attenuation ). Since this has dropped to 4Mbps.

Super fast ( FFTC ) arrived at the local exchange and the nearest cabinet (at that time) was ~1,200M from our location; as we currently run a tech business from the premises we need bandwidth. We booked and received DSL on the existing line but this resolved at 8Mbp/1.5Mbps and so was not worth paying the extra money for 😦
I switched supplier lately and despite SNR tweaks and loads of calls the line sticks at 4450kbps – useless for streaming and business use and lower than the peak of 6-7Mbps we used to achieve. Recently, however, a new FTTC cabinet has been installed in the other direction. It turns out that a couple of premises local to that cabinet have a clear(ish) line of site to my front house edge and so a chat with the neighbours yielded one who would host a dish/and phone line for me.
So a quick google for suitable, licensed, adequate equipment and a few days later I have a point-to-point 5Ghz link rock solid at 300Mbps between the two properties .
Note: Since installation, the power has been tuned down to give a link SNR of around 8-12dB (not that a site survey showed anything else on beam). This is good practice to use minimum power to achieve a reliable link. The link speed is also down to 100-150Mbps but this is fine for the BB.

Unfortunately, despite the pole, cabinet and premises of my neighbour being within 10 meters, the installation engineer who arrived to install a new line had a job card showing a pole 500M away and the line was routed to a cabinet miles away. The result was a FTTC speed worse that the current ropy ADSL. This issue seems to derive to the poor geo-location data providers have for some rural addresses.
Many, many calls to the provider yielded little help with them having difficulty understanding the issue and T***T*** saying that “3-4Mbps is perfectly acceptable for FTTC” and that “owing to congestion they could not dictate to which cabinet you are connected”. With the help of Dorset SuperFast, this was escalated through OpenReach and they finally rerouted the line (software change) to the local cabinet (on the drive) and bingo – 3 months later than the installation date – I have 80/20Mbps broadband. This is 10-20 times faster than previously experienced!
What’s my eternal IP – extended for reverse host lookup
I wanted a simple little line which gave me either my external up (and revere host if it exists) or lookup on a command line.
So we have a simple bash script which is:
ipinfo.sh [ ip-address ] ( examples: 1. ipinfo.sh 2. ip-info.sh 8.8.8.8 )
The parameter ‘ip-address’ is optional – if not given will fetch your current external address and use that.
#!/bin/bash # Parameter 1 is IP address of nothing # If nothing then get external IP if [ -x $1 ]; then IP=$(dig TXT +short o-o.myaddr.l.google.com @ns1.google.com | awk -F'"' '{ print $2}'); else IP=$1; fi XML=$(curl -s https://api.geoiplookup.net/?query=$IP) host=$(dig +noall +answer -x $IP | awk '{print $5'}) isp=$(echo $XML | xmllint --xpath "string(//isp)" - ) echo "Found host: $host [$IP] from isp ($isp)"
Disclaimer: This code is from a hardware engineer turned hacker, it most likely ain’t pretty, it most likely can be done better but …. it works.
Podcast / audio lecture filter-convertor
I have a series of PodCasts of audio lectures and suchlike. These are in various audio formats such as m4a ogg opus etc. Owing to my looooong commutes I like to listen to these in the car, from an SD card, but the car hifi system is only really is happy with mp3.
Additionally, I find some of the bass rumble and other low and high-frequency noise annoying when trying to focus on the spoken voice whilst I drive. Therefore, instead of a straightforward conversion from any format to mp3 using the ubiquitous avconc/ffmpeg software, I wanted to add some basic filtering.
The human voice is carried on old telephony between 300-3000Hz so to give some head room (i.e. preserve some quality) I decided to apply a band-pass filter with roll off at 200Hz high pass and 5000Hz low pass. Since this gives us an output with next to nothing above 6-7khz (assuming 5k at -3dB and 20dB/decade roll off) the sample rate can easily come down to from 44100 to 22050 (keeping it standard – we could have gone to 16000 I guess, the Nyquist point being 2xFmax ~14k ). I also reduced the standard VBR of the mp3 down to quality=9 ( 65 average [45-85kbps] according to spec) as this gives us more than enough bit rate for the narrow bandwidth we are now encoding.
A simple bash script then is employed to convert the various files (checking if the file is already done).
Update: Sept 2017 Having needed to split some large files for easier navigation on the car stereo and also manage single files (not all in a directory) – options, single file and split have been added:
Update 2: Sept 2017 – now added an audio filter to normalise filter based on sample window.
#!/bin/bash # # S P Smith 2015 # Convert to MP3 audio - all files in directory # doSplit=0 ################################ function show_help() { echo "What do you want " } ################################ function filterFile () { # para 1 = file , param 2 = ext , param 2 = split echo "Filterfile called with ($1) ($2) ($3) ($4) ($5) " front="`basename "$1" $3` " nf="${front}fil.mp3" if [[ ! "${#f}" -gt 5 || $f =~ .*fil.mp3$ ]] then echo "Not encoding what looks like filter file or short $f" nf="$f" else if [ -f "$nf" ] then echo "already converted $f ($nf)" else echo "convert [$f] to [$nf] " avconv -i "$f" -ac 1 \ -af "highpass=f=200, lowpass=f=6200, dynaudnorm" \ -ar 22050 -q:a 9 "$nf" fi fi if [[ "${#front}" -gt 5 && ! -d "$front" && $5 -gt 0 && $nf =~ .*fil.mp3$ ]] then mp3splt -a -t 3.2 -o @n -d "$front" "$nf" else echo "Already split ($front) or ( $5 )" fi } function doAll { declare -a arr=(".mp3 .mp4 .m4a .ogg" ) ## now loop through the above array for ext in ${arr[@]} do for f in *$ext do filterFile "$f" , $ext , $doSplit ; done done } ################################ function doOne() { f=$1 ext="${f##*.}" filterFile "$f" , ".$ext" , $doSplit ; } ################################ doSplit=0; while getopts "ash?vf:" opt; do case "$opt" in h|\?) show_help exit 0 ;; s) doSplit=1 ;; v) set -v ;; f) input_file=$OPTARG doOne "$input_file" ;; a) doAll ;; esac done # finished
Disclaimer: This code is from a hardware engineer turned hacker, it most likely ain’t pretty, it most likely can be done better but …. it works.
Backup to dropbox with duplicity
Pre-conditions:
- Assume you have installed duplicity and have a dopbox account?
So I want to backup some essential stuff from my cloud server. Dropbox pro costs next to nothing for storage and it seems that duplicity has a dropbox backend which can use the dropbox API.
First things first make sure you have the dropbox API python libraries – you can get help here:
https://blog.fite.cat/2014/05/full-backup-with-duplicity-and-dropbox/
Note that the patch is needed ( http://bazaar.launchpad.net/~ed.so/duplicity/fix.dpbx/revision/965#duplicity/backends/dpbxbackend.py ) if you are using Ubuntu 14LTS – the file can be found in /usr/lib/python2.7/dist-packages/duplicity/backends on Ubunutu.
Now you need to get an authorisation token to use this with dropbox – in order to do this just run the code and you will be prompted with a URL to do to register an application under /Apps/duplicity
duplicity /etc dpbx:///test
Follow the URL and authorise the account then press return. This will save OAuth token to .dropbox.token…. copy this to appropriate home directory if using another account to backup.
Points to remember, every time you use a new base folder you have to create it (use the dropbox web interface), so for that previous one to work I would have to create test under Apps/duplicity
Now I have bundled this all into a script which takes a number of directories and places & backs them up daily (cron invocation) to a number of named folders.
#!/bin/bash # set destination (other backends are avaialble 🙂 dest=dpbx:///vol1 # Setting the pass phrase to encrypt the backup files. export PASSPHRASE='<somethign complex>'
# # declare the directories to be backed up and where to stick-em # declare -A bkupArr bkupArr=( [/var/www/edoc/upload]=edocupload, [/home/data]=data
) # # do the backup # for bkup in ${!bkupArr[@]} do bkupDest=${bkupArr[$bkup]} echo "Backing up $bkup to " $dest/$bkupDest # doing a monthly full backup (1M) duplicity --full-if-older-than 1M $bkup $dest/$bkupDest # clean backup space duplicity remove-older-than 3M --force $dest/$bkupDest done
# Unsetting the confidential variables so they are # gone for sure. unset PASSPHRASE # quit exit 0
Disclaimer: This code is from a hardware engineer turned hacker, it most likely aint pretty, it most likely can be done better but …. it works.
Laptop/PC Idler to prevent sleep (Enterprise Class Application :-) )
Assume that you work for a large corp. that clamps down its IT equipment (a good thing) and you can’t run executable code that is not in the approved list. Assume also that to meet their green credentials the equipment sleeps then hibernates when untouched for 30 minutes. Assume also that you are a busy SysOps with multiple RDP sessions and management VPNs open all of which are closed/locked/fubar’d when the machine starts back up when you have just had a quick chat with the person in the next cube.
No PS1 or cmd available but this enterprise has a java run-time so we use a little bit of java to simulate regular button clicks:
import java.util.*;
import java.awt.Robot;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
public class idlerClass {
public static final int DELAYMS = 360000;
public static void main(String… args) throws Exception {
Robot robot = new Robot();
java.util.Date date = new java.util.Date();
//Random random = new Random();
System.out.println( “Welcome to laptop idler (prevent sleep), will generate LH mouse click every “
+ DELAYMS/1000 + ” seconds ” );
robot.setAutoDelay(40);
robot.setAutoWaitForIdle(true);
while (true) {
date = new java.util.Date();
System.out.println( “pressing mouse at “+date);
robot.mousePress( InputEvent.BUTTON1MASK);
robot.mouseRelease( InputEvent.BUTTON1MASK);
Thread.sleep(DELAY_MS);
}
}
}
Obviously a manifest file would be useful to indicate where the main class is to be found:
Main-Class: idlerClass
And a build script – nothing too interesting here but I have forced it to use an older version to work on an Enterprise system with a non-current JRE.
#!/bin/bash
javac -target 1.7 -source 1.7 idlerClass.java
jar cfvm idlerClass.jar Manifest.txt idlerClass.class
But I hear you scream “how the hell do you invoke it on a clamped device”; the answer lies in shortcuts. Create one and edit (properties) to call $JAVA_PATH$/java -jar myClass.jar and bob is your proverbial.
Disclaimer: This code is from a hardware engineer turned hacker, it most likely aint pretty, it most likely can be done better but …. it works.
Goodbye truecrypt
Well I have been using this encryption product for a while (truecrypt). The code has not been updated for a while (2012) and despite a funded audit it has not really been progressed for a couple of years. The sourceforge truecrypt site now recommends use anything else as reported in places like this!!
So what do I do for my personal and work data? As I use Linux then obvious choice would be one of the available encrypted file systems. This is the story of how I moved them across. Firstly I decided to use cryptsetup for no apparent reason apart from the fact it was bundled in the disto and supported up-to-date algorithms with the underlying dm-crypt kernel module and LUKS.
I use lvm to managed my storage and currently a 64Gb lvm logical volume ( tc1 on group ubunut-vg ) is used as a truecrypt drive. So the number one step is to create a new volume for the new drive of the same size.
$ sudo lvcreate -L 64G ubuntu_vg tc2
If you want to be paranoid you can check for bad blocks (not much point on lvm but may be useful if you are using physical disks) and then randomize the data:
$ sudo /sbin/badblocks -c 10240 -s -w -t random -v /dev/ubuntu-vg/tc2 $ sudo dd if=/dev/urandom of=/dev/ubuntu-vg/tc2
Now you can create the LUKS partition on the new logical volume; here with AES encryption using a keysize of 256 (we are also using SHA-2 hashing). Remember to choose something strong for a pass-phrase (and memorable – I use a quotation however being somewhat dyslexic it is never spelt correctly but it is consistent 🙂
$ sudo cryptsetup --verify-passphrase --cipher=aes-cbc-essiv:sha256 --key-size=256 --hash=sha256 luksFormat /dev/ubuntu-vg/tc2
Now we can set the mapper to register that partition
$ sudo cryptsetup luksOpen /dev/ubuntu-vg/tc2 tc2
I suppose we really out to put a file-system on it too; I will use ext4 for this.
$ sudo mke2fs -t ext4 /dev/mapper/tc2
Now I just copy the data across by mounting a temporary mount point and synchronising with rsync
$ sudo mkdir /mnt/tc2 $ sudo mount -t ext4 /dev/mapper/tc2 /mnt/tc2 $ rsync -avx --progress /media/truecrypt1/ /mnt/tc2
When this is complete I can delete the old truecrypt volume and update symbolic links or otherwise just map onto the old mount point. Two files to edit to get this to new drive to mount from boot.
/etc/fstab
/dev/mapper/tc2 /mnt/tc2 ext4 defaults 1 2
And of course you need an entry in /etc/crypttab to prompt for pass-phrase and key into the logical encrypted volume.
tc2 /dev/ubunutu-vg/tc2 none luks
Works for me!
Disclaimer: This code is
from a hardware engineer turned hacker, it most likely aint pretty, it most likely can be done better but …. it works.
Pump controller project
Having spent a few sleepless nights switching pumps on and off as water seeks up through soak-away and onto my patio I thought I would get a bit more intelligent (and enjoy more sleep).
A simple float switch was procured (ebay fish tank thing) and fitted into the pump sump and then I got to thinking about relays and hysteresis (don’t want pump oscillating between on and off when the water level is on the cusp). So I was going to get a simple 555 timer chip, a power transistor for relay and a few discrete components. It turns out with arduino it is cheaper to do this in software (hysteresis type delay stuff). So a development board was procured (overkill at the moment, using a mega as i wanted to explore this type of controller – scheduled to be replaced by a nano board) and a simple project was thus initiated.
Update eend-Jan.
NB: The project went from a Mega to a Nano and now onto a single chip ATTiny85 programmed with the Mega as the programmer. Nice – less than £2.00 for the micro-controller.
NB2: The cheap float switch has been replaced by a stainless-steel one as the grey water tended to gunk up the plastic device and a weighted float is more resilient.
It turns out arduino is very simple to program (in the old days we hacked machine code directly into eeprom programmers!) and a nice IDE and use of C to program makes life so simple. A cheap mains relay board was also available from ebay cheaper than I could procure the switching components and pressed into service. To power the microprocessor I tool apart an old, cheap, plug-in phone charger power supply ( USB type ) and wired this to the mains for the 5V supply – another cheap component. The most expensive part of the project was an IP55 enclosure (box to you and me) to keep it dry.
Kids: please don’t try this at home as it mixes wet with mains electricity which are not a good combination at the best of time! Parts of these circuits are at 240V a/c – it is also highly suggested that where this is plugged into the mains no more than a 1-2A fuse (depending on pump power) is used in combination with RCD protection!!!
This is a prototype hack but here are some pictures (click for larger view) and also the code.
- Well Pump me dry
- mk2-detector
- ATTiny85
The code!
/* Mains water pump controller. Input: float switch or water sensor (alt temperature sensor) Output: relay actuator. Also has hysteresis SPS Jan 2014 SNV follows: $Id: waterContorller.ino 344 2014-03-01 12:03:43Z smiths789 $ */ // are you testing, then set isTest = true // and data will be shown in serial output // put monitor on. // const boolean isTest = false; const boolean isPositiveSensor = false; void dump(); // // Variable Declarations // unsigned long pumpOnTime=0; // time pump has been on unsigned long pumpOffTime=0; // time pump has been off ( for hysteresis ) // declare hysterisis constants - miliseconds const unsigned long pumpHysterisisTime = 40000; const unsigned long pumpOnTimeout = 600000; // turn pump off after x minutes // define Pins on micropro to be used const int sensorPin = 2; // water level const int outputPin = 4; // pump relay const int ledPin = 13; // define booleans for convenience. const boolean ON = true; const boolean OFF = false; // define state of pump - start with off boolean pumpIsOn = false; // // Setup // void setup() { pinMode(outputPin, OUTPUT); pinMode(sensorPin, INPUT); pinMode(ledPin, OUTPUT); if ( isTest) Serial.begin(9600); // high is off on this relay digitalWrite(outputPin,HIGH); digitalWrite(ledPin,OFF); } // // Loop // void loop() { if ( isTest) dump(); if ( digitalRead(sensorPin) ) { isPositiveSensor ? turnPumpOn( ) : turnPumpOff( ) ; } else { isPositiveSensor ? turnPumpOff( ) : turnPumpOn( ) ; } // only need to check every second delay(1000); } boolean checkHysterisis(unsigned long start, unsigned long timeout) { return ( (millis()-start) > timeout ) ? true : false; } // int turnPumpOn() { int retval=0; // check timeout if already on if ( pumpIsOn ) { // check pump timout unsigned long pumpOperationTime = millis()-pumpOnTime; if ( pumpOperationTime > pumpOnTimeout ) { turnPumpOff(); } } else { // check how long it has been off // state change if ( checkHysterisis(pumpOffTime, pumpHysterisisTime) ) { pumpIsOn = true; pumpOnTime = millis(); digitalWrite(ledPin,ON); // warning - relay needs low on - go figure digitalWrite(outputPin,LOW); } } return retval; } int turnPumpOff() { int retval=0; if ( ! pumpIsOn ) { // do nothing ; } else { // check how long it has been on if ( checkHysterisis(pumpOnTime,pumpHysterisisTime) ) { pumpIsOn = false; pumpOffTime = millis(); // warning - relay needs high off - go figure digitalWrite(outputPin,HIGH); digitalWrite(ledPin,OFF); } } return retval; } // // test and debug code // void debug(String msg,int val) { if ( ! isTest ) return; Serial.print(msg); Serial.print(val); Serial.print("\n"); } void dump() { debug("\n------------------>TimeNow(seconds):",millis()/1000); debug("pumpOnTime:",pumpOnTime/1000); debug("pumpOffTime:",pumpOffTime/1000); debug("pumpIsOn:",pumpIsOn); debug("pumpHysterisTime:",pumpHysterisisTime/1000); debug("pumpOnTimeout:",pumpOnTimeout/1000); debug("sensorIs:",digitalRead(sensorPin)); }
Disclaimer: This code is
from a hardware engineer turned hacker, it most likely aint pretty, it
most likely can be done better but …. it works.
Linux Host with Windows (8, 8.1) Guest – Tales of woe and triumph – #1 Setting the scene
Setting the scene
A new laptop arrived for my daily hacking. This is a *large* dell with i7 8-core / 8Gb and massive 1920 width screen supplemented by a Nvidia 2Gb mobile GPU (a story in itself since it is dual intel/nvidia and a voyage into bumblebee, optimus and prium ensued.
Being a Dell this came primed with Window 8 – I could not make head nor tail of this until I installed classic shell (thanks guys) which made it almost usable. As this was pre-installed I loaded all my required software (mucho), configured it and then proceeded to fight multiple blue screens, corruption and restore. I even tried using Ubunutu as guests on M$ hyper-V. Well it was all worth a try wasn’t it (UEFI boot will be the subject of another post).
So, after ruining a good few evenings I decided to give up and do it properly. This meant Ubuntu 13.10 host with Windows guest and virtual network with all data stored on a truecrypt logical volume on the host shared on samba. I decided to use lvm and establish a logical partition for the windows system to use; this proved useful later as a snapshot of the windows sub-partitions can be done using kpartx -a <logical lvm> then ntfsclone on the visible sub-partition (don’t get me started on fsarchiver and ntfs….).
This has now been running for some months, I regularly take a snapshot of the virtual “just in case” and all works hunky dory (although 13.04 to 13.10 killed USB hot swap – an apparmor and libvirt issues solvable) and sound issues (mainly though I use a usb headset passed to the guest for dragon naturally speaking).
More details to follow on how do do al this without the rabbit holes and gotcha’s I enjoyed along the way …
Code:
#!/bin/bash
echo "echo"


