Scarborough Repair and Bike Cafe 2021

Introducing Scarborough Repair and Bike Cafe’s series of virtual repair and bike safety/mapping workshops via zoom. These workshops aim to encourage a culture of reducing waste and promoting sustainability.

Neat little virtual event being organized by the Woburn Scarborough Community.

I’ll be there talking about PC Hardware & Software, namely common failure mechanisms and how to prevent, anticipate and react to them.

Check us out here for more details!

Final-Scarborough-Repair-and-Bike-Cafe-Workshops

Build a RCM Switch for the Nintendo Switch

A majority of the gaming I’ve done throughout the years has been on the PC – keyboard & mouse are a lot more in my comfort zone, not to mention the plethora of titles available. Despite this, if I was to choose a favourite console, it would have to be the Nintendo Switch. It’s a highly versatile piece of hardware, capable of mobile or docked game-play on a larger screen while maintaining a decent battery life, touchscreen, and detachable controllers. Not to mention the internal system specs, which are pretty hardcore considering the package size:

CPU/GPUCustom NVIDIA Tegra (X1-based)
Storage32 GB Internal, supports microSD up to 2TB
WirelessWi-Fi (IEEE 802.11 a/b/g/n/ac)
Bluetooth 4.1
Video1080p when docked, 720p on built-in 6.2-inch LCD Screen / 1280 x 720
AudioStereo, supports 5.1ch PCM output
Battery4310mAh
SensorsAccelerometer, gyroscope, and brightness sensor
Nintendo Switch internal specifications

The only drawback is that it’s, well, a console. Like all consoles, access to the underlying system is greatly restricted in the favor of a ‘just works’ system – meaning no custom software, and definitely no hardware mods. The Nintendo Switch in this case operates on Horizon OS, closed-source software with pieces from FreeBSD and Android.
Either way, it’s a shame considering the computing power packed into such an elegant, mobile package. Imagine its potential in areas such as robotics and automation where the system can operate as a control panel!

Definitely lots of potential here, and thanks to the hacker/homebrew community, steps are taken every day to unlock more of the system’s true potential – the most daunting and groundbreaking of these was exploiting the system in recovery mode (RCM) to be able to inject custom payloads via the Fusée Gelée coldboot vulnerability. This permits arbitrary code execution – effectively allowing us to run custom code in the active stack while the system remains powered on. Enter left-stage, homebrew.

Here’s to a contribution that should hopefully get more feet off the ground – let’s look into how we can build into the Switch’s natural system a safe way to enter RCM.

Requirements

Nintendo Switch System

While we can enter RCM on a patched Nintendo Switch system, it’ll probably be less useful from a homebrew perspective since Fusée Gelée is patched. You can check if your system is patched by validating its serial # against known lists containing device models created before/after the patch, or by entering RCM and trying to inject a payload. Both of these are covered over at switch.homebrew.guide.

Tools & Equipment

If it wasn’t clear, this is a hardware modification to your Nintendo Switch system – specifically the RIGHT JOYCON. This exploit leverages the right Joycon rail by adding a switchable short to two pins in the Joycon, which when combined with power and volume UP trigger RCM on boot. Stuff we’ll need to get this going include:

  • Y0/Y1 (tri-wing) Screwdriver
  • PH0/PH1 (phillips) Screwdriver
  • 24 AWG or thinner insulated wire (single-strand preferred)
  • Wire stripper
  • Fine-tip soldering iron and solder
  • Epoxy
  • Toothpick (for applying Epoxy)
  • Hot glue

We’ll be working in tight delicate quarters so an overhead lamp along with helping hands to secure components would be great. Otherwise, some tape and wooden blocks to hold parts in place will suffice.

In the end we’ll use a multi-meter on continuity mode to test our work.

Time & Skill

We’ll be soldering in areas with ~1mm distance from other joints, so steady hands and patience are going to be key to reduce chances of damaging the right Joycon. With all of the above equipment and sufficient skill, estimated time to completion is 30 minutes to 60 if you’re new to this.

Procedure

Step 1. Open the right Joycon by removing the 4 tri-wing screws

The rear cover will lift off, leaving the majority of components in the front cover. Pry the two off gently – there are two ribbon cables running from the rail attached to the rear cover and the PCB in the front cover.

Open right joycon

Step 2. Unscrew the LED PCB and remove protective padding for Joycon rail pins

To give us more room to work, unscrew the two silver Phillips screws holding the LED PCB in place. That’s one ribbon cable we can move aside now. Note that this piece holds the rail buttons (SR, SL, Bluetooth Sync). Remove all 3 of these buttons and put them aside should they fall out of the rail and go missing while we’re working.

To reveal our actual work surface, carefully remove the grey foam pad and put it aside – we’ll be reapplying this in the end. We now have access to the pins we’ll be soldering to.

Open right joycon with exposed rail pins and removed LED PCB

Step 3. Solder 10 cm (4 1/2″) lengths of wire to pins 7 and 10

Cut two 10 cm (4 1/2″) lengths of thin wire. Strip 1mm (1/32″) off one end of both (or melt it with your soldering iron). We will be soldering 1 wire to Pin #7, and the other to Pin #10. Both lengths will be running along the rail heading towards SR. We’ll trim excess later.

Right joycon rail pins
Right Joycon rail internal pin-out

Some strategies for this solder job:

  • Apply a small blob (no more than 1mm (1/32″) in size) to the tip of your iron.
  • Apply this solder to just your wire.
  • Place the wire against the pin, and heat the joint with a clean tip.

This will result in a complete joint from both solder melting and joining.
I noticed this works great with multi-strand wire as it keeps it together long enough to complete the solder. Here’s my make-shift setup on a block of wood.

Soldered pins 7 and 10 setup

Step 4. Re-assemble LED PCB to rear cover rail, and hot glue both wires to the back of it

Replace the SR, SL, and Bluetooth sync buttons (make sure not to mix them up), and screw back in the LED PCB. Hot glue the two strands of wire to the back of this PCB running along the length towards SR.

Make sure to flatten your hot glue blobs, otherwise you’ll have difficulty in reassembly of the Joycon. These blobs help us secure the wires for the next operation – building our switch.

(graphic in last step)

Step 5. Strip 1cm (1/2″) of Pin #7 wire from the black release switch screw – strip and trim the rest off then wrap the stripped end around the black screw

To make this switchable, we’ll leverage the Joycon release button and make it electronically functional. The 1cm (1/2″) of stripped wire extending past the black screw is to be wrapped tightly around it (helps to unscrew it slightly first). The screw and silver piece of metal are conductive, and will serve as the static part of our switch.

(graphic in last step)

Step 6. Measure wire from Pin #10 to the end of the gray Joycon release wire – trim the rest off, strip 2mm (1/16″), and solder a flat blob no thicker than 1mm (1/32″) to the end

Measure the remaining Pin #10 length all the way to the gray Joycon release lever and cut off the excess. Strip 2mm (1/16″) of wire off this end for some solder. We’ll be making a 5mm (3/16″) wide circle, 1mm (1/32″) thick of solder at the end. Solder’s pretty soft, so you can get away with adding the solder, then flattening with a plyers.

Step 7. Secure solder pad to face of Joycon release lever moving inwards using epoxy

Attach this solder pad to the face of the lever actuating inwards (the lever moves in/out of the Joycon) using epoxy. Care should be taken that epoxy does not leak (hence, use a toothpick to apply), and is ONLY contacting the surface of the lever moving inwards, and not the arm of the lever moving behind the small silver metal plate.

When the lever is fully actuated (pressed inwards), the solder pad should contact the edge of the metal plate, completing our switch circuit and creating a short between pins #7 and #10. You’ve just built a de-facto normally-open (NO) switch!

Right joycon release switch converted to NO switch

Step 8. Test our NO switch – touch multi-meter probes to pins #7 and #10 while lifting and releasing the Joycon release switch lever

If your continuity test results in continuity when our lever is pressed inwards, and none when released, then our NO switch is complete and functional.

Step 9. Replace padding protecting rail pins, then reassemble Joycon

At this point we’re done modifying our right Joycon. We can begin reassembly by placing our little gray piece of foam back over the rail pins, trim any exposed wire and flatten connections/hot glue to keep the entire unit compact. Due to the gauge of chosen wire, your reassembly may be a little tough. Squeeze the two halves together like a sandwich, and use a rubber-band if needed to keep the unit together long enough to screw back in the back cover.

Modified right joycon rail with NO switch to pins 7 and 10
Complete RCM Right Joycon Rail modification

How to use

Whenever you have a Nintendo Switch unit that needs to enter RCM, attach the right Joycon to the unit, and power the unit down.

Hold the RIGHT JOYCON release button, Volume UP, and Power at the same time for 1 second, then release.

If nothing happens visually, then your switch is in RCM mode, and you can proceed with injecting whatever fun payloads you have in mind over USB-C 🙂

Next steps and thanks

Big thanks to the following communities and projects for making this possible.

Which phone, laptop and tablet brands break down the most? (CBC Marketplace) – Let’s reflect

My team from Repair Cafe Toronto and FreeGeek Toronto worked together with CBC Marketplace to bring this narrative to life – what does it take to get my mobile computing device repaired?

The short answer – a hell of a lot more than the typical consumer has available to them in terms of finances, skills, and time. Considering the typical repair, a modern laptop that may need a screen replacement can easily expect replacements to be in the $100 CAD range. This isn’t including tool costs needed to deconstruct overtly complex enclosures with torx and tri-wing screws, all the while exercising surgeon-level patience and skill.

Criticizing CBC in the comments? Sure. Criticizing the tech and the repairs? Come on, now I’m a little hurt.

CBC does an okay job at bringing to light that there’s an issue, but doesn’t quite elaborate on it in detail, something I wish they would’ve done. Guessing they did so to adhere to as much of the general public as possible? Eh, who knows.

Either way, my hope was that everyone took away 1 thing at minimum – that repairability of electronics has gone down the drain. Instead, I scroll down and find that some of the most popular comments are those criticizing the evidence, the repair, the expectations:

“10 years for a laptop is pretty good… I’d be satisfied”

“‘They almost feel like make the battery not to last’ That’s how lithium ion battery works”

“How do you expect for an phone or any technology to last forever?”

Well damn, when did we start accepting that garbage endurance/durability were the price of innovation?
I cannot fathom the individuals who would use this mindset in other fields of science. Today, the lifespan of humans has grown tremendously from what it was decades ago thanks to the same mindset shared by my team – we need to be better than we were. No exceptions.

Those who are okay with devices and components having significantly less lifespan than their predecessors, those who are okay with being unable to repair their device as long as it is future-tech, you need to check yourselves. This is toxic mentality that goes against progress, and your normalization is letting the big players know that it’s okay to get away with this nonsense.

Our family owns and regularly uses a blender about as old as I am.
I’m afraid the day this thing kicks the bucket and I can no longer repair it, it’ll be disposable blenders from there on out.

Bill 72 – Right to Repair Electronic Products

Now here’s something I wished more people talked about. For the uninformed, Bill 72 is an amendment to the consumer protection act in Ontario. It requires a company to give a consumer or repair shop what they need to repair the electronic products themselves. The company can charge for this, but within limits.

Some key takeaways from this include:

  1. Upon request, companies NEED to provide most recent versions of documents (for free if digital), replacement parts, software, and other tools needed to diagnose, maintain, and repair.
  2. Replacement part costs must be fair, and should not be used for prime profit gain.

Now this is the good stuff. We’re talking some major quality-of-life improvements for electronics owners!

  • Able to extend the longevity of your own electronics, by yourself.
    This builds brand loyalty and trust – something severely lacking in the modern market.
  • Ability to learn more about your electronics.
    I’m a big sucker for learning new things, and this is a great way to exercise a lot of the theory we learn in school on practical systems. Furthermore, ethical white-hat hacking of these systems today can bring about improvements tomorrow.
  • Less environmental impact from more sustainable systems.
    The more devices we can repair ourselves, the less end up in landfills. Simple math, and anyone that feels the need to fact-check this is an idiot.
  • Better adherence to industry standards.
    Repairability of devices involves modular design. This helps product holders both adhere and contribute to standards.

Now these are just a few benefits. There are so many more if you give it a quick search and/or observe it yourself from various grassroots such as ourselves, Fixit Clinic, IFixit, and more.

There’s not to say there aren’t any cons – the major one being concerns about intellectual rights violations. But really, these pros outweigh those cons you selfish bastards, you should think twice if your product loses its integrity the moment the lid comes off.

Closing

To round out the narrative, why were only 2 of the dozen or so devices we saw that day repaired successfully?
A lot of our repair setups were improvised the day-of, replacements weren’t available, we had 30 minutes per device (take was done in 1 afternoon), not to mention that some of these were plain irreparable (severe water damage, physical trauma, etc).

It’s really unfortunate that CBC didn’t show this stuff, because they should’ve had it all recorded – a majority of our interactions as fixers were very descriptive and informative. That’s just how we work – we’re not some 3rd party repair shop, we’re skilled volunteers contributing back to the community, teaching others how we’re doing things, why it’s that way, all while learning more ourselves.

To summarize, repairability is pretty neat, thanks CBC, and looking forward to doing more of this in the open once COVID-19 settles down.

tracert2csv – Format tracert output into comma-delimited CSVs

Part of the communications architecture for this research project I’m working on depends on TTL (time-to-live) of data as it travels through various networks.

tracert is the perfect tool for such an application; it’s just a shame that there’s no friendly way to generate and output analytics-ready data.

tracert2csv takes tracert output and processes it into a comma-delimited CSV document for easy import into spreadsheet software such as Excel, databases like MSSQL, or analytics tools.

Check out the project on Github; https://github.com/AlvinRamoutar/tracert2csv

How to use

tracert2csv <PATH_TO_TRACERT_EXPORT> <OUTPUT_CSV>

Input

Tracing route to somenextdomain.com [34.102.136.180]
over a maximum of 30 hops:

  1     3 ms    15 ms     2 ms  hitronhub.home [192.168.0.1]
  2   265 ms    49 ms    17 ms  99.227.240.1
  3    26 ms    22 ms    14 ms  24.156.158.245
  4    16 ms    12 ms    13 ms  9019-cgw01.ym.rmgt.net.rogers.com [69.63.248.205]
  5    14 ms    18 ms    17 ms  209.148.235.18
  6    17 ms    13 ms    14 ms  72.14.209.126
  7     *        *        *     Request timed out.
  8    15 ms    12 ms    13 ms  180.136.102.34.bc.googleusercontent.com [34.102.136.180]

Trace complete.

Output

1,3,15,2,hitronhub.home [192.168.0.1]
2,265,49,17,99.227.240.1
3,26,22,14,24.156.158.245
4,16,12,13,9019-cgw01.ym.rmgt.net.rogers.com [69.63.248.205]
5,14,18,17,209.148.235.18
6,17,13,14,72.14.209.126
7,*,*,*,Request timed out.
8,15,12,13,180.136.102.34.bc.googleusercontent.com [34.102.136.180]

That’s it. I’m committing Sudoku.

Being stuck home for the past month due to Covid-19 has not only given me drive to learn new things, but has also driven me to the walls with boredom.

After all, what’s the use of learning something new if you don’t apply it?

And thus, sudoku_api was born.

sudoku_api is a pure dart package which simplifies the generation, interaction, and management of Sudoku Puzzles.

Well, how does it do that?

  • Contains a Built-in solver for generating new puzzles, or solving existing ones
  • Utilizes and exposes event streams for grid interactions (e.g. cell value changed), and puzzle states
  • Exposes a bunch of neat, easy to use models manipulating Cells, Positions, Grids, and even Patterns of a Sudoku puzzle

Whoah that sounds pretty cool – but what’s this ‘sue dough que’ you keep talking about?

Sudoku is a logic-based, combinatorial number-placement puzzle. The objective is to fill a 9×9 grid with digits so that each column, each row, and each of the nine 3×3 subgrids (segments) that compose the grid contain all of the digits from 1 to 9. The puzzle setter provides a partially completed grid, which for a well-posed puzzle has a single solution.

Wikipedia

Let’s see some sample code

import 'package:sudoku_api/Puzzle.dart';

void main() {
  
  PuzzleOptions puzzleOptions = new PuzzleOptions(patternName: "winter");
  
  Puzzle puzzle = new Puzzle(puzzleOptions);
  
    puzzle.generate().then((_) {
      print("=====================================");
      print("Your puzzle, fresh off the press:");
      print("-------------------------------------");
      printGrid(puzzle.board());
      print("=====================================");
      print("Give up? Here's your puzzle solution:");
      print("-------------------------------------");
      printGrid(puzzle.solvedBoard());
      print("=====================================");
    });
}

Inspiration

I’ve mentioned a few years ago that one of the first games I completed, 100%, was Brain Age Sudoku on the DSi. I really loved the simplicity and clean, non-bloated interface.

Flash forward a few years, and I still haven’t found an app that gives me the same feel.

My goal is to develop a highly customizable, clean, and easy to use Sudoku Toolkit in Flutter using this API – and perhaps encourage others to do the same.

A solid chunk of logic was re-used (namely, solving) from a previous project in college; Java Sudoku. The rest was an experiment in developing a dart package for the first time.

Project GraPi – Completed Kiosk Hardware (#06)

Creating a health dashboard by hacking intelligence into an AOpen (the ‘A’ for ancient) monitor; with metrics aggregated by Graphite and beautifully displayed with Grafana.

This marks the completion of hardware needed for the GraPi system – our AOpen monitor now functioning as a smart Kiosk.

Minor mishap; realized at the end that the USB/Ethernet Hub’s mounting orientation results in the Ethernet port to the RIGHT of the monitor rather than the left.
However, I’m planning to hide these cables within the rail, so once the Ethernet cable gets pulled behind the monitor, it shouldn’t be noticeable.

You might be able to notice from the images above, but we do have a working Graphite & Grafana setup running – something I’ve been working on alongside all this, and will be discussing in the future.
The metrics seen are an example, with data from WorldPing targeting a friend’s server in the states – the purpose being to illustrate a loaded Grafana dashboard.

From here on out, it’s all software.

In the next few posts, we’ll cover setup of Graphite and Grafana on Ubuntu Server, followed by setting up a Grafana dashboard kiosk on Raspbian Lite.

Project GraPi – Why so slow, Raspberry Pi? (#05)

Creating a health dashboard by hacking intelligence into an AOpen (the ‘A’ for ancient) monitor; with metrics aggregated by Graphite and beautifully displayed with Grafana.

I’d like to say that the build went on without a hitch, but I ran into two issues. Not project critical issues, but troublesome nonetheless.

Let’s talk about them, and how I’ve managed to successfully resolve some dastardly slow performance, and fail to resolve high static audio issues.

Troubleshooting poor processing performance

Super excited to get the system going, I dd’d Rasbian Buster (desktop) onto a 16 GB card, and completed setup for my Pi Zero.

Immediately after boot, I noticed how sluggish the system was. Some symptoms I’ve experienced include:

  • Desktop environment input lag (mouse movement, key presses)
  • Long time to load applications
  • SSH authentication takes abnormally long (reached 10 seconds at one point)
  • SCPing at a rate of 10 kb/s over Ethernet
  • CPU always at 100% utilization

Half of me thought it had something to do with my configuration.
However, these symptoms were prevalent since the first boot into Raspbian.
Furthermore, a majority of my configuration was network related, nothing that would cripple other system components.

The other half of me thought it had to do with my Pi Zero. I’ve done some reading online and found others also experiencing poor system performance with Raspbian Buster (desktop) on the Pi Zero. Perhaps a full desktop environment image of Raspbian was asking too much?

Well, I didn’t let that stop me, and took to exploring a wide breadth of light-weight OSes for the Pi, including PiCore, Raspup, and DietPi.

I’ve wiped this MicroSD card enough times to give it an identity crisis.

I eventually got tired of testing out different distributions, and defaulted over to Raspbian Buster Lite, where I installed LXDE along with Midori, Epiphany, and Chromium to decide which would serve as my kiosk browser.
The final image after setup served to be the most responsive but browsing a single page was still taking forever (>60 seconds to load alvinr.ca) – and even then, the load wasn’t complete.

The more numbers I put together, the stranger the situation looked.
It was here when I put software aside, and started looking at some hardware specifications

The Pi Zero runs a 1GHz single-core CPU with 512MB RAM.
My CPU utilization on a fresh installation of Raspbian Lite was always near 100%, while RAM usage on my own image never exceeded ~200 MB.

The entire unit remains quite cool while operating, barely deviating from room temperature – it wasn’t like I was giving it a reason to, nor the means to with a 5V/1A supply.

Huh.

Pi Power for Raspberry Pi Zero taken from FAQ

Taking a look at the power requirements for the Pi Zero made me realize I was using a supply below recommended. This was taking into account my ‘desktop’ setup, with a USB/Ethernet hub housing a wireless keyboard/mouse dongle.

Could it be? The Pi was throttling CPU to prevent brownout?

I’m telling you – if there’s anything I’ve learned as a FIRST alumni from 4 years of competitive FIRST Robotics, it’s to know your power draw, and always charge your damn batteries.

As for our system here, we know the power draw.
Some further research for the Raspberry Pi yielded the following documentation – recommending a supply of 2.5A.

I’ve got something close enough – a Samsung S7 5V/2A charger.
I swear, if I plug in this supply and it turns out that was the problem all along…

Well.


After an hour of playing around with it (and several sanity-driven reboots later), I now experience U N P A R A L L E L E D performance.
Really though, performance has improved drastically.

CPU utilization with Chromium running sits at around 60%, and it only takes 20 seconds to complete load alvinr.ca.
Network performance was better as well, managing to perform an SCP transfer at ~8 MBps – close enough to the 10/100 Ethernet adapter capabilities.

All that’s left now is to replace the existing 5V/1A adapter with this one.

Sweet – let’s move on.

Troubleshooting high static on the Raspberry Pi

It’s the end of the final assembly – we’ve got a better power supply, wires and components have been neatly organized, and everything is secured down.

Let’s perform one more test – except instead of loading alvinr.ca, let’s load SoundCloud and listen to a cover by Anson Seabra – Love The Way You Lie by Rihanna.

I couldn’t even make it 10 seconds in – the sound was absolutely jarring, a rough mix of tones and high static.

Audio recording of the playback of the first ~30 seconds of Anson Seabra’s ‘Love The Way You Lie’ cover

Not the song mind you – I’ve definitely broke something along the way.


Let’s get this out of the way – I haven’t resolved this yet, nor have I pinned down an exact cause. I’m moving forward with the project, considering all the time invested into troubleshooting (and since audio was an optional feature).

However, if you manage to run into something similar, here are some things I’ve tried:

  • Re-seat connectors
  • Use a shielded vs. non-shielded AUX cable
  • Ground Raspberry PI
  • Different audio output device
  • Different audio track, different audio player, even different Linux distros

At the least; I’ve narrowed it down to a hardware fault, either with the Pi, or more likely, the Mini HDMI to VGA adapter (since it splits audio to AUX output).

A little light and some hot glue digging eventually led me to finding a possible fault, present in this very adapter.

Small, purple wire disconnected from the main PCB of the Mini HDMI to VGA adapter

While I don’t know what purpose this wire serves, I’ll leave the blame on it for now, until I find the time to either investigate it further, or purchase another adapter.

Extending vDisk in FreeNAS VM

A journey in extending a ZFS volume pool on a FreeNAS virtual machine after changing vdisk size.

Skip to the procedure section to dig right into it

Background

Virtualizing I/O is perhaps one of the best ways to shoot yourself in the foot.
Or IS it?

You’re taking a piece of software of which its very namesake involves large I/O operations, and throwing it behind layers of abstraction.
When an I/O request is made from a VM, the hypervisor must both ascertain the source, and gain access to the destination by translating the abstracted storage location to a physical location – all while remaining secure.

Not to mention;

One does not simply host a hypervisor for a single VM

Your I/O heavy VM is contending for bandwidth across an already busy storage driver, to some storage which may also be shared by other VMs.

Furthermore, if you’re not even running a bare metal hypervisor and are using applications such as VMware Workstation or Oracle Virtualbox, then performance degrades further – since your hypervisor is now contending against the host operating system for I/O.

Why then, would one want to virtualize NAS?

As much of a sin this seems to be, there are some clear and powerful benefits to doing so.

Perhaps most obvious, you’re given the flexibility provided by any virtual system; simplified management, accurate hardware performance metrics, and one-click customization should you wish to change CPU/RAM/disks.

This ability to change the size of a VM’s disk is quite trivial.
Getting FreeNAS to realize the added space is another story altogether.

Furthermore, there are ways to eliminate I/O bottlenecks by using PCI pass through, giving VM access to raw disk.
Do note that certain hypervisor features are unavailable when doing so – taking VMware for example, where you will lose fault tolerance, HA, DRS, snapshots, and a few more.

And then there’s laziness factor; why go through the effort of setting up a whole new, dedicated machine just for NAS when I can just spin up a FreeNAS instance in minutes?

My use case is personal, and while certain pros/cons hold true between lab and production environments, research is key in determining whether NAS virtualization is best for you.

Procedure – Extending FreeNAS Pool Size after vDisk size change

When you increase the size of a virtual disk, it’s up to guest to resize/grow partitions to utilize the free space.
This is what the following procedure will cover; how to properly resize a volume after changing one of its disks’ dimensions – and having FreeNAS update pool size accordingly.
Note that the following procedure applies to FreeNAS 9.2.1 – however, it remains relevant for newer FreeNAS versions.

Step 1. Log into webmin, detach the volume being resized

Log into your FreeNAS web administration portal.
By detaching this volume, we can safely perform partition changes to disk(s) within.
UN-CHECK the destroy data and delete shares options.

Step 2. Shut down FreeNAS

Ensures that there are no lingering locks to this volume and/or its disks before we grow our drive(s).

Step 3. Grow drives

Grow vDisks using whatever means available – vboxmanage, vmkfstools, vmware-vdiskmanager, etc.

Step 4. Power on FreeNAS, and enter shell

Step 5. Enter the following commands in order:

zpool status

Retrieve the name(s) of partitions for each pool. One of these partitions will correlate to the disk(s) expanded.
NOTE down the gptid for YOUR pool – we will use this later.

glabel status

Resolves a partition name to drive name (Components column).
NOTE down the Components name for the partition identified previously – we will use this later.

gpart resize -i 2 /dev/da0

Replace da0 with drive name (Components name) identified previously.
This command will resize the specified disk.
On completion, a ‘resize successful’ message is given.

Step 6. Log into webmin, and auto import the pool

On successful auto import, you will see your volume under Storage > Active Volumes

Step 7. Bring device back online and expand pool size

Return back to your FreeNAS shell, and enter this final command to both bring the device online, and automatically update the pool size.

zpool online -e poolname /dev/gptid/some-long-gptid

Replace poolname with the component name from zpool status.
Replace some-long-gptid with the partition name from glabel status.

The ‘-e’ flag is meant to be used when a smaller disk has been replaced by a larger disk – which to the guest, is what we’ve done.

At this point, you should be able to refresh your webmin and note the changes in used/available/size for your particular volume in Storage > Active Volumes.
This of course, will also be reflected in any shares active.

Happy virtual NASing!


Further reading

Dingding Li, Hai Jin, Xiaofei Liao, Yu Zhang, Bingbing Zhou, Improving disk I/O performance in a virtualized system, Journal of Computer and System Sciences, Volume 79, Issue 2

Yes, You Can Virtualize FreeNAS, May 12, 2015, FreeNAS, FreeNAS Blog

Project GraPi – Loose ends (#04)

Creating a health dashboard by hacking intelligence into an AOpen (the ‘A’ for ancient) monitor; with metrics aggregated by Graphite and beautifully displayed with Grafana.

As promised, let’s dive into some of the modifications made to Audio Control and USB/Ethernet Hub – all part of the master plan.


Audio Control – Moving Audio IN, INside

With our cheap little Mini HDMI to VGA adapter providing audio output from the Pi, all we need to do is feed it into the monitor. Spoon of choice? AUX cable.

Now here’s where it gets a little awkward.
With the unit closed, Audio IN is facing outwards. Meaning we’d have to lead an AUX outside the unit and plug it into the back, making this odd protrusion.

Well, that won’t do.
One of the key tenets of this project was to ensure the unit is compact, with as many components encapsulated within the monitor chassis itself.

Let’s perform a surgery, and extract the Audio IN (AUX) port and see if we can move it around.

And done. Time to test.
Powered on the unit, ensured the AUX cable was connected between our Mini HDMI > VGA adapter and Audio IN on the monitor, and basked in the graininess of Do You Remember remixed by grey.

Yeah, it was pretty bad.
Not because of the mod I assure you (having tested audio on this monitor awhile back), more so because the speakers are terrible.

Anyways, won’t be playing music through this anytime soon – any audio coming through the Pi will be for notifications/alarms.


USB/Ethernet Hub – Mounting

Never thought I’d say it, but for once, this modification was made EASIER by the cheap construction of a part.

The Ethernet/Hub adapter easily came apart (surprise), separating away from its case, allowing me to determine a suitable mounting location.

Deciding to mount it near the bottom for both out-of-sight accessibility came with the added bonus of being closer to the Pi.
To mount the hub, I ran one of the leftover hinge screws through the lower-half of the plastic hub case, right back into the frame.

All that was left was to cut a portion of the rear cover out to accommodate the area now taken by the hub, and we were good to go.

And there we go!
This wraps up a majority of the hardware.
For now.

The next post will cover assembly in more detail, along with any issues we should consider before side-mounting onto my server rack.