The History, Use and Technical Details of QEMU


In today's interconnected world, the need for virtualization technologies is more pronounced than ever. These tools help developers simulate different computing environments, facilitating easy testing and debugging across platforms. QEMU, an abbreviation for Quick Emulator, is one such powerful technology. It's a free and open-source hypervisor that performs hardware virtualization. Since its inception, it has become a cornerstone in the world of emulation, offering support for various hardware platforms and operating systems. This article will delve into the history of QEMU, its uses, and technical aspects.

To be honest, I had shyed away from experimenting with QEMU; I had used VMWare and VirtualBox for some time. I first utlitized VMWare in 2007 when a, at the time, friend and I started a software development and consultancy. Amazon Web Services had been launched just one year prior and it was not an established name is computing. Cloud Computing was not called that; I recall a reading about Sun Microsystems developing "Utility Computing"; pay as you go. The idea seemed crazy to me at the time. When you needed compute power, you bought physical hardware, in our case, a Dell PowerEdge 1950. We did an initial installation of Debian Linux and installed VMWare and then shipped the server to a colocation facility in Miami, FL. There, we would create, manage, and ultimately destroy countless virtual machines over the lifetime of the server as well as the halcyon days of the consultancy.

In an odd chain-reaction of thoughts, I wanted to experiment with getting MacOS 9 running on modern hardware. As it turns out, QEMU comes in quite handy.

History of QEMU

QEMU was initially released in 2003, a creation of French programmer Fabrice Bellard, who is also known for creating other groundbreaking tools like FFmpeg and LZEXE. Bellard's idea was to develop a fast, portable dynamic translator that could make software developed for one machine run on another.

While the initial version of QEMU only supported emulation for x86, ARM, and SPARC architectures, it gradually expanded to cater to various others like PowerPC, MIPS, and more. Throughout its history, QEMU has continually evolved and improved, integrating with other projects like KVM (Kernel-based Virtual Machine) and libvirt, and extending its support to system and user-mode emulation.

Use of QEMU

QEMU has a wide array of applications, ranging from cross-platform development, virtualization, sandboxing, to hardware design and testing.

Cross-Platform Development and Testing: As QEMU can emulate different architectures, it has become an invaluable tool for developers, allowing them to compile and test their code across various platforms without needing physical access to them. This functionality significantly accelerates the software development process, enabling more efficient multi-platform software creation.

Virtualization: In conjunction with KVM, QEMU can run multiple operating systems concurrently on a single hardware host. This feature has driven the rapid growth of cloud computing, where multiple virtual machines are hosted on powerful servers, offering flexibility and scalability to businesses.

Sandboxing: QEMU's ability to emulate an entire system makes it ideal for creating secure sandboxes. This is particularly useful for testing potentially harmful code or software without risking the host system's integrity.

Hardware Design and Testing: In hardware design and testing, QEMU is used to emulate the behavior of different hardware components. It enables hardware designers to simulate and validate their designs before manufacturing the physical components.

Technical Details of QEMU

QEMU can function in two primary modes: system emulation mode and user-mode emulation.

System Emulation Mode: In this mode, QEMU can emulate a full computer system, including a processor and various peripherals. It can boot and run different operating systems and applications compiled for a different CPU, providing complete system isolation. The system mode is beneficial for debugging system code and running unmodified guest operating systems.

User-mode Emulation: In user mode, QEMU can launch individual Linux processes compiled for one CPU on another CPU. This approach is highly beneficial for running binary files from different architectures and is often used to build and test software in a cross-compilation environment.

The technical prowess of QEMU lies in its dynamic binary translation. It translates the binary code of a guest system into the binary code of a host one instruction at a time, creating a cache of translated code to optimize performance. QEMU supports numerous architectures, including x86, ARM, MIPS, SPARC, and PowerPC, among others, either as the host or the guest architecture.

When paired with KVM, QEMU's capabilities expand even further. KVM, a feature of the Linux kernel, facilitates hardware-assisted virtualization. When QEMU is combined with KVM, it uses the CPU's virtualization extensions, offering near-native performance for the emulated guest system.

To manage QEMU and KVM virtual machines, libvirt, a toolkit, is often used. It provides a common, consistent API, simplifying the management of different virtualization technologies.


  1. Installation: sudo apt-get install qemu-system-ppc

    • You may or may not need to install other packages. Google will be your friend.
  2. Download Required Files:

    • Head over to here to grab an ISO of macOS 9.2.2
  3. Prepare a QEMU Disk Image:

    • Create a blank disk image that will serve as the virtual hard drive for macOS 9.2. You can do this using the qemu-img command: qemu-img create -f qcow2 macos9.qcow2 10G
  4. Install macOS 9.2 on QEMU:

    • Launch the QEMU virtual machine with the following command: qemu-system-ppc -M mac99 -m 512 -boot d -cdrom path/to/macos9.iso -hda macos9.qcow2 -netdev user,id=net0 -device sungem,netdev=net0 Note: Replace path/to/macos9.iso with the path to your macOS 9.2 installation ISO or CD image.
  5. Restore:

    • You cannot simply install macOS, you will need to restore. Locate Apple Software Restore on the CD drive. Run the program and follow the instructions.

  6. Launching macOS 9.2:

  7. Once the restore is complete, you can start macOS 9.2 using a similar command as before: qemu-system-ppc -M mac99 -m 512 -hda macos9.qcow2 -netdev user,id=net0 -device sungem,netdev=net0 -g 1024x768x32

Keep in mind that macOS 9.2 may not work perfectly on QEMU due to limited hardware emulation and driver support. If you encounter any issues, there might not be straightforward solutions. Use Google

Final Thoughts

Here are instructions on running MacOS 9 on a couple different flavors of Mac architecture. I personally got MacOS 9 running under Linux and specifically Armbian running on a Pine64 ROCKPro64; this meant that audio and a couple other things did not work.

BIGTREETECH Manta E3EZ: Ender 3 Pro Meets Klipper Part Two

BIGTREETECH Manta E3EZ enclosure (version 6)

It has been a couple months since I last wrote about the Ender 3 Pro inspired 3D printer that will be running Klipper (as opposed to running Marlin Firmware). The project itself is still progressing, albeit slowly. All of the frame parts have had the anodizing stripped off with lye and subsequently painted with an off-white enamel.

The base of the printer is assembled and linear rails have been installed on the Y-axis. Over the last month or so, much of my time for this project has been dedicated to testing materials and correct fitment for the 3D printed components, like the enclosure for the BIGTREETECH Manta E3EZ controller board as well as a set of drawers. I wasted a lot of expensive carbon fiber filament by not prototyping parts first in cheap PLA, but I subsequently learned my lesson on that front. I have tons of random colors of PLA, why not use a spool of that.

I settled on polycarbonate carbon fiber from Prusa. Why? I like the satin finish, there are barely any extrusion marks and it is incredibly strong. The model I used for the enclosure is based on Ender 3 (V2) front case for BTT Manta E3 EZ, for stock board/SKR Mini E3, and for Orange Pi Zero 2. You can find all of model iterations that I did here. As of this writing, I have not included the case cover because I have yet to create it.

Other notable milestones on the project include a shift from Creality Sprite Pro to a BIQU H2O Liquid Cooled Hotend. Why? Because it can handle filaments that require high temperatures, like PEI (PolyEther Imide) which requires extrusion temperatures over 365° C, or PEEK (PolyEtherEtherKetone), which requires extrusion of up to 410° C. There would be other requirements, like a heated enclosure for those types of filament, but that is for another upgrade down the road.

BIGTREETECH Manta E3EZ: Ender 3 Pro Meets Klipper Part One

For this build, as the title suggests, we will be using a Creality Ender 3 Pro as our base. I have written before about the Ender 3 Pro printers (here and here) that I have, but here is a bit of information about why I like this particular printer. The Ender 3 Pro features a sturdy frame that is made of aluminum extrusions. The frame is easy to assemble and disassemble, which we will be doing the latter, but that will be for another post.

The BIGTREETECH E3EZ Manta Mainboard is a 32-bit control board designed for use in 3D printers. It features an ARM Cortex-M4 CPU with a clock speed of 120 MHz, offering higher processing power and more precise control than 8-bit or even slower clock speed 32-bit boards. My other Ender 3 Pro inspired printers are running the 32-bit Creality 3D Printer Ender 3 Silent Motherboard V4.2.7. It is a solid motherboard, and I have had no real issues with it. The Silent Motherboard V4.2.7 that I have been running, as I have mentioned in a couple recent posts (here and here), are using a custom-configured Marlin v2.0.x firmware. Out of the box, the Manta E3EZ runs Smoothieware firmware, but, we won't be using that, nor will we be using Marlin, we will, instead, be using Klipper.

One of the key features of the E3EZ Manta board is its use of EZ2209 stepper motor drivers. These drivers offer advanced features such as stealthChop2 for silent operation, spreadCycle for dynamic current control, and stallGuard4 for stall detection. This allows for smoother and more precise movement of the printer's axes, resulting, in theory, in higher quality prints. The Silent Motherboard V4.2.7 uses TMC2225 stepper motor drivers; these are much quieter than the HR4988 used on the 8-bit motherboard that originally shipped with a stock Ender 3 Pro.

In a previous post on BIGTREETECH's CB1 compute module, I mentioned BIGTREETECH's Manta E3EZ board as being a great combination for 3D printing. Even though I have a CB1 from the previous review, felt strongly that it would be a good choice, we will, instead, be using a SOQuartz compute module. Here is a quick run down on the SOQuartz. The SOQuartz module from Pine64 is a powerful single-board computer designed for embedded systems and IoT applications. It is based on the Rockchip RK3566 SoC, which features a quad-core Arm Cortex-A55 processor running at up to 1.8GHz, along with a Mali-G52 2EE graphics processor. The module being used for this project comes with 4GB of LPDDR4 RAM and and will be paired with 16GB of external eMMC storage. It also features a wide range of connectivity options, including Gigabit Ethernet, Wi-Fi 5, Bluetooth 5.0, and support for up to two displays with resolutions of up to 4K@60Hz via HDMI and DisplayPort. Other features of the SOQuartz module include support for up to four USB 3.0 ports, a 40-pin GPIO header, and a dedicated AI accelerator for machine learning applications. With its high-performance specifications and versatile connectivity options, the SOQuartz module is a promising option for a wide range of embedded and IoT applications, like using it with a BIGTREETECH Manta E3EZ. The E3EZ will support just about any Raspberry Pi CM4 form factor. Why the SOQuartz? I have a strange adoration for things-Pine64. I like their boards and compute modules, I also love their Pinecil soldering iron (which happens to be powered by a RISCV processor). I have two ROCKPro64 single board computers running as network file storage on my home network; one even has four 10TB drives running in a (software)RAID5 configuration.

Let's get down to brass tacks and look more holistically at this project. We have already discussed the use of an Ender 3 Pro as our starting point, and using a BTT Manta E3EZ for control + Klipper; what else is going to be used? The following a list of parts, printers, primer and paint for this project.

Part Name Price
X-axis linear rail $110.76
Y-axis linear rails $49.27
Onyehn TL-Smoother Addon Module for Pattern Elimination Motor Filter Clipping Filter 3D Printer Motor Drivers Controller $11.99
BIGTREETECH Direct Nema17 Damper Stepper Motor Steel and Rubber Vibration Dampers with M3 Screw $17.99
AFUNTA 5 Pcs Flexible Couplings 5mm to 8mm Compatible with NEMA 17 Stepper Motors $10.99
Park Sung 3D Printer Heat Bed Leveling Parts,Silicone
Column Solid Mounts,Leveling Spring Replacement
[Gulfcoast Robotics] 235x235mm Aluminum Build Plate
and 24V 250W Silicone Heater 3-Point Heated Bed Upgrade for Creality Ender 3
PEI Sheet 235mmx235mm and Magnetic Sticker with Adhesive for Creality
Ender 3/Ender 3 Pro/Ender 3 V2/Ender 3 S1/Ender 3 S1 pro/Ender 3
neo/Ender 3 v2 neo/Ender 5/Ender 5 Pro/Voxelab Aquila 3D Printer
Zeberoxyz Upgrade 2020 Profile X-axis+4040 Double
Slot Profile Y-axis Synchronous Belt Stretch Straighten Tensioner for Creality Ender-3 Pro/Ender3 V2/CR-20 Pro
3D Printer Parts (X2020+Y4040)
BIGTREETECH EZ2209 V1.0 Stepper Motor Driver 5PCS
Stepstick Mute EZ2209 Compatible with SKR 3 EZ Manta E3 EZ 3D Printer Controller Main Board
BIGTREETECH Manta E3EZ V1.0 Mainboard 32 Bit
Silent Control Board Work with CB1/CM4 Support Klipper Drop-in Motherboard for Ender 3 Compatible with EZ2209
EZ5160 Stepper Motor Driver
Creality Sprite Extruder Pro, Direct Drive
Extruder Hotend Kit, 300℃ High Temperature Extruder Kit for Ender 3/ Ender 3 V2/ Ender 3 Pro/Ender 3 S1/ Ender 3
Max/CR-10 Smart Pro 3D Printers
Creality CR Touch Auto Bed Leveling Sensor Kit, Creality 3D Printer Bed Leveling Tool with Metal
Push Pin for Ender 3/Ender 3 V2/Ender 3 Pro/3 Max/Ender 5
pro/CR-10 with 32 Bit V4.2.2/V4.2.7 Mainboard
Official Creality New Update Ender 3 Dual Z-axis
Upgrade Kit with Metal Power Supply Holder, Stepper Motor and Lead Screw
for Ender 3 V2, Ender 3 Pro, Ender 3 3D Printer
Ruby Nozzles for 3D Printers MK8 E3D Prusa Ender3 (E3DV6, 0.4mm) $24.90
Used Creality Ender 3V2/Ender 3 Pro/Ender 3/Ender 3 Neo 3D Printer $171.20
Unrepaired Creality Ender 3 E 3D Printers Ender 3 Pro Upgrade $97.09
64GB eMMC Module $42.62
Threaded-Stud Rubber Bumper with Steel Base Plate - M8 x 1.25mm Size, 30mm OD,
15mm High, 220 lbs. Maximum Load - 3810N137 x4
Uncoated High-Speed Steel General Purpose Tap - Plug Chamfer, M8 x 1.25 mm Thread, 1-1/8" Thread Length - 8305A39 $9.20
Black-Oxide High-Speed Steel Drill Bit - 6.8mm Size, 109mm Overall Length - 2958A114 $4.92
Extra-Fine Marking Punch -
with 1/8" Point Diameter - 3451A32
Duttek Micro HDMI to HDMI Coiled Cable, HDMI to
Micro HDMI Coiled Cable, Extreme Slim/Thin Micro HDMI Male to HDMI Male Coiled Cable for 1080P, 4K, 3D,
and Audio Return Channel (1.2M/4FT)
Wells Lamont unisex adult 14inch PVC Coated Gloves, Green, 2 Count Pack of 1 US $8.20
Rust-Oleum 7793830 Stops Rust Spray Paint, 12 oz,
Satin Shell White
Custom Coat Self Etching Acid Etch Primer - 12.9 Ounce Spray Can - Gray $24.99
2 ALAZCO Soft-Grip Handle Heavy-Duty Tile Grout Brush
- Accid Proof Extra-Stiff Bristles - Narrow Brush for Hard to Reach Areas Multi-Purpose
Rubbermaid Commercial Products Standard Bus/Utility Box, 4.625-Gallon, Gray $14.99

Some of this was unnecessary. I did not need to buy two Ender 3 Pros, but the first one I bought was missing frame components and the second one's listing on eBay had photos of the actual contents. The second one will also give me an ample supply of spare parts for the other Ender 3 Pros I have in service. Other items that would be optional are the gloves, primer and paint. The intent is to use a caustic solution (like lye or Draino) to etch away at the anodizing on the aluminum. A coat of etching primer and then an off white paint job. So, what is the total of the above list? I'll just say that the total has crossed over into four-digit territory.

That's it for now. Look for parts two and three of this project build.

3D Printing Polycarbonate + Carbon Fiber

Polycarbonate plastics were first discovered by Dr. Hermann Schnell and Dr. Daniel Fox in 1953 at the General Electric Company. They were trying to develop a new type of material that could be used for electric insulators, but instead, stumbled upon a transparent and highly durable plastic. This new material was named "Lexan" by GE, and it quickly gained popularity due to its superior performance compared to other plastics at the time.

Polycarbonate is a type of thermoplastic polymer that is commonly used in a variety of applications due to its durability, transparency, and heat resistance. The chemical composition of polycarbonate is characterized by a repeating unit known as a carbonate group, which consists of three atoms: one carbon atom (C), one oxygen atom (O), and one additional oxygen atom that is double-bonded to the carbon atom (O=C-O). The chemical formula for polycarbonate can be represented as follows:


where "n" represents the number of repeating units in the polymer chain, and C6H4 refers to a phenylene group, which is a benzene ring (C6H5) with one hydrogen atom replaced by a carbon atom. The phenylene groups alternate with the carbonate groups in the polymer chain, resulting in a linear and highly branched structure. This molecular arrangement contributes to the unique properties of polycarbonate, such as its high impact strength, optical clarity, and resistance to UV radiation.

Polycarbonate has a relatively high glass transition temperature. The glass transition temperature is the temperature at which a polymer transitions from a glassy, rigid state to a rubbery, more flexible state, called Tg. Below the Tg, polycarbonate is in a glassy state and has a high modulus, meaning it is stiff and brittle. Above the Tg, polycarbonate transitions to a rubbery state and its modulus decreases, making it more flexible and capable of flowing or deforming under stress.

The Tg of polycarbonate typically ranges from about 145°C to 155°C. When polycarbonate is heated above its Tg, it becomes softer and more pliable, allowing it to flow and take on the shape of the mold or container it is placed in. This property makes polycarbonate suitable for a wide range of applications, including injection molding, thermoforming, and extrusion, where it can be melted, shaped, and cooled.

The Tg of polycarbonate also impacts its thermal stability. Polycarbonate has good thermal stability below its Tg, meaning it can withstand relatively high temperatures without significant degradation. However, above its Tg, polycarbonate can undergo molecular mobility and may be prone to degradation or reduced mechanical properties if exposed to prolonged elevated temperatures.

In the years that followed the discovery, polycarbonate plastics found widespread use in various industries. One of the early milestones was the development of bulletproof glass in the 1960s, which utilized the high impact resistance of polycarbonate to provide enhanced protection. Polycarbonate was also used to make eyeglass lenses, providing a lightweight and shatter-resistant alternative to glass lenses. Over the years, advancements in processing techniques and material formulations have led to further improvements in polycarbonate properties and expanded its applications in automotive parts, medical devices, and consumer goods, among others. The Lockheed Martin F-22 Raptor's canopy is constructed of specialty polycarbonate.

Enter, fused filament fabrication (FDM), or what most call, 3D printing. Using pure polycarbonate (whatever that actually means) as a 3D printing material can be extremely frustrating when using a desktop or kit 3D printer. You will need to be able to achieve temperatures that most retail printers are not capable of out of the box. You will need an all metal hotend that can handle temperatures at or above 300°C. Likewise, your build surface will need to be able to achieve temperatures exceeding 100°C.

If you are one of the few repeat readers of this site, you will know that I am a fan of Creality's Ender 3 Pro model of 3D printers. The Ender 3 Pro has been on the market for years, has a loyal following, and has a near endless array of aftermarket upgrades. Check out Scott Yu-Jan and his awesome Ender 3 Pro modifications. In previous posts (here, here and here), we were printing variants of nylon with fiber reinforced filaments, Like polycarbonate, nylon requires higher temperatures than normal PLA filaments. You can use the same aftermarket upgrades for our hotend, a Creality Sprite Pro. This has been a solid upgrade to my Ender 3 Pro printers; I would highly recommend it, even if you are only printing PLA. I have tried other direct drive Ender 3 Pro upgrades, and the Sprite Pro has shortest piece of internal bowden tube. The ease of loading filament is also a huge plus. There is a lower priced Creality Sprite that is not rated for high temperatures; you might be able to get by with this for printing nylon-based filaments, it would definitely work extremely well for printing with PLA filaments.

The other significant upgrade is the build surface. I upgraded to a Gulf Robotics' silicone encased all aluminum, three point build plate. This is an upgrade that might not be necessary, as the stock build plate as reach temperatures of 100°C, but, anecdotally, the heating is not as even as the Gulf Robotics' build plate. It heats up quicker, has more evenly distributed heat, and should be able to tolerate higher temperatures for longer periods of time compared to the stock build plate. As an addition to the upgraded build plate, I also decided to insulate the underside. I used Befenybay lightweight insulation. Silicone springs were also used. As an aside, I am planning on building and upgrading an Ender 3 Pro and tracking the build time as well as costs associated with making a high temperature, advanced materials printer. This will include setting Klipper firmware. Why Klipper instead of Marlin? You will have to come back to read why.

I will call this out in its own paragraph: you will need to update your Marlin firmware. This article will only get you so far. You will need to modify a few other settings.

Hotend maximum temperature
#define HEATER_0_MAXTEMP 340
Build surface maximum temperature
#define BED_MAXTEMP 170
Hotend temperature deviation amount
Disable runout prevention

Download High Temperature Marlin Firmware (April 16, 2023)

Source Code for Firmware


The first two temperature changes just might be too extreme, but I picked subjectively high values because I was running into temperature overshoot faults. Initially setting the hotend temperature to 320°C with an overshoot value of 20°C, when your gcode temperature was set to 300°C and with the variability of heating element, this routinely resulted in those temperature faults. By, increasing the hotend temperature and narrowing the overshoot value, this seemed to allow for higher temperatures without risking a temperature fault.

The last option, disabling runout prevention was necessary because I ended up destroying a Sprite Pro. How? Somehow, the printing stopped, and the hotend carriage got parked in one place. Every 10 seconds or so, a small amount of filament was extruded. Let this run over night, and you end up with a blob of reinforced polycarbonate that encases the nozzle, silicone sock, part of the cooling fan nozzle, as well as part of the heat sink.

In attempting to dislodge the blob of hardened polycarbonate, the two screws that hold the heat block (where the nozzle screws in) to the heat sink snapped. The whole Sprite Pro unit might be salvageable, and I do have a Sprite that can be used for parts, but I will need to expose enough of the screws to use a needle nosed plier to turn them.



Let's get down to the brass tacks on using polycarbonate filament. 3DXTech has an easy to print carbon fiber reinforced polycarbonate (or here). All of the reinforced filaments are relatively expensive compared to non-reinforced PLA or ABS filaments. You can start with easy to print polycarbonate filaments to save a little bit of money before taking the jump into reinforced filaments. Using non-reinforced filaments would also allow for the use of a 0.4mm nozzle, which should result in finer details coming through better than with a 0.6mm nozzle.

You will need an enclosure, but it is not necessary to have a heated enclosure. I have found the Gulf Robotics' upgraded build plate heater does a great job of increasing the enclosure's ambient temperature without needing another heating source.

Another tip for successful printing is to use a raft instead of a brim or skirt. Using a raft results in as much build surface contact as possible. Polycarbonate does not stick very well to most surfaces - it will gladly stick to itself. I used an adhesive - a Nano Polymer Adhesive (or here). It is not cheap. But, putting a few layers of adhesive onto the glass build surface, along with a temperature of 115°C and a raft, I have had little issues with prints becoming dislodged. PEI build plate surfaces are also said to have great adhesion properties for polycarbonate filaments.

Good luck and leave a comment if you print, successfully or unsuccessfully, with reinforced polycarbonate filaments.

3D Printing Nylon + Glass Fiber

Pure nylon may not always provide the required strength for certain applications. This is where glass reinforced nylon, carbon fiber reinforced nylon, and kevlar reinforced nylon comes in; it offers improved strength and durability while retaining the advantages of nylon. As we have already covered carbon fiber and Kevlar reinforced nylon, we will explore the discovery of glass reinforced nylon, its technical properties, and its uses in 3D printing.

The discovery of glass fiber reinforced nylon is attributed to several researchers and engineers who were working on improving the mechanical properties of nylon in the 1960s. One of the most notable contributors was Dr. Herman Mark, a polymer scientist who worked at the Polytechnic Institute of New York University. In the early 1960s, Herman and his team discovered that the addition of glass fibers to nylon significantly improved its strength and stiffness. This led to the development of glass fiber reinforced nylon, which was initially used in the automotive industry for components such as engine covers and air intake manifolds. Since then, glass fiber reinforced nylon has found its way into many different applications, including the 3D printing realm.

Glass reinforced nylon is a composite material made of nylon and glass fibers (pretty obvious, isn't it?). The glass fibers are usually added in the form of short fibers or long continuous strands, which are mixed with the nylon during the manufacturing process. The addition of glass fibers to nylon improves its mechanical properties, making it stronger, stiffer, and more resistant to wear and tear. The amount of glass fibers added to nylon can vary, with higher percentages resulting in higher strength and stiffness but lower ductility. Also, because glass is generally colorless, nylon + glass fiber is available in various colors compared to nylon + carbon fiber's only color of black.

The mechanical properties of glass reinforced nylon make it an ideal material for 3D printing applications. Glass reinforced nylon has excellent strength and stiffness. It also has good chemical resistance, making it resistant to solvents and chemicals, and can withstand high temperatures, making it suitable for applications such as automotive components and electronic enclosures.

One of the biggest challenges of 3D printing with nylon and glass fiber filament is getting the print settings just right. The material requires specific settings to achieve a successful print, and these settings can vary depending on the specific brand and type of filament being used. If the settings are not correct, the print may not adhere properly to the bed, causing warping or detachment during printing. Additionally, nylon with glass fiber filament is more prone to stringing and oozing during printing, which can leave unsightly and difficult-to-remove strands of filament on the printed object.

Another challenge is maintaining a consistent temperature throughout the printing process. Nylon and glass fiber filament require high temperatures to melt and print correctly, but if the temperature is too high or too low, the filament can become brittle and break during printing. Maintaining the right temperature can be difficult, especially for larger or more complex prints, as the filament may cool down or heat up unevenly in different parts of the object.

Post-processing can also be a challenge with nylon and glass fiber filament prints. Because of the material's strength and durability, it can be difficult to sand or smooth the surface of the printed object without damaging it. Additionally, the material is more difficult to paint or coat, which can limit the options for finishing the final product. Also, being chemically resistant to solvents and other chemicals also means it is difficult to vapor smooth objects made with the composites (or even just pure nylon alone).

With all of the background information on nylon with glass fiber out of the way, let's discuss the details of getting functional and great looking printed components.

I found that the Cura settings used for nylon + carbon fiber work very well. The only tweak I made was increasing the temperature of the print bed by 5° and this resulted in better adhesion. The other adjustment to the process that I was making sure the print bed was cleaned each time I printed - soap and hot water - as well as putting on a fresh thin layer of glue stick on the bed. Glue stick seemed to work better than the more expensive Magigoo for nylon. Since I already covered the Cura settings in the carbon fiber post, I won't duplicate them here.

3D Printing Nylon + Carbon Fiber


What even is carbon fiber? Carbon fiber is a lightweight and extremely strong material that is widely used in a variety of industries due to its exceptional properties. It was invented in the mid-20th century by a British scientist named Roger Bacon, who discovered that carbon fibers could be produced by heating rayon fibers at high temperatures in the absence of oxygen. The resulting carbon fibers were found to be much stronger and more durable than other materials at the time.

Carbon fiber is made by weaving together thin strands of carbon atoms, which are then impregnated with a resin or polymer to create a composite material. The process of creating carbon fiber typically involves several steps, including spinning, stabilization, carbonization, and finishing. In the spinning stage, precursor fibers are created by heating a polymer or other material until it becomes a liquid, which is then extruded through small holes to create long, thin filaments. These filaments are then woven together and placed in an oven to be stabilized, which involves heating the fibers to a high temperature to remove any residual moisture and strengthen them. The stabilized fibers are then carbonized, which involves heating them to an even higher temperature in the absence of oxygen to convert them into pure carbon. Finally, the carbon fibers are coated with a resin or other material to give them additional strength and durability.

The last sentence of the paragraph, "Finally, the carbon fibers are coated with a resin or other material to give them additional strength and durability.", is where we will pick up on the story. To make nylon filament with embedded carbon fiber, and make it useful in a fused filament fabrication (e.g. 3D printing) application, the carbon fibers cannot be stringy strands, they have to be chopped. These chopped fibers are then mixed with nylon - either Nylon 6 or Nylon 12 (each have their merits and properties) - to produce a usable and useful filament.

What's Needed

Now with the introduction out of the way, let's get into what you will need to successfully print with nylon + carbon fiber filament.

I am using what started out as a Creality Ender 3 Pro but, since purchasing it, I have thrown a whole lot of upgrades at it. If you are not wanting to drop the amount of money into your Ender, there is three upgrades needed for printing Nylon + carbon fiber (this also applies to all fiber embedded nylon filaments).

First, you will need to have an all metal hotend. Micro-Swiss makes a drop-in all metal hotend that, as of this writing, is about $65. If you have a little more money to spend, I would recommend Creality Sprite Extruder Pro Upgrade. For $45 more, you can get a direct drive all metal hotend that can survive high temperatures. I like the Creality Sprite extruder because the shortness between the drive gears and the top of the hotend.

Second, you will need update the Marlin Firmware on your Ender. Previously, I wrote a post on what modifications I have made to the firmware that is running on my Ender 3 Pros.

Third, you will need a tougher nozzle. I use a 6mm ruby tipped nozzle. I use a 6mm nozzle because I am concerned with fibers getting jammed up in the nozzle if the extrusion hole is too narrow. I have read other articles on people who have successfully printed with a 4mm nozzle; if you are feeling subjectively adventurous, try out a 4mm nozzle and report back with a comment on this article.

For around $90, you can get the necessary upgrades to successfully print with fibrous nylon on your Ender. My personal preference is for a few other upgrades that make printing in general easier. I would highly recommend getting a BL Touch or CR Touch for auto-leveling; and a second Z-axis drive - it just makes printing a lot more stable.

On the slicer front, I use UltiMaker's Cura. There are a number of settings I changed:

PK       ! T��c9  9  .   creality_ender3pro_nylon_+_fiber_-_100%_infill[general]
version = 4
name = Nylon + Fiber - 100% Infill
definition = creality_base

type = quality_changes
quality_type = super
setting_version = 21

adhesion_type = brim
layer_height = 0.25
layer_height_0 = 0.25
material_bed_temperature = 80
support_enable = True
support_type = buildplate

PK       ! �z^*�  �  7   creality_base_extruder_0_#2_nylon_+_fiber_-_100%_infill[general]
version = 4
name = Nylon + Fiber - 100% Infill
definition = creality_base

type = quality_changes
quality_type = super
intent_category = default
position = 0
setting_version = 21

alternate_extra_perimeter = True
cool_fan_speed = 50
infill_line_distance = 1.5
infill_pattern = trihexagon
infill_randomize_start_location = True
infill_sparse_density = 100
ironing_enabled = True
ironing_monotonic = True
line_width = 0.55
material_alternate_walls = True
material_print_temperature = 270.0
retract_at_layer_change = True
skin_monotonic = True
speed_print = 55.0
support_angle = 35
support_brim_line_count = 32
support_brim_width = 8
support_pattern = triangles
top_bottom_pattern = zigzag
wall_thickness = 1.75
zig_zaggify_infill = True

PK       ! T��c9  9  .           �    creality_ender3pro_nylon_+_fiber_-_100%_infillPK       ! �z^*�  �  7           ��  creality_base_extruder_0_#2_nylon_+_fiber_-_100%_infillPK      �   �    

You can also download the configuration export file.

Things to note...

  1. Layer height should be no less than 0.22mm
  2. Reduce the fan speed to help with prevention of warping
  3. To provide (in theory) better layer adhesion, reduce the line width slightly
  4. And of course, make sure to up your hotend temperature and bed temperature. I have the hotend at 270° and the bed temperature at 80°.

Final Thoughts

I am using nylon + carbon fiber filament from Amazon. I would also recommend 3DXTech's nylon + carbon fiber filament.

As for what will print well and what will not: sharp details are not going to be created, printing small models (something smaller than a 3DBenchy) is not going to turn out well, using Octolapse will result into somewhat stringier results, use a very clean bed with a fill layer of glue stick applied, and, of course, have a very level bed.

Post a comment if you have tried printing nylon + carbon fiber on an Ender printer.

3D Printing Nylon + Kevlar

I am not new to 3D printing, but I am by far, not an expert. I have only been creating objects for the last couple of years. Up to this point, I have only been using filament made from polylactic acid, or more commonly know by its initials: PLA. It is probably the most common filament used by hobby-printers. It comes in a million different colors (ok, I haven't actually counted the colors), dozens of finishes - matte, gloss, metallic, satin sheen and many more. It is relatively easy to print, does not require an all metal hotend, use of a standard 0.4mm brass nozzle is the norm, does not require high temperatures and it's relatively inexpensive.

Printing with Nylon with embedded Kevlar is none of those things. Before we get to the filament, let's take a look at Kevlar and nylon and a bit of their histories and properties.

Kevlar is a high-performance synthetic material that is known for its exceptional strength and durability. It was developed by Stephanie Kwolek at the DuPont company in 1965. It is a popular material with a wide range of applications, including body armor, tires, aerospace, fire fighting equipment and sporting equipment. It is a type of aramid fiber, which is a class of synthetic polymer materials that are characterized by their high strength and heat resistance. Aramid fibers are composed of long chains of molecules that are held together by strong chemical bonds, which give them their exceptional strength and durability. Kevlar, in particular, is known for its high tensile strength - five times greater than steel, and its high temperature resistance properties - having a melting point of 600° C.

The nylon used in Nylon + Kevlar filament is called PA6, or Nylon 6, and as a filament material for 3D printing, it is popular due to its ability to produce high-quality, precise prints with a smooth surface finish. One of the most significant properties of PA6 nylon filament is its high tensile strength, making it ideal for producing functional, light-load-bearing parts. Post-printing characteristics of PA6 nylon filament include its low water absorption and this property ensures that the printed parts maintain their dimensional stability even in humid environments, reducing the risk of warping or deformation. One of the primary issues with PA6 nylon filament (e.g. pre-printing) is its tendency to absorb moisture from the air. Moisture can degrade the filament's quality, leading to decreased strength and brittleness, which can affect the performance of printed parts. Additionally, PA6 nylon filament has a relatively low melting point compared to other high-performance materials such as ABS or polycarbonate, making it easier to print on a wider range of 3D printers.


The filament is dark grey in color with a rough texture. With nylon being hygroscopic, and particularly PA6 nylon, we need to deal with moisture in the filament. I am using an Ivation Countertop Dehydrator Drying Machine and set to highest temperature, 158° F or 70° C. I left the filament in the dehydrator for about sixteen hours.


The print quality of objects made from Nylon + Kevlar filament is questionable at best. I use UltiMaker Cura for model slicing and, unfortunately, Cura does not have default settings for Nylon with a 0.6 mm nozzle. It took many iterations of adjusting parameters in Cura to arrive upon something that was close an ok quality print. Here is the configuration profile that I used. The configuration is a bit of a mess; the material is PLA and the nozzle size is 0.8 mm; in the available profiles, you should get a profile named "Nylon Kevlar"

I am using a 0.6 mm ruby tipped nozzle; if you use a vanilla brass nozzle, the kevlar fibers will quickly chew into the filament hole making it be no longer a perfectly round circle.

I had to modify the Marlin firmware on my heavily modified Ender 3 Pro to allow the hotend temperature to get up to at least 270° C and bed up to at least 80° C. I attempted printing at 255° C and the filament jammed in the hotend. I settled upon using 270° C for the hotend and 80° C for the bed.

I printed eight Benchys (there are nine in the photo; one is a PLA print for comparison), each with different Cura settings. It was a trial and error of adjusting single variables and then printing a Benchy. The quality of a print, compared to a perfectly tuned Ender 3 Pro, that uses PLA is a stark difference. I was unable to get anything that remotely appeared to be a smooth surface. All surfaces have a rough, sandpaper-like feel. YouTuber 3DP Iceland made a brief video about Nylon + Kevlar, and his results were similar to mine: rough surfaces, and very stringy results.

The first round tests involved tuning temperatures. As I mentioned, 270° C was settled on for the hotend, and 80° C for the bed. There were fewer stringing at that temperature for the hotend. Second and third rounds involved adjusting retraction of filament on moves; this too reduced stringiness. The rest of the tunings were layer height, flow, extruder movement speed, and so on.

One of the other settings that I found was just about a must use: a raft instead of a brim or skirt. I used Magigoo for better adhesion. For longer (never successful) prints, using a raft proved to not work either. The edges of the raft curled up from the bed; using a wider, tighter brim might be more helpful.

Printing with this filament is very frustrating at times. Good bed adhesion is critical. A clean, wide enough nozzle is very important. Correctly calibrated nozzle height and leveled bed is important.

This is probably now one of my least favorite materials to print with;

Marlin Firmware - Modified Ender 3 Pro

Just about the only thing original and stock on my two Creality Ender 3 Pro 3D printers are the extruded aluminum frames and the control interface with its infinite-turn control knob. Everything else has been replaced; mainboard, extruder hot end and direct filament drive, Z-axis upgrade with additional stepper motor, auto bed leveling and, of course, the firmware and the addition of printer management software, Octo Print via a Raspberry Pi 4b. Oh, and a web camera. The incredibly cluttered photo to left is one of my two heavily upgraded Ender 3 Pro printers.

If you are new to the 3D printer scene, and in particular the world of upgrades and modifications to kit-printers, let's step back and have an brief overview. I won't get into the super-weedy-details because that has likely been covered ad nauseam.

The gist of 3D printing is, you have filament; it can be made of a whole host of materials; everything from nylon with carbon fiber embedded in it, to the more mundane, polylactic acid or more commonly called PLA. This filament is softened enough to flow by way of the hot end and is pushed out of a precision nozzle. This hot end is most often mounted on a series X and Z-axis rails. A heated bed is mounted on the Y-axis. All the movement is made possible by the use of stepper motors. The motors, the hotend and bed temperatures are all controlled by a mainboard.


The upgraded mainboard has a STM32 F103 RET6 microcontroller. The upgrade gives you a 32 bit processor versus the original 8 bit -- this allows for more complicated firmware installs. The board also has improved, silent stepper motor controllers. In order to fully take advantage of this motherboard and accessories like the CR Touch or BL Touch, you will need configure and recompile the Marlin Firmware. We get to that later in this post.

The upgrades listed above are what I eventually arrived upon. There was a Micro Swiss Direct Drive Extruder.

Upgrade Costs Breakdown
Part Cost
Micro Swiss Direct Drive Extruder $99.75
Creality Sprite Direct Drive Extruder Pro Kit $109.99
Micro-Swiss All Metal Hotend Kit $63.50
Ender 3 Dual Z-axis Upgrade Kit $35.79
Upgrade X-axis Belt Tensioner $15.98
Ender 3 Dual Z-axis Upgrade Kit $35.79
Spring Steel Flexible Build Surface Magnetic Removable Bed Sheet $15.98 (2x)
Creality Ender 3 Pro 32-bit Silent Board Motherboard V4.2.7 $42.99
Raspberry Pi 4b - 2GB $45.00
DC 6V 9V 12V 24V to DC 5V 5A Buck Converter Module, 9-36V Step Down to USB 5V $42.99
Logitech C920x HD Pro Webcam $69.99
Creality BLTouch V3.1 Auto Bed Leveling Sensor Kit $47.99
Base model Ender 3 Pro $236.00
Total $877.72

UPDATE 2023/02/25: I purchased a Creality Sprite Extruder Pro ($109.99) This is an improvement on the Creality Sprite Extruder; it allows for filament temperatures up to 300℃. I have a longer term project in mind that will require printing with material at or above 260℃.

As you can see, a base model Ender 3 Pro costs $236.00, but throw in an armful of higher end upgrades (for the retail market), and you suddenly have a setup that has cost nearly $900.00. Yikes! Are all of these upgrades necessary? I would have to say, No. The Creality Direct Drive extruder is well worth the money - never again deal with bowden tubes. The other two must upgrades are the mainboard and adding a CR Touch or BL Touch auto-leveling sensor. Runners up is the dual Z-axis; it really stabilizes the frame.


In order to take advantage of a CR Touch or BL Touch, you will need to configure the firmware to use it. The probe-to-offset also needs to be changed when using the Sprite Direct Drive as the nozzle is a slight different location than the stock nozzle. I won't go into all the details of, but you can compare Configuration_og.h (the original) and Configuration.h as well as Configuration_adv_og.h and Configuration_adv.h. The changes range from enabling CR Touch/BL Touch and enabling a comprehensive bed leveling system, to adjusting the position of the nozzle and enabling thermal safety features.

git clone

Open Visual Studio Code, and Open Folder. Navigate to where you cloned the repository to and open it.

If you are wanting configuration and compile your own firmware, checkout Marlin and It will get your started. Once is installed, you can clone the repo and open it in Visual Code.

Here are the things that were changed in Configuration.h and Configuration_adv.h

#define STRING_CONFIG_H_AUTHOR "(Alex, Ender-3 Pro)"
Who made the changes.
#define CUSTOM_MACHINE_NAME "Ender-3 Pro 4.2.7 - fw v2.0.9.3 - 2023-02-23"
I like to put the date and version numbers in firmware so it is easy to identify a what and a when
#define HEATER_0_MAXTEMP 315
You will want to be careful with this setting; it is the temperature of the hotend in celsius; Needed higher than default for printing nylon and PET-G. Because of HOTEND_OVERSHOOT, maximum temperature will always be MAXTEMP - HOTEND_OVERSHOOT
#define BED_OVERSHOOT    15
(°C) Forbid temperatures over MAXTEMP - OVERSHOOT for hotend and (°C) Forbid temperatures over MAXTEMP - OVERSHOOT for bed
Smoother curve motions
Comment out because we will be using a CR-Touch or BL-Touch
Force the use of the probe for Z-axis homing
#define BLTOUCH
Enable BL Touch/CR Touch
#define NOZZLE_TO_PROBE_OFFSET { -10.0, -10.0, 0 }
Move the offset for the Sprite Direct Drive hotend
A little more buffer around the perimeter
#define EXTRA_PROBING    1
Add extra probings to eliminate outliers
  #define PROBING_NOZZLE_TEMP  200   // (°C) Only applies to E0 at this time
  #define PROBING_BED_TEMP     60
Require minimum nozzle and/or bed temperature for probing; bump temperature to match pre-probing temperature
#define Y_BED_SIZE 210
Adjust bed size; I ran into problems where the extruder would overshoot the bed.
Unified Bed Leveling. A comprehensive bed leveling system combining the features and benefits of other systems. UBL also includes integrated Mesh Generation, Mesh Validation and Mesh Editing systems.
Always enable leveling immediately after G28.
Enable the G26 Mesh Validation Pattern tool.
Use Hilbert distribution for less travel when probing multiple points. Run several commands in a row to get a complete mesh.
Add a bed leveling sub-menu for ABL or MBL.
Moves the Z probe (or nozzle) to a defined XY point before Z homing.
#define PREHEAT_1_TEMP_BED     60
Bump up the preheat temperatures of hotend and bed
#define THERMAL_PROTECTION_PERIOD 120        // Seconds
#define THERMAL_PROTECTION_HYSTERESIS 10     // Degrees Celsius
False positives with Thermal Runaway
  #define EXTRUDER_RUNOUT_SPEED 1500  // (mm/min)
  #define EXTRUDER_RUNOUT_EXTRUDE 5   // (mm)
Extruder runout prevention. If the machine is idle and the temperature over MINTEMP then extrude some filament every couple of SECONDS.
  #define HOTEND_IDLE_TIMEOUT_SEC (10*60)   // (seconds) Time without extruder movement to trigger protection
  #define HOTEND_IDLE_MIN_TRIGGER   195     // (°C) Minimum temperature to enable hotend protection
  #define HOTEND_IDLE_NOZZLE_TARGET   0     // (°C) Safe temperature for the nozzle after timeout
  #define HOTEND_IDLE_BED_TARGET      0     // (°C) Safe temperature for the bed after timeout
Hotend Idle Timeout and Prevent filament in the nozzle from charring and causing a critical jam.
Add Probe Z Offset calibration to the Z Probe Offsets menu
Enable to init the Probe Z-Offset when starting the Wizard. Use a height slightly above the estimated nozzle-to-probe Z offset.
Set a convenient position to do the calibration (probing point and nozzle/bed-distance).
Add an 'M73' G-code to set the current percentage
Use remaining time from M73 command instead of estimation; and Display (P)rogress, (E)lapsed, and (R)emaining time
Show a progress bar on HD44780 LCDs for SD printing
Add an optimized binary file transfer mode, initiated with 'M28 B1'

Display total babysteps since last G28
Combine M851 Z and Babystepping
Enable graphical overlay on Z-offset editor
  #define HOST_PAUSE_M76             
  #define HOST_PROMPT_SUPPORT        
Tell the host to pause in response to M76
Initiate host prompts to get user feedback
Send some status messages to the host as notifications
Add a menu item that tells the host to start
Add a menu item that tells the host to shut down

Even with all of this add-ons and modifications, the printer remains finicky. It is constantly needing adjustments which is expected to an extent when you are dealing with moving material and high heat.

Does it print well? It depends. It depends upon the nozzle wear, the flexibility and moisture content of the filament, and the type of the filament. These are all variables that any 3d printer would encounter. I just don't know how big of a deal these would be to another printer. I have also two Creality CR-6 SE printers, and they worked well until they did not. Maybe someday I will get a higher-end printer and be able to do more comparisons.

Download most recent compiled firmware (v2.0.9.3)


A commenter on the previous review of Raspberry Pi CM4 and pin compatible modules brought to my attention that there exists a fifth module: BIGTREETECH CB1.

My hot take on this system on a module is it is underwhelming. The two call outs are the memory size - 1 gigabyte - and the ethernet - 100 megabits only. The other four modules previously tested all had 4 gigabytes of memory and all had 1 gigabit ethernet.

Geekbench Metrics
Module Single CPU Metrics Multi-CPU Metrics
Raspberry Pi CM4 228 644
Radxa CM3 163 508
Pine64 SOQuartz 156 491
Banana Pi CM4 295 1087
Features Comparison
Raspberry Pi CM4 Radxa CM3 Pine64 SOQuartz Banana Pi CM BIGTREETECH CB1
Specifications Specifications Specifications Specifications Specifications
Core Broadcom BCM2711, Quad core Cortex-A72 (ARM v8) 64-bit SoC @ 1.5GHz Rockchip RK3566, Quad core Cortex-A55 (ARM v8) 64-bit SoC @ 2.0GHz Rockchip RK3566, Quad core Cortex-A55 (ARM v8) 64-bit SoC @ 1.8GHz and Embedded 32-bit RISC-V CPU Amlogic A311D Quad core ARM Cortex-A73 and dual core ARM Cortex-A53 CPU Allwinner H616, Cuad core ARM Cortex-A53 (ARM v8) 64-bit SoC @ 1.5 GHz
NPU - 0.8T NPU 0.8 TOPS Neural Network Acceleration Engine 5.0 TOPS -
GPU - Mali G52 GPU Mali-G52 2EE Bifrost GPU Mali-G52 MP4 (6EE) GPU Mali-G31 MP2
Memory 1GB, 2GB, 4GB or 8GB LPDDR4 1GB, 2GB, 4GB or 8GB LPDDR4 2GB, 4GB, 8GB LPDDR4 4GB LPDDR4 1GB DDR3L
eMMC On module - 0GB to 32GB On module - 0GB to 128GB External - 16GB to 128GB On module - 16GB to 128G) -
Network 1Gbit Ethernet - Option for WiFi5, Bluetooth 5.0 1Gbit Ethernet - Option for WiFi5, Bluetooth 5.0 1Gbit Ethernet - WiFi 802.11 b/g/n/ac, Bluetooth 5.0 1Gbit Ethernet 100Mbit Ethernet - 100Mbit WiFi
PCIe 1-lane 1-lane 1-lane 1-lane -
GPIO 28 pin 40 pin 28 pin 26 pin 40 pin
Extras - - - SATA ports, one shared with USB 3, one shared with PCIe; Audio Codec -
Geekbench Score - Single CPU 228 163 156 295 91
Geekbench Score - Multi CPU 644 508 491 1087 295
Price of Tested* $65 $69 $49 $105 $40
Power Consumption 7 watts N/A 2 watts N/A N/A

If you are thinking, what could this comparatively underwhelming module be used for? First, let's take a look at BIGTREETECH. If you have been into the 3D printer kit scene, you might be familiar with the manufacturer. BIGTREETECH is known for its 3D printer mainboards and other 3D printing related electronics. The CB1 could be easily dropped in in-place for a Raspberry Pi for your Creality Ender 3 Pro or other printer kit. You will need a carrier board for it, but it will work.

OctoPrint or Klipper will run just fine on this module. You will most certainly not need 1Gbit ethernet for printing when most 3D printers print fractions of a millimeter per minute; transmission of gcode will not max out the bandwidth. Likewise for needing more memory; OctoPrint or Klipper will certainly be more responsive with more memory, but 1GB will work just fine.

One thing that this mostly underwhelming module has going for itself is HDMI. It is capable of pumping out 60 fps 4k video. If you are looking for a module that can do this, pick the CB1. For only $40, it is a bargain compared to the RPi CM4 and compatible modules.

Disk Images for the CB1

Information and instructions on WiFi setup

For some of the CM4 pin compatible modules, like the Radxa CM3, an eMMC flash writing utility that I was only able to get working on MS Windows was needed. The CB1 is straightforward in comparison. Simply download an image (link above), and use balenaEtcher or Raspberry Pi Imager or dd to write the image to a micro SD card. The image I ultimately used comes with Linux kernel v5.16.1. Like so many Linux distributions for Arm systems, this kernel is BSP, or Board Specific Package. It is a fork from mainline Linux and it is specifically for the CB1 and its associated Arm processor. Given that this is a niche module, and short of a lot of demand for it, the kernel will likely drift as mainline Linux progresses, eventually becoming outdated. But for now, it is a contemporary, relatively new kernel by comparison; put in constrast with semi-official distribution kernel for the Banana Pi CM4, which comes with v4.9.x, was released in December of 2016.

If you stumbled upon this post by way of some 3D printer-related search, and you are just wanting to write an image to a micro sd card and get on with printing awesome stuff on your is a video with instructions.

If you do not need much computing or memory, you are mostly interested in a simple 3D printer manager or a barebones HDMI streamer, the CB1, for its price, is pretty good. There even is a drop-in replacement for Ender 3 mainboards, the BIGTREETECH Manta E3EZ V1.0 Mainboard 32 Bit Silent Control Board. This gives you OctoPrint or Klipper, for print management, plus Marlin Firmware, for printer control and gcode execution, all-in-one board for about $65. This is a great deal give the much griped about availability of Raspberry Pi modules and boards, and secondary market prices, for the small order and maker crowds.

Finally, Polycube compiles on runs successfully on this module, I will eventually include it in a network routing comparison of Raspberry Pi CM4 pin compatible modules.

Building a Kernel and Disk Image for the Radxa CM3

With my eventual goal of testing out network and router capabilities of four compute modules that are pin compatible with the Raspberry Pi CM4, I have been doing setup work. My last few postings (here, here and here) on getting Polycube, a drop-in replacement for iptables and a number of other utilities that uses eBPF instead of the usual netfilter-based mechanisms. The objective is to test out netfilterand ebpf routing on the four modules (giving me a collection of eight test sets).

I have Polycube compiled and appearing to function on the Raspberry Pi CM4, the Pine64 SOQuartz module, and the code compiled and runnable on the Radxa CM3. There is one problem with running Polycube on the CM3: the SYSCALL for eBPF was not compiled into the kernel. Even though the code successfully compiled to an executable binary, the necessary kernel hooks are not present. The solution: compile a new kernel and create a new disk image.

If you are a person who is interested in tiny computers of various flavors, you will have noticed that there are an abundance of different distributions out on the internet. An example, for the Pine64 Quartz64 model A, there are at least three different variant distributions - Plebian Linux, DietPI, and balbes150's Armbian. They all have one thing in common, they all use Debian packages and are in one sense or another, a derivative of Debian and the Debian ecosystem. If you have used Ubuntu, you have used a distribution that leverages Debian architecture and infrastructure.

The available distributions for Radxa CM3 also use Debian ecosystem components; everything from being able to utilize other arm64 packages, to using the build infrastructure for bundling up things into a handy disk image that can be burned/written to media.

Many single board computer distributions are what is called a "board support package", or BSP for short. A BSP includes low level boot programs (a first stage bootloader, prebuilt binaries and Arm Trustzone Firmware) a boot program (a second stage bootloader , like u-boot or Tianocore EFI), an operating system and the compatible drivers for that are specific to the board. The BSP is a unique bundling of software that is specific to a given board or family of boards. Often times, the Linux kernel that is included with a given BSP has been modified and new drivers have been added. The kernel is essentially a fork and no longer tracks the "main branch" of Linux kernel development and any upstream changes in the main branch maybe difficult or impossible to incorporate. The kernel is, therefore, a snapshot in time that all too often fades into obscurity because of lack of attention from the developers or a broader community (if a community exists).

Despite not having the following and community backing like that of Raspberry Pi, Radxa does have well maintained series of BSP distributions. Many do have their kernels pegged to a specific version within the Linux kernel repository, but much of the userland software is not usually tied to specific features found in specific versions -- unless the software is something like Polycube.

Radxa does a great job of providing build frameworks for both configuring and compiling a new kernel, as well as downloading packages and building a disk image. Let's get started.

The following information is based on this.

  1. As a pregame note, I made a virtual machine using VirtualBox. Specifically, Debian 11 for build the new kernel in order to prevent any unnecessary contaminations of packages, dependencies or the like on my laptop. The building of the distribution image uses Docker and will not pose any issues.

  2. Clone the Github repository rockchip-bsp and specifically the stable-4.19-rock3 branch. The pull in any submodules.

    git clone -b stable-4.19-rock3
    cd rockchip-bsp
    git submodule init
    git submodule update

    The stable-4.19-rock3 branch has support for the following boards:

    • ROCK 3A
    • ROCK 3B
    • Radxa CM3 IO
    • Radxa E23
    • Radxa E25
    • Radxa CM3 RASPCM4IO

    Cloning the repository and checking out the stable-4.19-rock3 branch produces the following directories:

    • build: Some script files and configuration files for building u-boot, kernel and rootfs.
    • kernel: kernel source code, current version is 4.19.193..
    • rkbin: Prebuilt Rockchip binaries, include first stage loader and Arm TrustZone Firmware.
    • rootfs: Bootstrap a Debian based rootfs, support architecture armhf and arm64, supports Debian Jessie, Stretch and Buster.
    • u-boot: u-boot as the second stage bootloader

    There are a few things to note. First, our kernel is version 4.19.193. Polycube requires at minimum v4.15. With v4.19, we are covered. Second, this repository/project contains scripts to bootstrap and build a disk image. We will not be using this functionality. The supported Debian distributions are too old. We have been using at least Debian bullseye for all of our Polycube testing.

  3. Install a Linaro toolchain. This is used for compiling code on an x86/amd64 and producing arm64 binaries.

    sudo tar xvf gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu.tar.xz  -C /usr/local/

    Linaro has driven open source software development on Arm since 2010, providing the tools, Linux kernel quality and security needed for a solid foundation to innovate on. Linaro works with member companies and the open source community to maintain the Arm software ecosystem and enable new markets on Arm architecture.

  4. In your user's .bashrc file, append the following line:

    export PATH="/usr/local/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin:$PATH"
    Then source .bashrc to update your PATH variable.
    source ~/.bashrc

    Verify that the Linaro GCC toolchain is visable from your PATH

    which aarch64-linux-gnu-gcc
  5. Install a few packages:

    sudo apt-get install gcc-aarch64-linux-gnu \
                  device-tree-compiler libncurses5 libncurses5-dev \
                  build-essential libssl-dev mtools bc python dosfstools
  6. Build u-boot for Radxa CM3 and specifically for use with a Raspberry Pi CM4 carrier/io board.

    ./build/ rk3566-radxa-cm3-raspcm4io

    There should be files in out/u-boot

    ls -l out/u-boot
    total 2132
    -rw-rw-r-- 1 alex alex  299008 Feb  1 22:43 idbloader.img
    -rw-rw-r-- 1 alex alex  453056 Feb  1 22:43 rk356x_spl_loader_ddr1056_v1.10.111.bin
    -rw-rw-r-- 1 alex alex 1426944 Feb  1 22:43 u-boot.itb
  7. Configure a new kernel. If you have ever cloned the Linux source code repository or unarchived a tar-file of the source and then configured kernel and then compiled it, the following step will be familiar. The build process has been remarkably similar for better part of twenty-five years. I had not configured and compiled a kernel from source in a very long time; the kernel configuration process was remarkably familiar.

    cd kernel
    export ARCH=arm64
    export CROSS_COMPILE=aarch64-linux-gnu-
    make rockchip_linux_defconfig

    There will be a file named .config, you can either edit this by hand (if you have an idea of what you are doing and need to do) or you can use a handy menu-driven interface. Either way, for my specific needs of enabling eBPF, I simply opened .config in an editor, and searched for references to BPF.

    If you want to try the menu-driven method, execute the following:

    make menuconfig

    Save your new configuration (run this whether you editted by hand or used menuconfig)

    make savedefconfig
    cp defconfig arch/arm64/configs/rockchip_linux_defconfig
    cd ..

  8. Build a kernel

    ./build/ rk3566-radxa-cm3-raspcm4io
    This will kick off the compilation of the kernel; obviously, depending upon your build machine, it might take a while.

    You will likely be presented with some configuration questions:

    Give that I am not entirely versed in things-kernel, I answered y to all of the questions. Leave a comment below if you have some insight into the questions that are presented during the build process.

  9. Pack up your new kernel and associated headers into Debian package files (e.g. .deb). The parameters for are: 1) the name of the kernel configuration file (from step #7); 2) ebpf is a release value, it should be something useful.

    ./build/ -d rockchip_linux_defconfig -r ebpf
    This will compile the kernel, again, but this appears to be necessary because this steps does not configure the appropriate chip and board as in the previous step.

    ls out/packages/

    These Debian packages will be needed when we build a Debian bullseye distribution.

  10. You will also need to copy rk3566-radxa-cm3-rpi-cm4-io.dtb from out/kernel directory; this device table is needed when writing a new disk image to the CM3.

    If you do want to assemble an older distribution (Debian buster or stretch), you can follow steps for Make rootfs image found here. I have a pre-built Debian buster with Desktop disk image available here

  11. Change directories to place outside of the rockchip-bsp directory, and now, clone the Radxa rbuild tool

    git clone

    You will need docker and associated software packages. Installing these tools should be straightforward and there are dozens if not hundreds of howtos widely available to assist you. If you do not have docker command line tools installed and you looking for a quick guide, follow these instructions before proceding.

  12. Make a directory for your kernel packages; copy kernel packages

    cd rbuild
    Make a directory for the kernel packages; I will be using docker outside of the virtual machine that I used to build the kernel packages. You are free to use the VM for building the bullseye disk image, I ran into issues and decided to use my laptop to directly use docker. I used scp to copy the kernel packages from the VM into a directory named kernel that is in the rbuild directory containing the cloned repo.
  13. Run rbuild to magically assemble a disk image for you; this will take a while, best to grab some coffee, or lunch, or just go home for the day. There is also a strong chance of having network timeouts while downloading necessary files. I ended up having at least five times where a package download failed and killed the whole build process. On a my Dell XPS Developer Edition laptop, in a VirtualBox VM, the process took over eight hours. It should be noted that even if there is a timeout, by specifying the -r parameter to rbuild, this is caching the necessary Debian packages.

    ./rbuild -r -k kernel/linux-image-4.19.193-ebpf-rockchip-g67a0c0ce87a0_4.19.193-ebpf-rockchip_arm64.deb radxa-cm3-rpi-cm4-io cli

    ls -l
    total 1434692
    -rw-rw-r-- 1 alex alex       3322 Feb  1 22:17 action.yaml
    drwxrwxr-x 6 alex alex       4096 Feb  2 09:38 common
    drwxrwxr-x 2 alex alex       4096 Feb  1 22:17 configs
    drwxrwxr-x 2 alex alex       4096 Feb  1 22:38 kernel
    -rw-r--r-- 1 alex alex 6442450944 Feb  2 11:48 radxa-cm3-rpi-cm4-io_debian_bullseye_cli.img
    -rw-rw-r-- 1 alex alex        175 Feb  2 11:48 radxa-cm3-rpi-cm4-io_debian_bullseye_cli.img.sha512
    -rwxrwxr-x 1 alex alex      18869 Feb  1 22:17 rbuild
    -rw-rw-r-- 1 alex alex       1542 Feb  1 22:17
  14. And there we have it. radxa-cm3-rpi-cm4-io_debian_bullseye_cli.img is your new disk image, complete with a custom compiled kernel with eBPF enabled. We can compress the disk image with xz to make it more manageable.

    xz -z -v radxa-cm3-rpi-cm4-io_debian_bullseye_cli.img
    radxa-cm3-rpi-cm4-io_debian_bullseye_cli.img (1/1)
      3.0 %     5,938.2 KiB / 185.7 MiB = 0.031    10 MiB/s       0:18   9 min 50 s
  15. You can download the kernel and disk image that was built during the writing of this post:

    The Device Table file built during the writing of this post:

  16. Instructions on writing the disk image to eMMC on the Radxa CM3, you can follow the instructions on my previous post, Raspberry Pi CM4 and Pin Compatible Modules

More Information on Radxa's build scripts, rbuild documentation and its github repo