James Mitchell

Hi, I'm James Mitchell

CIOS • Maker • Problem Solver

I build things, break things, and figure out how they work. JimDotDev is my public notebook for projects, experiments, lessons learned, and technical discoveries across making, computing, signals, research, and everyday problem solving.

Latest Articles

View all posts →

Seamlessly Migrate Your Data: A Guide to Using Clonezilla for Disk Cloning



In the world of digital data, the need to upgrade or replace your hard drive can be a common occurrence. Whether you're looking to move all your files to a new hard drive of the same size or simply want to create a backup for peace of mind, Clonezilla is a powerful tool that can make the process efficient and stress-free. In this article, we'll walk you through the steps of using Clonezilla to clone your drive and ensure all your data is safely transferred to a new disk.

What is Clonezilla?

Clonezilla is an open-source, free-to-use disk cloning and backup solution. It's designed to create exact copies, or "clones," of your entire hard drive, including the operating system, files, and applications. This makes it an excellent choice when you need to migrate data from one drive to another of the same size.

Step 1: Preparing Your Equipment

Before you begin, ensure you have the following:

1. Both Source and Destination Drives: You'll need the old hard drive (the source) and the new hard drive (the destination) connected to your computer. Make sure the destination drive is of the same size or larger than the source.

2. A USB Flash Drive or CD/DVD: Clonezilla runs as a bootable live system, so you'll need to create a Clonezilla Live USB or burn it to a CD/DVD. You can find detailed instructions for this on the Clonezilla website.

3. External Storage (Optional): If your source drive is almost full, you may need external storage, like an external hard drive, to temporarily store your backup image.

Step 2: Booting into Clonezilla

1. Insert the Clonezilla Live USB or CD/DVD into your computer.

2. Boot your computer from the Clonezilla media (you may need to adjust your computer's boot order in the BIOS/UEFI settings).

3. Select the appropriate Clonezilla mode. For disk-to-disk cloning, choose "device-device work directly."

Step 3: Cloning Your Drive

1. Clonezilla will guide you through a series of options. Follow these steps:

   - Choose the source disk (the old hard drive).
   - Select the destination disk (the new hard drive).
   - Confirm the disk-to-disk cloning operation.
   - Choose your cloning mode. If you're moving to a same-sized drive, "Beginner" mode is usually sufficient.

2. Clonezilla will prompt you to confirm your choices. Double-check that you've selected the correct source and destination drives, as all data on the destination drive will be overwritten.

3. Follow the on-screen instructions to start the cloning process. This may take some time depending on the size of your source drive.

4. Once the cloning is complete, Clonezilla will ask if you want to perform another backup or exit. Choose "exit" to reboot your computer.

Step 4: Testing and Verification

After the reboot, ensure that your new hard drive functions correctly. Boot into your operating system and verify that all your data, applications, and settings are intact. If everything works as expected, congratulations, you've successfully migrated your data!

Conclusion

Clonezilla is a reliable and user-friendly tool for cloning your hard drive to another of the same size. Whether you're upgrading your storage or creating a backup, Clonezilla simplifies the process and ensures that your data is safely transferred. Just remember to follow the steps carefully, double-check your selections, and always have a backup of your important data before making any significant changes to your drives. With Clonezilla, you can make disk cloning a hassle-free experience.

Use Windows Hotspot for Airlink Oculus Meta Quest 2

Airlink is an amazing feature of the Quest 2 and configuring it allows users to "unthether" from the long USB and utilize wifi to link to your PC for PCVR - and it works amazing!

The trouble at this time is specifications are vague as the feature is experimental and advice seems to point users toward dedicated 802.11ax "Wifi 6" routers configured to access points - which seem unnecessarily expensive.

My motherboard (AORUS Elite) has an Intel wireless dual band 802.11ac integrated adapter that went unutilized. While trying to work out the best way to minimize latency over my network, I thought I would try to utilize this adapter. 

The follow are my notes regarding this configuration with the assumption of the Airlink experimental feature already being enabled on your headset.

Configuration notes

Hardware spec:

Oculus branded Quest 2 
AMD R9 3900X
32GB of RAM
1TB NVMe SSD
X570 AORUS Elite Wifi
ROG Strix RTX 3070

Under your adapter settings in device manager, there are a few options we can disable to increase performance. If you are unsure of a features function, you can search it to determine if it's something you need enabled. I have configured mine as follows:

Next we need to configure a mobile hotspot. You can do this by right clicking on your network on the bottom right task bar and selecting "Open Network & Internet Settings"


Under Settings:


1)Select Mobile Hotspot

2)Select Edit - Give your network a name, a password and select the network band to be 5Ghz

3)Make sure the type of network is Wi-Fi

4)Turn on

If at this point you receive an error : "The selected network band isn't available. Select a different band and try again." - turn your wifi on and off and try again.

Once your hotspot is up, open the command prompt as admin then enable and disable wifi scanning:

Connect your headset to the newly created hotspot and check the link speed. With my integrated adapter I get a link speed of 866Mbs If your link speed is low, try disconnecting and reconnecting.

Proxmark3 - VM installation Kali Linux

While the Wiki does an excellent step by step installation of the Proxmark, I thought I would write on my experience as I did overlook a step of configuration that lead to some brief confusion.  It should also be noted that there are multiple recommendations made of avoiding installation on a virtual machine, though I was able to accomplish this with no issues.

Another note would be that the USB interface used is identified in the picture below. The side USB interface is for powering for standalone or field mode operation in combination with a power source such as a battery pack.


Windows 10

If you are running a virtual machine, your host machine needs to have the appropriate driver in order for your device to be accessible to your VM.

We must first download and extract the following 


Once extracted we need to disable driver signature verification. There are two ways to achieve this:

Option #1 enable test signing

Right click CMD Prompt and 'run as administrator'
bcdedit /set testsigning on

Once done installing the unsigned drivers we can disable it once again with 

bcdedit /set testsigning off

If you get a return of "protected by secure boot", you have secure boot enabled in your UEFI and will have disable it, or use option #2

Option #2 Windows 10 Boot Options

Restart while holding 'Shift' to boot into Windows 10 boot options. Click 'Troubleshoot' --> 'Advanced options' --> 'Startup options' --> 'Restart'. Following restart select '7: disable driver signature enforcement' by typing the number 7.

With driver signature enforcement now disabled we want to plug in our device and wait for auto driver installation to fail.

In Device Manager under Ports we will see the device. Right click --> update drivers --> let me choose.. --> 'Have Disk' and browse to the ProxSpace\pm3\driver location of the zip we just downloaded moments ago.

After installation we should see it labeled as "Proxmark" in Device Manager and we can configure in the VM as you would.

Kali Linux

Open Terminal and check for updates prior to installation using apt or apt-get

~$sudo apt update && sudo apt -y upgrade

Above will check for updates and then install them agreeing to any installation required and it's dependencies.

Once our system is up-to-date, we can install build essentials with:

sudo apt install git build-essential
Now we use git to get the repository:

git clone https://github.com/Proxmark/proxmark3.git
Once finished we can move the directory

~$cd proxmark3

Now with our Proxmark3 easy, we need to create a file in the root directory prior to making our bootrom. This is a step I missed as all makes make the default boot ROM for hardware version 4, and ours is v3. Apparently I could run 4, but after doing so my Proxmark3 became unresponsive. I will follow up with at a later date.

To create the file we can use Nano

~$nano Makefile.platform

And in this file we add 

PLATFORM=PM3OTHER

and save

While still in the Proxmark3 directory we can make our file 

~$make clean && make all

Now we can switch to the client directory

~$cd client
~$make

While holding the button down on the side of the Proxmark3 we can flash the bootrom

~$./flasher /dev/ttyACM0 -b ../bootrom/obj/bootrom.elf

If flash was successful we should see a screen that ends in " have a nice day"


After flashing, my Proxmark3 became unresponsive and would no longer communicate. After some digging, I came across the advanced compilation paramters on the github https://github.com/RfidResearchGroup/proxmark3/blob/master/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md

that indicated the default support values for the Make file is for the Proxmark3 rdv4. So with that discovery I created a file in the root directory as indicated and used the value of PM3OTHER and remade the installation by doing a make clean && make install 

MSI 1603 Error

During an installation attempt of an application, a common indicator of remanence left behind of a failed installation attempt can be identified as follows:



This error often occurs when a previous installation attempt has failed or has failed to unregister files.

More information can be found here:

https://docs.microsoft.com/en-us/troubleshoot/windows-server/application-management/msi-installation-error-1603

Resolving this issue usually entails removing registry entries associated with the installer, which can be done painfully searching the registry and manually removing any assosiciations and uninstall entries or using a tool such as MSIZap.

Prerequisites:

  • MSIZap
  • Product code

MSIZap is part of the Windows SDK, and can be a useful part of anyone's tool kit. In order to make use of MSIZap in a targeted fashion, we need to have the product code we are wanting to completely remove from the registry. Once obtaining MSIZap, we can execute it through the command prompt or browse to it via Run application:

Windows key + R 

"D:\pathtotools\MSIZap.exe" TW {product code}

There are a couple different ways of obtaining the ProductCode of an application to remove it - one way is to navigate to the uninstall key in the registry as the GUIDs are the ProductCode.

32bit applications:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

64bit applications likely found:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432node\Microsoft\Windows\CurrentVersion\Uninstall

Another option could be to use PowerShell, with a couple options:

We can use the WMI (Windows management instrumentation) to call for these requests and display the information in two ways:

>wmic product where "Name like '%Your Application name%' get Name"," Version"," IdentifyingNumber

>Get-wmiobject win32_Product -filter "name like '%your application name%' | Sort-Object - Property name | Format-Table IdentifyingNumber, Name, Version -autosize

Once we have the ProductCode we can use MSIZap to remove are lingering msi remeance left in the registry, and proceed on with the install.

Raspberry Pi Unifi controller + Larger SD

I started my Raspberry Pi Unifi controller + PiHole configuration a few years back with a 16Gb Micro SD and recently descovered I was reaching its cap in collected logs, backups and databases. Completing this task can be easy with a tool called Win32 Disk Imager - which can be found here. To complete this task we will have to take our controller offline temporarily.

Once installed, we insert our controller SD card and select the drive letter it is assigned and select our boot partition:

Next we give a path to where we want the image to be created.

Reading and creating an image will take a few minutes depending on the size.

Once complete, we remove our old SD and insert the new larger one. Format the card FAT32 then in Win32 Disk Imager select the drive and click "Write".

When this finalizes, our card will be ready to go back into the Raspberry Pi and dynamically expand the partition using 

$sudo Rasp-config

Select advanced 

Expand partition

Then we can reboot the server with 

$sudo shutdown -r now 

Once this was complete everything moved along smoothly.



mRemoteNG Managing AnyDesk Connections


Maintaining connections to clients, workstations, and servers over various protocols such as RDP, VNC, SSH, AnyDesk or TeamViewer can be challenging to manage with out the right tool. The tool I found best to manage this is mRemoteNG. As I switched from using TeamViewer for clients, I needed to sort out how to add these connections to my mRemoteNG sites.


To get started, we first need to create an External Tool. We do this by clicking Tools - External Tools


Select "New" at the top left of the main dialog


Under Display Name give it a name to use. File name we are calling PowerShell and for our arguments  we are taking insight from the AnyDesk and mRemoteNG support files and using; 

"'%PASSWORD%' | &'C:\Program Files (x86)\AnyDesk\AnyDesk.exe' %USERNAME%'@ad' --with-password"


Once this is done, we can create out connection.



In our new connection we fill out the information like we normally would with the username and password (minus @ad, we added it to our one liner), but for protocol we now select Ext.App for our External Applications and select the External Tool we just added - in my case AnyDesk Connection. 

Provided everything is configured properly, you should be able to double click your connection and connect to the AnyDesk client.

Note: I had issues with long passwords that use special characters such as "!". Also had issues with "Try to integrate" so I left that disabled in the External Tool I created.

What exactly is happening?

We are using the %PASSWORD% and %USERNAME% variable from mRemoteNG username and password field to pipe into AnyDesk where we have used the available command --with-password to let it know that we were including a password. I simply included '@ad' following the %USERNAME% variable to avoid having to include it in every connection. 

You can find out more about functions and possibilities for your connections below:

mRemoteNG External Tool functions 
https://mremoteng.readthedocs.io/en/master/howtos/external_tools.html#start-external-application

iPhone Transfers Made Easy


iPhone Transfers Made Easy


I will put myself out on the line when I say - I am not a huge fan of itunes. As a Windows user, I have always found the process of backing up iPhones or transferring photos to be largely cumbersome due to this bulky software I personally have no other use for.

So on a mission to find a simple tool to perform this task for support, I came across EaseUs MobiMover. EaseUs is very well known for a variety of paid and free software for data recovery and have been around since 2004!

Once installed, getting started is easy. 

Make sure you plug in your device and allow it to trust your computer. This may require entering your screen lock pass-code. Once you have done so, click allow.

Click Phone to PC


The next screen will prompt you with what you would like to transfer from you phone to your computer.


Transferring begins!



The Greatest thing about this software it is completely free for unlimited transfers and you only pay for support.Check out what other features it offers - a definite good grab for your I.T tool belt

PowerShell - Project Final


PowerShell Project
The print spooler is a service application that manages printer jobs sent from a computer to printer or print server, allowing for a buffer - though more commonly known as a queue. The print queue as described, is a queue of stored printing tasks that execute in chronological order, allowing for fair use and management of printer resources. While there are various reasons a host may receive errors pertaining to print spooler communication, I decided to write a PowerShell script to run a series of commonly used administrative tasks that simply restarts the service as quick fix script, to meet slightly exceed the expectations of the project as it is a common adminstrative task.
To perform this task using the Windows GUI, an Administrator could:
Windows Key + R and type services.msc
Once ran will bring up the Services dialog as seen below. At this point we look for “Print Spooler”, right click where we can then stop start or restart the service.

The Script
# The purpose of this script is restart the print spooler after detecting whether or not it is running.
$ServiceName = 'spooler'
$arrService = Get-Service -Name $ServiceName
write-host "
            _       _            
           (_)     | |          
 _ __  _ __ _ _ __ | |_
| '_ \| '__| | '_ \| __|
| |_) | |  | | | | | |_  
| .__/|_|  |_|_| |_|\__|
| |     Spool3r KiLLa 5000 v2-_                    
|_|   _- jimdotdev@gmail.com -_
"
start-sleep -s 2 # time delays
write-host ""
write-host "Checking current spooler status"
start-sleep -s 2
write-host ""
if ($arrService.Status -ne 'Running') # checks the current spooler status and see if it is not equivalent to "Running" if it is, it attempts to start it
{                                     # if it is not, it moves on to elseif
    write-host ""
    write-host "It Looks like the printer spooler is not running"
    write-host ""
    start-sleep -s 2
    write-host "Attempting to start Print Spooler"
    write-host ""
    Start-Service $ServiceName
    Start-Sleep -seconds 5
    $arrService.Refresh()
    if ($arrService.Status -eq 'Running')
    {
        Write-Host " The Print Spooler is now Running"
    }
   
}
elseif ($arrService.Status -eq 'Running') #Checks to see if the printer is equivlant to "running" and if is, stops and restarts it to restart the spooler
    {
    write-host " The Print Spooler is already running"
    start-sleep -s 2
    write-host ""
    write-host "Attempting to stop the Print Spooler..."
    write-host ""
    Stop-Service $ServiceName -force
    start-sleep -s 2
    write-host " Now attempting to restart the Print Spooler..."
    Start-service $ServiceName
    start-sleep -s 2
    $arrService.Refresh() #refreshes the request to recheck status
    if ($arrService.Status -eq 'Running')#Makes sure the print spool is in fact running again
    {
        write-host ""
        Write-Host "The Print Spooler has been restarted and is currently running"
        Start-sleep -s 2
        }
        }
    if ($arrService.Status -eq 'Running') # if the print spooler is running, should we print a test page?
    {
    write-host ""
        $answer = Read-Host "Should we attempt to print a test page? Yes/No" #Read-host waits for response from host then uses if statements based on option
        if ($answer -eq "yes" -or $answer -eq "y")
        {
        write-host ""
        "This is a test page generated by the Print Spool3r KiLLa 5000 v2 written by jimdotdev. Jim is a Network Administrator & Ethical Hacker providing diversity through a wide
        arrange of skillsets. To learn more, you can visit his blog  @                    
  (_|_)             | |     | |    | |                    
   _ _ _ __ ___   __| | ___ | |_ __| | _____   _____ __ _
  | | | '_ ` _ \ / _` |/ _ \| __/ _` |/ _ \ \ / / __/ _` |
  | | | | | | | | (_| | (_) | || (_| |  __/\ V / (_| (_| |    
  | |_|_| |_| |_|\__,_|\___/ \__\__,_|\___| \_(_)___\__,_|
  / |                                                    
|__/    jimdotdev.ca | jimdotdev@gmail.com
" | Out-Printer # this is the text being piped to the out-printer which will be what is seen as a test page
        write-host "A test page has been attempted"
         
    }
    if ($answer -eq "no" -or $answer -eq "n")
    {
    start-sleep -s 2
    write-host ""
    write-host "No test page will be printed and the script will now self terminate"
    exit
    }
    }

General Process Flow Of Script
For my current administrative role, this script is convenient as it requires little interaction with the host. Once the script is ran, the service will restart which normally fixes print spooler issues.
Expanding further:
In version 1 of this script, I was backing up the printer spooler folder to another location on the drive. I removed this function as I believed it to be unnecessary as I don't feel the spooler documentation to be critical data. To expand on it more, I would re-add this feature as an unnecessary precaution.

 ---------------------------------------------------------------------------------------------------------------------------------

.

Space Invaders 40th anniversary!



I've spent a bit more time with my Space Invaders cabinet, and I have to admit—I'm hooked.

I'm still a terrible player, but that's almost beside the point. The more time I spend with the machine, the more I find myself appreciating it as a piece of computing history rather than just an arcade game.

It's easy to look at games like Space Invaders as simple by today's standards, but in 1978 they represented something much bigger. Working within incredibly limited hardware, developers created an experience that captivated an entire generation and helped drive the rapid evolution of arcade hardware and microprocessors. Looking back, machines like this were part of the foundation that eventually led to the computers and technology we use every day.

To commemorate the original game's 40th anniversary, a limited-edition .999 fine silver coin was released this year. I couldn't resist adding one to the collection alongside the cabinet. It's a small piece of memorabilia, but it feels like a fitting tribute to a game that played such an important role in the history of video games—and computing as a whole.

AMD fx8150 glass build

This is a PC that has evolved over time which belongs to friend. While a bit older now, the 8150 holds strong to gaming and was a great chip for budget build.






About Me

James Mitchell

I'm James Mitchell, an IT Operations Specialist, builder, and lifelong learner. JimDotDev is where I document projects, experiments, lessons learned, and technical discoveries across fabrication, computing, RF systems, research, and practical problem solving.