Dienstag, 3. Dezember 2013

how to strace a process

strace is a Linux command that can help you with error analysis. By default it will output every syscall a process does. This means

  • it will output a lot of lines that you will have to examine
  • in the worst case your problem will not even show up. Consider an endless loop like while (true); - this one does not do any syscalls at all.
There is no tool that "drills down" deeper on this analysis than strace. By this it is comparable to
  • disassembling a program as I give an example here. A program, as a contrast to a process, is something stored on disk rather than running in RAM. Disassembling will reveal problems like the above endless loop, but it does not work on a running process. 
  • network sniffing like I give an example here. There is no drill-down to looking at the bytes that are transmitted via a network cable
  • sniffing the SCSI bus with blktrace like I give an example here
  • sniffing the USB bus with wireshark like I give an example here
  • testing IMAP via telnet - going down to the very elements defined in the IMAP protocol
It takes some time till you can use strace for an actual purpose. I started with Linux in 2000 and the first time strace helped me to accomplish a task was in 2013. Here is what happened:

I was setting up guacaMole, the tool to control a Linux desktop from a browser. It basically consists of a daemon, guacd that (if I understood it right) accepts data from the browser and uses it to control a VNC session. It gave me the error message "Server error" which does not really mean anything. So I strace'd it:
# ps -A|grep guac
 7361 ?        00:00:00 guacd
# strace -p 7361
for every login I did on the web interface I saw this in strace's output:
accept(4, {sa_family=AF_INET, sin_port=htons(42845), ...
clone(child_stack=0, ...
close(5)                                = 0
listen(4, 5)                            = 0
now the commands "man 2 accept", "man 2 clone", "man 2 close" and "man 2 listen" told me more. "Clone" means that a separate process will be spawned off. We want strace to follow this process as well so we call it again with the ff parameter:
# strace -ffp 7361
This time there was more output. There were several lines like
[pid 20344] open("/usr/lib/x86_64-linux-gnu/libguac-client-vnc.so", O_RDONLY) = -1 ENOENT (No such file or directory)
reading the complete output, this libguac-client-vnc.so was never found. This told me I had to re-compile the guacamole server with VNC development libraries so its VNC module would be buildable. When I did this, I also had to move the library to the right place (make install did not do), but these are the little hurdles described in my guacaMole tutorial.

You can do much more with strace. If I had known this was all about a missing file I would have started it with -e open. This tells strace to only print occurences of the syscall open. In effect it allows you to monitor which files are accessed by a process. I use it to find out where configuration changes are stored (ok, maybe this was not the first time strace was useful to me).

You do not need to know a process ID to call strace. You can just call 
strace program
and strace will load program as a process and output its syscalls.

strace shortens information for you and replaces strings by "..." before they get too long. To change this use the -s parameter to determine how long strings are supposed to be. For more information see the man page.

strace can also be used a bit more abstract for performance analysis.
strace -c ls -R
will show you in which syscalls the ls program passed most of its time. This is helpful if you want to optimize routines for speed. The output could look like this:
Entries  Repository  Root
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 67.09    0.412153          14     29664           getdents64
 27.70    0.170168          11     14849        14 open
  4.24    0.026043           0    123740           write
  0.72    0.004443           0     14837           close
  0.20    0.001204           0     14836           fstat
  0.05    0.000285         285         1           execve
  0.00    0.000000           0        12           read
  0.00    0.000000           0         4         3 stat
  0.00    0.000000           0        33           mmap
  0.00    0.000000           0        18           mprotect
  0.00    0.000000           0         4           munmap
  0.00    0.000000           0        12           brk
  0.00    0.000000           0         2           rt_sigaction
  0.00    0.000000           0         1           rt_sigprocmask
  0.00    0.000000           0         2           ioctl
  0.00    0.000000           0         1         1 access
  0.00    0.000000           0         3           mremap
  0.00    0.000000           0         1           fcntl
  0.00    0.000000           0         1           getrlimit
  0.00    0.000000           0         1           statfs
  0.00    0.000000           0         1           arch_prctl
  0.00    0.000000           0         3         1 futex
  0.00    0.000000           0         1           set_tid_address
  0.00    0.000000           0         8           fadvise64
  0.00    0.000000           0         1           set_robust_list
------ ----------- ----------- --------- --------- ----------------
100.00    0.614296                198036        19 total
which means that more than two thirds of ls' time was passed in the getdents64 syscall. I'll leave you alone for now if you want to man 2 getdents64 and start optimizing the ls program to list directories. Have fun!

Sonntag, 27. Oktober 2013

read e-books with Linux

Yes! I read an e-book on my Linux computer \o/

I did this on 2013-10-25 with SUSE Linux 12.2:

  • go to http://www.amazon.com and get some free e-books.
  • downloaded their Kindle reader for Windows
  • delete the old version of the Windows Emulator wine from my computer. To do this, open a console and type
    rpm -e wine wine-32bit wine-mp3
    rpm -ivh wine-1.7.4-*.rpm wine-gecko-*.rpm wine-32bit-*.rpm
  • Now you start the reader's installation:
    wine Downloads/KindleForPC-installer.exe
  • And start the reader:
    cd .wine/drive_c/Program\ Files/Amazon/Kindle
    wine Kindle.exe

Dienstag, 22. Oktober 2013

pretty URL in mediawiki

For my personal homepage http://www.staerk.de/thorsten I use mediawiki. That way I can edit it whenever I want, even from an internet cafe or the like.

When I write about e.g. my Cybermaster I do not want it to appear anywhere but on http://www.staerk.de/thorsten/cybermaster. This is called a prettyURL and I want to show here how I do it. My URL http://www.staerk.de/thorsten corresponds to the directory /var/www/staerk.de/thorsten on the server. I am using mediawiki 1.21.2 on Apache2 under Ubuntu Linux 10.04
  • make sure Apache has the "rewrite" module loaded:
    # apache2ctl -t -D DUMP_MODULES 2>&1 | grep rewrite
    rewrite_module (shared)
  • configure apache to rewrite your requests as discussed here:
    RewriteRule ^/?thorsten(/.*)?$ %{DOCUMENT_ROOT}/thorsten/index.php [L]

    RewriteRule ^/*$ %{DOCUMENT_ROOT}/thorsten/index.php [L]

  • restart apache
    /etc/init.d/apache2 restart
  • Add the following line to LocalSettings.php:
    $wgArticlePath = "/thorsten/$1";

Now your wiki will look "strange" like this:

The reason for this "strange" look is that the skins are missing. Mediawiki is using a file called load.php and when loading it, apache will use its rewrite-rules and try to load it as a wiki page. The solution is:
  • add the following condition above the first rewrite rule:
    RewriteCond %{REQUEST_URI} !^/thorsten/load.*$

Then it looks better, but still the images are missing. No problem, reading apache's access log at /var/log/apache2/other_vhosts_access.log I find that clients try to download them from /thorsten/Images. So
  • add another condition above the rewrite rule:
    RewriteCond %{REQUEST_URI} !^/thorsten/images.*$

and the page looks again as it should:

See also

Freitag, 4. Oktober 2013

Error creating thumbnail: Unable to save thumbnail to destination

I just set up mediawiki on http://www.staerk.de/thorsten. Whenever I upload an image I see the error message:
Error creating thumbnail: Unable to save thumbnail to destination

1. Permissions

Now the first thing you should check when you get this error message is that your server's directories are writeable to the web server process. This is Ubuntu Linux so as long as the files are owned by www-data everything is okay. They were so this is not the problem:

/var/www/staerk.de/thorsten# ll
-rw-r--r--  1 www-data www-data     1088 Sep  3 18:56 thumb_handler.php
-rw-r--r--  1 www-data www-data      956 Sep  3 18:56 thumb_handler.php5
-rw-r--r--  1 www-data www-data       86 Sep  3 18:56 wiki.phtml
[...]

2. Logs

So I had to dig deeper. I looked into the server log if there was any entry at the time when I uploaded:
cat /var/log/apache/error_log
There was no message at these times so I moved on.

3. PHP's safe_mode

php's safe_mode feature is another thing that can make accessing files impossible. safe_mode is a great feature of PHP and it should never be turned off except for experimenting and troubleshooting. So I opened /etc/php5/apache2/php.ini, searched for safe_mode and set it to off:
safe_mode = Off
restarted the web server with the command
/etc/init.d/apache2 restart
and during the next time when I uploaded an image the error was gone.
So I set safe_mode to On again, restarted apache and entered the following line into /var/www/staerk.de/thorsten/LocalSettings.php:
putenv('TMPDIR=/var/www/staerk.de/thorsten');
Now whenever I upload a file I get a warning in /var/log/apache2/error.log like:

[Fri Oct 04 08:37:50 2013] [error] [client 95.113.203.63] PHP Warning:  putenv(): Safe Mode warning: Cannot set environment variable 'TMPDIR' - it's not in the allowed list in /var/www/staerk.de/thorsten/LocalSettings.php on line 31, referer: http://www.staerk.de/thorsten/index.php/Special:Upload

So what is in the allowed list?
Looking into /etc/php5/apache2/php.ini helps. I set it to empty which allows to change all environment variables:
safe_mode_allowed_env_vars =
And the error changes. The error now says:
Error creating thumbnail: Unable to run external programs in safe mode.
Googling helped. In /var/www/staerk.de/thorsten/LocalSettings.php I added at the end:
$wgUseImageMagick = false
and it works as you can see on http://www.staerk.de/thorsten

Freitag, 21. Juni 2013

my virtual machine is getting slow

I have been asked multiple times "why is my virtual machine getting slower after some time". I have heard this about VMware and VirtualBox machines without a lot of concrete information what happens.
It happens to me as well. It seems to have something to do with (a) time and (b) snapshots that you have created. It causes a machine to become really slow. Here is a "benchmark" to show what I mean. It writes zeroes to memory as fast as possible. On my VirtualBox virtual machine I get:

linux-s0l1:~ # dd if=/dev/zero of=/dev/shm/testfile bs=8M count=10
10+0 records in
10+0 records out
83886080 bytes (84 MB) copied, 2.0009 s, 41.9 MB/s

42 MB/s when writing to RAM? Wow that's bad. Let's look what the host machine makes:

tweedleburg:~ # dd if=/dev/zero of=/dev/shm/testfile bs=8M count=10
10+0 records in
10+0 records out
83886080 bytes (84 MB) copied, 0.0423951 s, 2.0 GB/s

about 50 times as much. Actually, even moving my mouse on the VM's display make the CPU go wild!

In VirtualBox, I deleted all snapshots and my virtual machine's performance went up from 42 MB/s to 150 MB/s. But I have other VirtualBox virtual machines on the same host with the same guest operating system that deliver 1.8 MB/s.

Montag, 20. Mai 2013

booting from network

In the lab, I can boot any server from the network. This allows me to start up any distribution I like. Also it is possible to install Linux by booting via the network as I describe in 3 ways to install Linux. The technology to  boot from the network is called PXE, preboot execution environment. Today I want to use it for my virtual machines. The setup looks like this:


On my main computer I use SUSE Linux.

DHCPD setup

A dhcp daemon assigns a dynamic IP address to a computer that connects to the network. The PXE technology requires this, so let's set up a DHCP server (daemon) on the main computer. Open a console as root and call:
yast -i dhcp-server
Make sure it listens on network device eth1. To do this, open /etc/sysconfig/dhcp, set 
DHCPD_INTERFACE=eth1
We don't use eth0. eth0 gets its IP address from the router which interferes with our goal.

Configure DHCP with a file /etc/dhcpd.conf:
subnet 192.168.0.0 netmask 255.255.255.0
{
   range 192.168.0.10 192.168.0.100;
   next-server 192.168.0.1;
   filename "pxelinux.0";
}

Start dhcpd using the command
/etc/init.d/dhcpd start
Activate dhcpd start on boot using the command
chkconfig dhcpd on

TFTP setup

TFTP, the trivial File Transfer Protocol, allows for transmitting bootcode over the network. Install the server using the command:
yast -i tftp
Then edit /etc/xinet.d/tftp, replace
disable = yes
by
disable = no
Then restart xinetd, the service hosting tftp:
/etc/init.d/xinetd restart
Now test your tftp server using the command
tftp localhost -c get pxelinux.0
There should not be any error message from this command. Then activate xinetd start on boot:
chkconfig xinetd on 

RIPLinux setup

RIP Linux is a distribution optimized for (recovery and ) PXE.
cd /srv
wget http://www.tux.org/pub/people/kent-robotti/looplinux/rip/RIPLinuX-13.7.PXE.zip
unzip RIPLinuX-13.7.PXE.zip

VirtualBox setup

VirtualBox allows you to create and run virtual machines. These virtual machines can boot from LAN (local area network). To set it up, open a console as root and call:
yast -i virtualbox
or, depending on your SUSE version
yast -i virtualbox-ose
Start it with the command
VirtualBox
Then create a virtual machine by clicking onto the "New" Button.

Now select your new virtual machine, click on "Settings" -> "Network". You want to make it a bridged adapter (in my case bridge to eth1) and select "advanced" -> "Adapter Type". As adapter type, set PCnet-Fast III, even if this is not build into your computer. If you do not select this, PXE will not work:

To boot your virtual machine from network (LAN), click on "Start", then type F12, then L.

Samstag, 23. Februar 2013

Editing the context menu

When you right-click onto your Linux desktop you get a context menu like this:


I took this screenshot using Knoppix 7.0. My goal for today is to configure this menu.First step is to open a console and call

pcmanfm --desktop-pref

and select Advanced -> "Show menus provided by window managers when desktop is clicked":



Now you will not see a desktop menu when you right-click onto your desktop. But we will change this now. First install the window manager openbox:

sudo apt-get update
sudo apt-get install openbox

And run it

openbox --replace

You find that the menu has changed. You want to know which configuration files are used to build this menu so you run

cd
strace -e open openbox --replace 2>strace.txt

Now looking at strace.txt I find a line

open("/etc/xdg/openbox/menu.xml", O_RDONLY|O_LARGEFILE) = 6

ok, so it seems like openbox is using /etc/xdg/openbox/menu.xml for its menu structure. And indeed, we find there exactly the entries we see in the context menu. Once I changed it and re-ran

openbox --replace

my dream-menu for right-clicks was there:


The interesting thing is that I had no idea how to call the file manager (for "open files") from the command line. So I clicked on it and used the command xprop to find out its program name. I found it is pcmanfm.

So here is my /etc/xdg/openbox/menu.xml:

<?xml version="1.0" encoding="UTF-8"?>

<openbox_menu xmlns="http://openbox.org/"

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://openbox.org/
                file:///usr/share/openbox/menu.xsd">

<menu id="root-menu" label="Openbox 3">

  <item label="Open a console">
    <action name="Execute"><execute>x-terminal-emulator</execute></action>
  </item>
  <item label="Browse the web">
    <action name="Execute"><execute>x-www-browser</execute></action>
  </item>
  <item label="Open files">
    <action name="Execute"><execute>pcmanfm</execute></action>
  </item>
  <item label="Take a screenshot...">
    <action name="Execute"><execute>ksnapshot</execute></action>
  </item>
  <separator />
  <item label="Configure desktop...">
    <action name="Execute"><execute>pcmanfm --desktop-pref</execute></action>
  </item>
  <item label="Restart">
    <action name="Restart" />
  </item>
  <separator />
  <item label="Exit">
    <action name="Exit" />
  </item>
</menu>

</openbox_menu>


Samstag, 16. Februar 2013

4 ways to try Linux

So you want to try out Linux but you aren't really sure how to do it? I want to show you four ways:

Ditch Windows, install Linux

Take your computer, format C: and install Linux. Frankly, I don't see any advantage in doing this. You give up all the Windows-specific know-how you already have for something you don't know.

Dual-Boot Windows and Linux

Many distributions, e.g. Ubuntu and SUSE allow you to install them onto a separate partition. When starting your computer you can select if you want to work under Windows or under Linux. Even better, if you install Linux on a USB disk you can take this disk anywhere and boot any computer with it - provided the computer is modern enough to boot from USB.

Use a virtual machine

You don't have a spare computer around? Just install VirtualBox (available for Windows and Linux) and create a virtual machine on your computer. There you can install Linux and experiment without the danger to break anything out of your virtual machine.
VirtualBox hosting 4 virtual Linux machines
And the best thing is - you can run Windows and Linux simultaneously. You do not have to decide when booting which one you want to use. When both operating systems are running it is also easy to copy files between Linux and Windows. VirtualBox also allows you to access USB devices that are attached to the physical machine as if they were attached to the virtual machine.

Use a remote desktop over the internet

The easiest way to try Linux is via a Linux desktop on a remote computer via the network. Here it depends if you are behind a corporate firewall or not. If you are (or if you don't know) GuacaMole will work and give you a Linux desktop in a browser.
FireFox accessing a Linux desktop shared via GuacaMole

If you are directly in the public internet, you can also use NoMachine's NX. In both cases be aware - you will not be able to access your local hardware like USB sticks or hard drives. The easiest way to get access to such a shared Linux desktop is to rent a server and install the needed software.

Freitag, 1. Februar 2013

run vlc as root

The best video player in the world is VLC. But when I try to run it I get the following error message:

VLC is not supposed to be run as root. Sorry.
If you need to use real-time priorities and/or privileged TCP ports
you can use vlc-wrapper (make sure it is Set-UID root and
cannot be run by non-trusted users first).


That's nonsense to my opinion so I want to remove it. Re-compiling takes time and knowledge about video codex so I want a shorter way. Just editing the executable file /usr/bin/vlc will work:

cp /usr/bin/vlc /usr/bin/vlc-backup
needle=$(objdump -d /usr/bin/vlc | grep euid | tail -1 | awk '{print "\\x"$2"\\x"$3"\\x"$4"\\x"$5"\\x"$6;}')
sed -ir "s/$needle/\xb8\x01\x00\x00\x00/" /usr/bin/vlc

and it works, vlc runs as root now.

How did I do this

Glad you asked this question - it will take us through a journey of the gnu debugger, disassembling programs and editing hex files that is actually very interesting.

Let's look at the functions that are contained in vlc. Open a console and type:

# which vlc
/usr/bin/vlc
# gdb /usr/bin/vlc
[...]
(gdb) info functions
All defined functions:

Non-debugging symbols:
[...]
0x0000000000400f40  geteuid
[...]
 
Ok so there is a function geteuid to find out the effective User ID. Let's disassemble vlc to find out when this is called:

objdump -d -M intel /usr/bin/vlc
[...]
40118e:       e8 6d fe ff ff          call   401000 <geteuid@plt>
401193:       85 c0                   test   eax,eax
401195:       0f 84 20 05 00 00       je     4016bb <dlerror@plt+0x57b>
[...] 

Wow, in line 40118, the function geteuid is called. Obviously it sets the processor register eax to 0 if the user is root. Because in line 401193, eax is checked to be 0 or not. Line 401195 contains the command je, "jump if equal". So if eax is 0, the processor will continue at address
<dlerror@plt+0x57b>. There will be code to end the program I assume.
So let's replace line 401195 by some code that just does nothing. "Do nothing" in assembly is NOP, "no operation". In machine code it is 90h. That means if we replace the bytes in line 401195 by 90 90 90 90 90 90, it will no longer exit.

No problem, let's call this hex editor okteta using the command

okteta /usr/bin/vlc

and search for the bytes 0f8420:
The hex editor okteta showing /usr/bin/vlc
Now there is only one occurrence in the file. Replace it (and the following 3 bytes) by 90's:
Then click on File -> Save and the problem from the beginning will not bug you any longer.

See also

http://www.linuxintro.org/wiki/Run_vlc_as_root

Samstag, 26. Januar 2013

3 ways to install Linux

There is more than one way to install Linux on a computer. Which one is best depends on how often you do it, how different your requirements are and whether you work in a lab or at unpredictable customer locations (and have to take your lab with you). Basically there are three ways:

click-through

You put the DVD into the drive, boot from it and follow the instructions on screen. There is nothing wrong about this as long as you are only doing 3 installations or so per month in your lab - or 10 as a consultant at customers. To support this type of installation in your lab you can set up an NFS server to store your installation media and the like.
SUSE's final confirmation screen in a manual installation

automated installation

Automated installation is called kickstart with Fedora and Red Hat or AutoYaST with SUSE. Instead of answering the installer's question, you hand over a text file to it that contains the answers. How big do you want your partitions to be? Just describe it in the file. Then store this file on a virtual floppy disk, on a file server or on the install media and tell the installer where it is:
SUSE's installer pointed to an autoinstall file on an NFS server

I describe the details for SUSE at http://www.linuxintro.org/wiki/autoYast
You can develop this topic until you have a complete installation factory. Have you looked at Chris' phpEquiMon? This is a collaborative hardware inventory list that integrates PXE to redeploy servers with one click and one reboot. It's great if you have the skillset to install it.

cloning

If you have a Linux installation you can clone it. You do not depend on SUSE's or Red Hat's auto install mechanisms. You just copy your harddisk byte-by-byte to another harddisk in another computer. Even better, copy it file-by-file. Then you can go to a bigger harddisk. My favorite command is
 
tar -cvz $(ls | grep -v proc)  | ssh root@192.168.0.5 "cat >slash.tar.gz"
 
I describe it in detail on  http://www.linuxintro.org/wiki/cloning

Freitag, 25. Januar 2013

Creating an autoyast file

Today I want to create an autoyast file that actually works. Whoever says this is easy does not have the complete information.

I am using SUSE 12.2 here, installed into a VirtualBox virtual machine:
VirtualBox with 4 virtual machines
To clone this machine using autoyast I start it, open a shell in it and type
yast -i autoyast2
yast clone_system

This will create a file /root/autoinst.xml that clones the system you just installed.

If you now go and use this autoyast file with VirtualBox it will not work. After some time your installation will show a black screen, nothing else. As I have a little bit of a Linux education I could solve this problem:
SUSE Installer during the unattended installation via AutoYast

In the shell type

yast2 sw_single

then de-install yast2's iscsi client. Then again clone the config:

yast clone_system

and find a file /root/autoinst.xml. This is now useable. Ok, I had to do some minor modifications still, but you can see them on your own. I have shared it on gitHub.

Samstag, 19. Januar 2013

Creating a bootstick with AutoYaST

It is a good thing to have a Linux bootstick ready. You can boot any computer with it and diagnose hardware problems, eliminate viruses or fix startup problems.

There are a lot of ways to create a bootable USB stick. Today I want to explore a new one: Using a virtual machine and AutoYaST.  AutoYaST allows you to create a file to answer the installer's questions. We will use it on a VirtualBox virtual machine with no harddrive and a USB stick. This description is based on SUSE Linux 12.2, but other operating systems may work similar.

Create a virtual floppy

Autoyast requires a file that contains the answers to the installer's questions. It can be on a floppy disk. As I do not have a floppy drive, I will use a virtual floppy here which is a file. So, create a file that has exactly the size of a floppy disk by opening a console and typing:
dd if=/dev/zero of=floppy.img bs=1024 count=1440
Format this floppy:
mkfs.msdos floppy.img
Mount this floppy:
mkdir /mnt/loop 
mount -o loop floppy.img /mnt/loop
Create a file autoinst.xml that looks like this.
Copy the autoinst.xml to the virtual floppy
cp autoinst.xml /mnt/loop
Unmount the virtual floppy.
umount /mnt/loop

Create your virtual machine

Install VirtualBox on your SUSE Linux:
yast -i VirtualBox

Start VirtualBox with the command
VirtualBox
VirtualBox, in this case with 4 virtual machines

Create a new virtual machine without harddisk: Click on New -> Next -> enter "autoyast" as name for your virtual machine -> Next -> enter 1024 GB RAM -> Next -> un-tag "Start-up Disk" -> Next -> Continue -> Create
Insert the SUSE 12.2 DVD into the machine:

Click on the virtual machine "autoyast" -> Settings -> Storage -> IDE Controller -> add CD/DVD drive -> add the SUSE 12.2 DVD. Click on the + sign to add a floppy controller. Add the virtual floppy that we called floppy.img. It should look like this:

"Inserting" a virtual DVD and floppy into your virtual machine
Click OK and start the virtual machine. Select F12, then c to start from CD-ROM. In the boot screen, enter autoyast=floppy:
Your virtual machine starting from SUSE DVD using your autoyast floppy

Insert the USB stick into your physical computer. Use VirtualBox to attach the USB stick to the virtual machine. First, attach the "Generic Mass Storage Device", then your USB stick becomes visible (in this example it is the SanDisk Cruzer Blade). Select both so the virtual machine will be able to see the USB stick
Telling your virtual machine it has access to the USB stick
After selecting, type Enter and the installation will run unattendedly.
Final confirmation
Did I say unattendedly? Well, not quite. There will be one more window that asks you for confirmation like the above. And don't worry - the root password is set.

After installation, the system will try to reboot to do the initial configuration. This will fail because VirtualBox cannot boot from USB. However you can use the bootstick now.


Raspberry Pi, test my internet connection

Since start of Corona times, I use my internet at home also for work. So its reliability and performance has become crucial. Performance see...