Raspberry Pi — Hardware and Background
Raspberry Pi Background
The Raspberry Pi is a small single-board computer. It runs a variety of operating systems, most prominently several Linux distributions and Linux-derived systems including Android, Firefox OS and Google Chrome OS, as well as RISC OS, FreeBSD, NetBSD, Plan 9, Haiku and AROS. It doesn't cost very much, and is capable of a great deal for such a small package. The latest models include a quad-core processor, 8 GB of RAM, Gigabit Ethernet, USB 3, WiFi, and Bluetooth. It's about the size of two decks of cards stacked together, and you plug it into any HDMI display.
It was developed by a charitable organization in the UK, supported by the University of Cambridge Computer Laboratory and Broadcom. The Raspberry Pi was initially intended for teaching basic computer science in schools. Eben Upton, a co-founder of the project, explained the need for the project in 2012:
"[T]he lack of programmable hardware for children — the sort of hardware we used to have in the 1980s — is undermining the supply of eighteen-year-olds who know how to program, so that's a problem for universities, and then it's undermining the supply of 21 year olds who know how to program, and that's causing problems for industry."
The Raspberry Pi is manufactured and sold online by Newark element14 in the US, RS Components in the UK, and Egoman in Taiwan. Egoman's version with a red circuit board without the FCC/CE marks is distributed solely in China and Taiwan.
The Raspberry Pi 1 had a single-core ARM1176JZF-S processor. Early versions of the Raspberry Pi 2 had a 900 MHz quad-core ARM Cortex-A7. Later model 2 designs had a faster quad-core CPU, and the Raspberry Pi 3 had a faster one yet.
Hardware
A Model B is shown above. The available models and their differences are:
Feature | Model | ||||||
1 A | 1 B | 1 B+ | 2 | Zero W | 3 B | 3 B+ | |
CPU cores | 1 | 1 | 1 | 4 | 1 | 4 | 4 |
CPU clock | 700 MHz | 700 MHz | 700 MHz | 900 MHz | 1.0 GHz | 1.4 GHz | 1.4 GHz |
USB 2.0 ports | 1 | 2 | 4 | 4 | 1 | 4 | 4 |
10/100 Mbps Ethernet ports |
0 | 1 | 1 | 1 | 0 | 1 | 0 |
10/100/1000 Mbps Ethernet ports |
0 | 0 | 0 | 0 | 0 | 0 | 1 |
WiFi & Bluetooth |
no | no | no | no | yes | yes | yes |
RAM | 256 MB | 256 MB | 512 MB | 1024 MB | 512 MB | 1024 MB | 1024 MB |
Storage | SD/MMC/SDIO | SD/MMC/SDIO | MicroSDHC | MicroSDHC | MicroSDHC | MicroSDHC | MicroSDHC |
Power @5V DC | 1.5 W 300 mA |
3.5 W 700 mA |
3.0 W 600 mA |
4.0 W 800 mA |
1.75 W 350 mA |
5.7-6.7 W 1.13-1.34 A |
5.7-6.7 W 1.13-1.34 A |
Board
The Raspberry Pi board measures 86 × 54 mm, just a little too large for an Altoids Tin, and it is powered by a smart phone charger supplying 5 V DC at up to 700 mA.
The Raspberry Pi model 1 system was based around the Broadcom BCM2835 system on a chip (or SoC), which was designed as a cost-optimized, full-HD, multimedia applications processor for mobile and embedded applications. This includes a low-power ARM1176JZ-F processor running at 700 MHz and a dual-core OpenGL-ES VideoCore IV GPU or multimedia co-processor.
The Raspberry Pi 2 and 3 used a Broadcom BCM2837 SoC and a BCM2837B0 SoC, respectively, with a 1.2 GHz (model 2) and 1.4 GHz (model 3) 64-bit quad-core ARM Cortex-A53 processor with 1 GB of RAM. That provides the model 3 with about 10 times the performance of the Model 1.
Interfaces
The multimedia capability means that this small system supports 1080p30 full HD output over an HDMI connector. Other connectors provide:
- USB 2.0 ports
- Composite video (PAL and NTSC) output through an RCA connector
- Audio output through a 3.5 mm jack
- 10/100 Mbps Ethernet, 1 Gbps on the 3 B+ model
- A number of low-level peripherals are also available, including eight GPIO lines, a UART, an I2C bus, and SPI bus, and I2S audio.
Let's ask the kernel to examine the CPU on an old model 1.
pi@raspberrypi ~ $ cat /proc/cpuinfo Processor : ARMv6-compatible processor rev 7 (v6l) BogoMIPS : 464.48 Features : swp half thumb fastmult vfp edsp java tls CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x0 CPU part : 0xb76 CPU revision : 7 Hardware : BCM2708 Revision : 000e Serial : 000000002469bebb pi@raspberrypi ~ $ lscpu Architecture: armv6l Byte Order: Little Endian CPU(s): 1 On-line CPU(s) list: 0 Thread(s) per core: 1 Core(s) per socket: 1 Socket(s): 1
You can check the kernel and firmware versions with two
commands, the second of which must be run as root
:
root@raspberrypi: ~ $ uname -a Linux raspberrypi 3.6.11+ #371 PREEMPT Thu Feb 7 16:31:35 GMT 2013 armv6l GNU/Linux root@raspberrypi: ~ $ sudo /opt/vc/bin/vcgencmd version Sep 1 2013 23:31:02 Copyright (c) 2012 Broadcom version 4f9d19896166f46a3255801bc1834561bf092732 (clean) (release)
Here's the same sequence on a model 3 B+.
pi@raspberrypi ~ $ cat /proc/cpuinfo processor : 0 model name : ARMv7 Processor rev 4 (v7l) BogoMIPS : 76.80 Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x0 CPU part : 0xd03 CPU revision : 4 processor : 1 model name : ARMv7 Processor rev 4 (v7l) BogoMIPS : 76.80 Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x0 CPU part : 0xd03 CPU revision : 4 processor : 2 model name : ARMv7 Processor rev 4 (v7l) BogoMIPS : 76.80 Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x0 CPU part : 0xd03 CPU revision : 4 processor : 3 model name : ARMv7 Processor rev 4 (v7l) BogoMIPS : 76.80 Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x0 CPU part : 0xd03 CPU revision : 4 Hardware : BCM2835 Revision : a22082 Serial : 00000000f0036b37 pi@raspberrypi ~ $ lscpu Architecture: armv7l Byte Order: Little Endian CPU(s): 4 On-line CPU(s) list: 0-3 Thread(s) per core: 1 Core(s) per socket: 4 Socket(s): 1 Model: 4 Model name: ARMv7 Processor rev 4 (v7l) CPU max MHz: 1200.0000 CPU min MHz: 600.0000 BogoMIPS: 76.80 Flags: half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32
pi@raspberrypi ~ $ uname -a Linux kodi 4.14.78-4-osmc #1 SMP PREEMPT Wed Dec 12 17:58:11 UTC 2018 armv7l GNU/Linux pi@raspberrypi ~ $ /opt/vc/bin/vcgencmd version Oct 23 2018 14:41:50 Copyright (c) 2012 Broadcom version 724d81b3f87eb71045e938e572eca140fb8828ab (clean) (release)
Would the Raspberry Pi be a good platform for tasks like password cracking, rainbow table construction, or Bitcoin mining?
No, not especially. It can do those things, but it can't do them fast enough for it to make much sense to use this platform for any of those tasks.
I have a simple program that starts with a
20-byte array filled with zeros.
That is, a 160 bit array of zeros.
That is used as the input to the SHA1()
OpenSSL library call.
The return value is then used as the input to the next
call, repeating this cycle 100,000,000 times.
The clock()
function is then used to
determine the CPU time used by the process,
and that time plus the input and output of
the last SHA-1 calculation are printed.
On my system with an AMD Phenom II X4 965 processor and a 3400.000 MHz clock system I see the following, where the process runs on just one of the four available cores yielding about 3.66 million hashes per second:
Loop: 100000000 CPU time: 27.340s input = 0xeebc8597eba9eb078de1b13ff6171df8beb52d45 hash = 0x529f8309ff191b501fd086425cacb8866955ca9d
My Raspberry Pi can only calculate about 0.221 million hashes per second:
Loop: 100000000 CPU time 452.160s input = 0xeebc8597eba9eb078de1b13ff6171df8beb52d45 hash = 0x529f8309ff191b501fd086425cacb8866955ca9d
That's a hash computation speed of just about 6% or
1/16.5 that of the single core of the desktop machine.
An array of 17 Raspberry Pis could just barely exceed
the speed of a single core on the desktop,
but at a cost of:
17 × US$ 35 = US$ 595
The CPU can be overclocked to 1000 MHz, but the result
is still much slower than a typical IA32/IA64 CPU.
Dell is working on an
ARM-based supercomputer,
but not in the form of a Raspberry Pi array!
Also compare these hash rates to those of typical Bitcoin mining hardware.
The BogoMIPS estimate found in /proc/cpuinfo
seems pretty useful.
The desktop reports 6831.31 while the Raspberry Pi
reports 464.48.
That's a ratio of 1:14.7074 while the SHA-1 timing
ratio is 1:16.5384.
Along these same lines, the BOINC client can be installed on the Raspberry Pi. However, it won't accomplish but a tiny fraction of one core on a typical desktop, and few of the BOINC projects have ARM packages to be run.
But the Raspberry Pi is still very useful for security related tasks!
Password cracking is very CPU intensive, and rainbow table construction and Bitcoin mining even more so. I only measured its SHA-1 calculation speed because I had seen people asking these questions on line.
A Raspberry Pi does, however, make a very nice platform for tasks like hash harvesting and network intrusion detection! It can also be a nicely compact and portable OpenVAS scanner.
Are any more CPU details easily found?
Not a lot, but the kernel ring buffer can be displayed
with the dmesg
command:
pi@raspberrypi /proc $ dmesg [ 0.000000] Booting Linux on physical CPU 0 [ 0.000000] Initializing cgroup subsys cpu [ 0.000000] Linux version 3.6.11+ (dc4@dc4-arm-01) \ (gcc version 4.7.2 20120731 (prerelease) \ (crosstool-NG linaro-1.13.1+bzr2458 - Linaro GCC 2012.08) ) \ #371 PREEMPT Thu Feb 7 16:31:35 GMT 2013 [ 0.000000] CPU: ARMv6-compatible processor [410fb767] revision 7 (ARMv7), cr=00c5387d [ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache [ 0.000000] Machine: BCM2708 ....
Memory
The RAM is shared with the GPU.
You can configure how much is reserved for the GPU
with the interactive raspi-config
tool.
The rest is available for processes and the kernel itself,
including its file system I/O buffering.
pi@raspberrypi /proc $ dmesg .... [ 0.000000] cma: CMA: reserved 16 MiB at 1b000000 [ 0.000000] Memory policy: ECC disabled, Data cache writeback [ 0.000000] On node 0 totalpages: 114688 [ 0.000000] free_area_init_node: node 0, pgdat c053b834, node_mem_map c05e5000 [ 0.000000] Normal zone: 896 pages used for memmap [ 0.000000] Normal zone: 0 pages reserved [ 0.000000] Normal zone: 113792 pages, LIFO batch:31 .... [ 0.000000] Memory: 448MB = 448MB total [ 0.000000] Memory: 432264k/432264k available, 26488k reserved, 0K highmem [ 0.000000] Virtual kernel memory layout: [ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB) [ 0.000000] fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB) [ 0.000000] vmalloc : 0xdc800000 - 0xff000000 ( 552 MB) [ 0.000000] lowmem : 0xc0000000 - 0xdc000000 ( 448 MB) [ 0.000000] modules : 0xbf000000 - 0xc0000000 ( 16 MB) [ 0.000000] .text : 0xc0008000 - 0xc04e5470 (4982 kB) [ 0.000000] .init : 0xc04e6000 - 0xc0506f24 ( 132 kB) [ 0.000000] .data : 0xc0508000 - 0xc053c060 ( 209 kB) [ 0.000000] .bss : 0xc053c084 - 0xc05e4738 ( 674 kB) ....
Networking Hardware
We will examine the networking hardware here. See the networking page for the details of configuring the Raspberry Pi for both wired Ethernet and 802.11i, or 802.11 WLAN with WPA2 security.
The on-board Ethernet is actually a built-in USB Ethernet interface combined with the USB controller. The Ethernet controller appears as device number 3 on USB. In the following output you will see that I have also plugged in an ASUSTek USB 802.11n interface.
pi@raspberrypi /proc $ lsusb Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. Bus 001 Device 004: ID 0b05:1786 ASUSTek Computer, Inc. USB-N10 802.11n Network pi@raspberrypi /proc $ lsusb -t /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=dwc_otg/1p, 480M |__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/3p, 480M |__ Port 1: Dev 3, If 0, Class=vend., Driver=smsc95xx, 480M |__ Port 3: Dev 4, If 0, Class=vend., Driver=r8712u, 480M
pi@raspberrypi /proc $ dmesg .... [ 1.364017] usbcore: registered new interface driver smsc95xx .... [ 2.382258] usb 1-1: new high-speed USB device number 2 using dwc_otg [ 2.391783] Indeed it is in host mode hprt0 = 00001101 [ 2.602531] usb 1-1: New USB device found, idVendor=0424, idProduct=9512 [ 2.611427] usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0 [ 2.621454] hub 1-1:1.0: USB hub found [ 2.628838] hub 1-1:1.0: 3 ports detected [ 2.912583] usb 1-1.1: new high-speed USB device number 3 using dwc_otg [ 3.022834] usb 1-1.1: New USB device found, idVendor=0424, idProduct=ec00 [ 3.032317] usb 1-1.1: New USB device strings: Mfr=0, Product=0, SerialNumber=0 [ 3.050650] smsc95xx v1.0.4 [ 3.127019] smsc95xx 1-1.1:1.0: eth0: register 'smsc95xx' at usb-bcm2708_usb-1.1, smsc95xx USB 2.0 Ethernet, b8:27:eb:69:be:bb [ 3.222472] usb 1-1.3: new high-speed USB device number 4 using dwc_otg [ 3.355515] usb 1-1.3: New USB device found, idVendor=0b05, idProduct=1786 [ 3.372276] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 3.381759] usb 1-1.3: Product: ASUS EZ N Network Adapter [ 3.406430] usb 1-1.3: Manufacturer: Manufacturer Realtek [ 3.431282] usb 1-1.3: SerialNumber: 00e04c000001 ....
The Asus USB-N10 wireless network device is recognized
by the r8712u
kernel module.
If your installed distribution does not include the
firmware-realtek
package, install it:
# apt-get install firmware-realtek
Firmware is stored in the /lib/firmware
directory.
pi@raspberrypi /proc $ dmesg .... [ 5.028951] r8712u: module is from the staging directory, the quality is unknown, you have been warned. [ 5.311932] r8712u: Staging version [ 5.572398] r8712u: register rtl8712_netdev_ops to netdev_ops [ 5.580397] r8712u: USB_SPEED_HIGH with 4 endpoints [ 5.892308] r8712u: Boot from EFUSE: Autoload OK [ 6.943016] r8712u: CustomerID = 0x0010 [ 6.948984] r8712u: MAC Address from efuse = 08:60:6e:63:7b:80 [ 6.956936] r8712u: Loading firmware from "rtlwifi/rtl8712u.bin" [ 6.970145] usbcore: registered new interface driver r8712u ....
Power, Storage and Operating System
A micro USB cable connected to something like a smart phone charger provides power. Even for the old Model 1 units you need a charger module that can provide a solid 1 A or 1000 mA.
You need a quality SD memory card. Or, much more likely, Micro SD in an SD adapter. You will need a bare minimum of 2 GB of flash storage for the bootable OS, but you will probably want at least 8 GB.
Download the Raspbian OS image,
unzip it, and write the resulting *.img
file onto
the flash card using the dd
command on Linux or OS X.
At your first boot, df
will show that
your disk is just 2 GB in size because you're using
the 2 GB image.
If you are using the
Raspian
image, you can use the interactive
raspi-config
tool and
select the expand_rootfs
option to
expand the file system to fill the available space
on the device.
You can do this manually using
an image without the
raspi-config
tool.
For example, the Fedora-based
Pidora.
Here is what we see with a 2 GB
Pidora
image installed with
dd
on an 8 GB MicroSD chip.
The root file system is 100% full, but it is in a partition
that can be expanded to fill the rest of the disk.
Notice that it has 15,564,800 sectors but only the first
4,322,960 are in use.
# fdisk -l Disk Disk /dev/mmcblk0: 7.4 GiB, 7969177600 bytes, 15564800 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x0009c1ec Device Boot Start End Blocks Id System /dev/mmcblk0p1 * 2048 104447 51200 c W95 FAT32 (LBA) /dev/mmcblk0p2 104448 4233960 2064756+ 83 Linux
Let's manually expand it that second partition.
Command input is in
bold
and a blue box
indicates where you simply press <Enter>
to accept the default.
[root@pidora boot]# fdisk /dev/mmcblk0 Welcome to fdisk (util-linux 2.24.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): d Partition number (1,2, default 2):Partition 2 has been deleted. Command (m for help): n Partition type: p primary (1 primary, 0 extended, 3 free) e extended Select (default p): p Partition number (2-4, default 2):
First sector (104448-15564799, default 104448):
Last sector, +sectors or +size{K,M,G,T,P} (104448-15564799, default 15564799): Created a new partition 2 of type 'Linux' and of size 7.4 GiB. Command (m for help): p Disk /dev/mmcblk0: 7.4 GiB, 7969177600 bytes, 15564800 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x0009c1ec Device Boot Start End Blocks Id System /dev/mmcblk0p1 * 2048 104447 51200 c W95 FAT32 (LBA) /dev/mmcblk0p2 104448 15564799 7730176 83 Linux Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Re-reading the partition table failed.: Device or resource busy The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8) # fdisk -l Disk /dev/mmcblk0: 7.4 GiB, 7969177600 bytes, 15564800 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x0009c1ec Device Boot Start End Blocks Id System /dev/mmcblk0p1 * 2048 104447 51200 c W95 FAT32 (LBA) /dev/mmcblk0p2 104448 15564799 7730176 83 Linux
Notice that the second partition has grown from 2,065,769 (plus a fraction) to 7,730,176 blocks, and the sectors in use extend to the end of the disk.
I tried using partprobe
to force the kernel
to detect the new partition table, but it wouldn't as it
involved the partition holding the root file system.
Reboot to continue.
Now you can grow the root file system to fill the larger partition.
# resize2fs /dev/mmcblk0p2
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/mmcblk0p2 is mounted on /; on-line resizing required
Performing an on-line resize of /dev/mmcblk0p2 to 7730176 (1k) blocks.
The filesystem on /dev/mmcblk0p2 is now 7730176 blocks long.
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 7.2G 1.9G 5.1G 27% /
devtmpfs 218M 0 218M 0% /dev
tmpfs 218M 0 218M 0% /dev/shm
tmpfs 218M 292K 218M 1% /run
tmpfs 218M 0 218M 0% /sys/fs/cgroup
tmpfs 218M 4.0K 218M 1% /tmp
/dev/mmcblk0p1 50M 23M 28M 45% /boot
Interfaces
HDMI and Power
The HDMI connector is at the center of one long edge of the card, the bottom if you use align the card so the Raspberry Pi logo is upright.
The Micro USB connector providing the power is then at the lower left. It is for power only, the +5 V and ground lines are connected but the data lines are not.
Ethernet and USB
This is a Model 1 B, with one 10/100 Mbps Ethernet port and two USB ports.
If you need to use more than two low-power USB devices, or any device that needs more than about 100 mA of power, or if you need to support hot-plugging, use a small powered USB hub.
Analog and Video, and GPIO
Analog audio output is provided through a 3.5 mm jack, seen here with a light blue body.
Composite video (PAL and NTSC) output is provided through an RCA connector, seen here with a yellow body.
The GPIO and other I/O pins continue along the edge of the board from the analog video connector to the corner. This is a 2x13 pin 2.54 mm header expansion.
Status LEDs | |||
D5 | Green | ACT | SDCard Access |
D6 | Red | PWR | 3.3 V Power |
D7 | Green | FDX | LAN Full Duplex |
D8 | Green | LNK | LAN Link/Activity |
D9 | Yellow | 100 | LAN 10/100 Mbit |
BIOS and PCI Bus
The platform has neither of these, so lspci
fails as there is no /proc/bus/pci
to read.
Without a BIOS, dmidecode
has nothing to do
and isn't built for the ARM platform.