# Arch Linux ARMv7 on Raspberry Pi 3 Installation Guide Ref: [Arch Linux ARM](https://archlinuxarm.org/platforms/armv8/broadcom/raspberry-pi-3), [theramiyer](https://gist.github.com/theramiyer/cb2b406128e54faa12c37e1a01f7ae15) ## Make Bootable SD card Connect your SD card into your computer. You have to **login as root** to do the following step, not via sudo. ```bash= sudo su ``` ### Partition Start `cfdisk` to partition the SD card. ```bash= cfdisk /dev/sdX ``` We suggest the following size for each partition. | Mount point | Partition | Partition type | Suggested size | | ----------- | --------------------------- | -------------------- | ----------------------- | | /boot | /dev/*efi_system_partition* | EFI system partition | 200MiB | | /root | /dev/*root_partition* | Linux ARM root (/) | Remainder of the device | ### Format Create and mount the EFI/FAT filesystem. ```bash= mkfs.vfat /dev/sdX1 mkdir boot mount /dev/sdX1 boot ``` Create and mount the ext4 filesystem. ```bash= mkfs.ext4 /dev/sdX2 mkdir root mount /dev/sdX2 root ``` ### Download Linux Kernel Download and extract the root filesystem (Again, as **root**, not via sudo) ```bash= wget http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-armv7-latest.tar.gz bsdtar -xpf ArchLinuxARM-rpi-armv7-latest.tar.gz -C root sync ``` The `sync` writes any data buffered in memory out to disk. This can include (but is not limited to) modified superblocks, modified inodes, and delayed reads and writes. ### Boot sector Move boot files to the first partition. ```bash= mv root/boot/* boot ``` Unmount the two partitions. ```bash= umount boot root ``` ## Boot from Raspberry Pi 3 Insert the SD card into the Raspberry Pi, connect ethernet if your Raspberry has RJ45, and apply 5V power. ## Login as the Default User Default user: username: alarm password: alarm Default root password: root Notice that we haven't complete the installation yet, **you can NOT login as root directly right now.** The user alarm has root privilege. Now we don't have `sudo` yet. **Type `su` to use root.** ## Connect to WiFi (if you don't have Ethernet) 1. Navigate to /etc/wpa_supplicant. 2. Create a new file called anything of your choice. ```bash= nano home-network ``` 3. Enter the following in the file: ```bash= network={ ssid="YOURSSID" psk="YOURWIFIPASSWORD" } ``` 4. Now, run the following command to connect to your WiFi. ```bash= wpa_supplicant -i wlan0 /etc/wpa_supplicant/home-network & ``` 5. Your device should now connect to the Wifi. The next step is to get a DHCP address. ```bash= dhcpcd wlan0 ``` Once the command completes, you should get your prompt back. Ping any domain on the web to see if you're connected. ## Connect via SSH (Optional) Arch Linux allows SSH by default. If you would like to connect to the Pi using SSH from your personal computer instead of attaching a keyboard and a mouse and HDMI and everything, by all means, please do. ## Setup swap (Optional) 1. Setup the swapfile. ```bash= fallocate -l 1024M /swapfile chmod 600 /swapfile mkswap /swapfile swapon /swapfile echo 'vm.swappiness=1' > /etc/sysctl.d/99-sysctl.conf ``` 2. Configure fstab with the swap entry. ```bash= /swapfile none swap defaults 0 0 ``` ## Setup Pacman ### Color and Parallel Download (Optional) Uncomment the following command to activate it. ``` # /etc/pacman.conf ------------------------------------ Color ParallelDownloads = 5 ``` ``` # /etc/makepkg.conf ------------------------------------ MAKEFLAGS="-j4" ``` ### Install Keyring ```bash= pacman-key --init pacman-key --populate archlinuxarm pacman -Sy pacman pacman -S archlinux-keyring ``` ## Install Essential Package ```bash= pacman -S base base-devel linux linux-headers linux-firmware vim git networkmanager wget ncdu htop p7zip zip unzip bat wget go ntp python-pip zsh tig openssh tmux terminus-font ``` ## Sudoer Type `visudo`, uncomment `%wheel ALL=(ALL) ALL`. Add user to group wheel. ```bash= usermod -a -G wheel alarm ``` ## Localization Uncommit `en_US.UTF-8 UTF-8` and others language you need in `/etc/locale.gen`. Generate the locales by executing: ```bash= locale-gen ``` Create the locale.conf file, and set the LANG variable accordingly: ```bash= vim /etc/locale.conf LANG=en_US.UTF-8 ``` Note that `tmux` needs `en_US.UTF-8` locale. ## Network Configuration Create the hostname file: ```bash= vim /etc/hostname <myhostname> ``` Add matching entries to hosts: ```bash= vim /etc/hosts 127.0.0.1 localhost ::1 localhost 127.0.1.1 myhostname.localdomain myhostname ``` If the system has a permanent IP address, it should be used instead of 127.0.1.1. # Let Your Raspberry Pi be Better to Use ## Enable NetworkManager The default app in Raspberry Pi is `wpa_supplicant`. We strongly suggest you to use NetworkManager. ```bash= systemctl enable --now NetworkManager.service ``` Then, just type ```bash= nmtui ``` to configure network. ## Install yay Yet Another Yogurt - An AUR Helper Written in Go ```bash= sudo pacman -S base-devel cd /opt sudo git clone https://aur.archlinux.org/yay.git sudo chown -R pablinux:users ./yay cd yay makepkg -si ``` ## Connect to FRP server FRP is a *fast reverse proxy* that allows you to expose a local server located behind a NAT or firewall to the Internet. It currently supports TCP and UDP, as well as HTTP and HTTPS protocols, enabling requests to be forwarded to internal services via domain name. ```bash= yay -S frpc ``` Modify `/etc/frp/frpc.ini` on Raspberry Pi and set the `server_addr` field to the public IP address of your frps server. We assume that your FRP server uses `fp-multiuser` plugin. ``` [common] server_addr = x.x.x.x server_port = 7000 user = YOUR_USER_NAME meta_token = YOUR_TOKEN [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = YOUR_REMOTE_PORT ``` Enable the service ``` systemctl enable --now frpc.service ``` Now, you can type the following command to connect to Raspberry Pi via SSH. ```bash= ssh alarm@x.x.x.x -p YOUR_REMOTE_PORT ``` ## Wake On Lan You can use Raspberry Pi to do WOL. ```bash= wol --verbose --port=9 xx:xx:xx:xx:xx:xx ``` To check the target machine receives the package correctly, type the following command: ```bash= sudo tcpdump -i INTERFACE '(udp and port 9) or (udp and port 7)' -vv -X ``` You can set to execute WOL while logging. If you are using zsh, the logging script should be written in `~/.zprofile`. ## Console Font [Reference: GitHub](https://gist.github.com/danielcbaldwin/0eb3def2478150b32ad27280f8a937fb) ## CPU Stress Test Install the following program ```bash= pacman -S s-tui stress ``` and use `s-tui` to stress the CPU.