This guide assumes you're using linux or some kind of OS with a shell, you can use Windows with some modifications.
Download the latest NanoPi R1, extract the 7z file.
Image will look something like nanopi-r1_eflasher_friendlywrt_4.14_armhf_20190826.img
to an sdcard.
sudo dd if=./nanopi-r1_eflasher_friendlywrt_4.14_armhf_20190826.img of=/dev/your_sd_card bs=4096
Insert the SD card, plugin the unit to MicroUSB and the USB to serial.
Use the board headers, not the UART. I could never get the UART to do anything.
Plug everything in and connect to your USB tty.
lsusb
Should show something like:
Bus 006 Device 008: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Then you can do:
sudo tio /dev/ttyUSB0
You'll want to hit [enter]
a couple of times to show the shell.
At the login prompt:
- Username: root
- Password: fa
When you get the the propmt run eflasher
and you'll be presented with a screen similar to the following.
Enter 1
to install, you may backup if you'd like.
Type yes
at this screen to do the install.
Finally you'll get to a prompt to reboot, shutdown, or continue. Input shutdown
.
Unplug your device and remove your SD card.
Plug your ethernet into LAN and power on the device.
ssh root@192.168.2.1
cd ~/
./setup.sh
This will do a basic DHCP connection for your ethernet.
From here you can login with LuCI.
From here you can go to your unit's ip address in your browser to open LuCI.
opkg update
opkg install fdisk kmod-fs-ext4 e2fsprogs swap-utils block-mount
Then insert your sdcard and find it.
fdisk -l
There will be several entries, you are looking for something like this. I'm using an 8GB SD card, it recognizes it as 7.2 GiB.
Disk /dev/mmcblk1: 7.2 GiB, 7746879488 bytes, 15130624 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: gpt
Disk identifier: 2FB1A165-A292-432E-8B58-F2E2C51BB656
Take note of the /dev/mmcblk1
or whatever yours shows. If you use the wrong one you can screw up your device.
If your SDCARD is currently mounted, you will need to unmount it to modify the partition table.
umount /dev/mmcblk1
If you are not mounted it'll show this error.
umount: can't unmount /dev/mmcblk1: Invalid argument
free
Should display something like this, note the swap currently shows 0 for all entries.
total used free shared buffers cached
Mem: 1025092 115444 909648 1728 2444 57876
-/+ buffers/cache: 55124 969968
Swap: 0 0 0
You will need to create two partitions on your SDCARD.
If your SDCARD already has a partition, it will show an error, which you can ignore.
fdisk /dev/mmcblk1
This section has several inputs which you'll need to make, I noted them in the code sections with ⟵⟵⟵.
Once in the fdisk
program it will prompt you with this. I recommend hitting m
to see the commands available.
Command (m for help):
Change type to gpt.
Command (m for help): g ⟵⟵⟵
Created a new GPT disklabel (GUID: 012345678-9ABCD-EF01-2345-56789ABCDEF0).
You'll probably want to start with F
to determine how much free space you have. I'm using an 8GB SDCARD, it shows:
Command (m for help): F ⟵⟵⟵
Unpartitioned space /dev/mmcblk0: 7.2 GiB, 7745830912 bytes, 15128576 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
Start End Sectors Size
2048 15130623 15128576 7.2G
Next up, create a 2GB
swap partition with the n command. You will need to make several entries.
Command (m for help): n ⟵⟵⟵
Partition number (1-128, default 1): 1 ⟵⟵⟵
First sector (34-15130590, default 2048): 2048 ⟵⟵⟵
Last sector, +sectors or +size{K,M,G,T,P} (2048-15130590, default 15130590): +2G ⟵⟵⟵
Created a new partition 1 of type 'Linux filesystem' and of size 2 GiB.
Now create the partition you'll use for /root
, again with the n
command, unless you are doing something special, you may just hit enter fore each of the prompts, I marked them anyway.
Command (m for help): n ⟵⟵⟵
Partition number (2-128, default 2): 2 ⟵⟵⟵
First sector (4196352-15130590, default 4196352): 4196352 ⟵⟵⟵
Last sector, +sectors or +size{K,M,G,T,P} (4196352-15130590, default 15130590): 15130590 ⟵⟵⟵
Created a new partition 2 of type 'Linux filesystem' and of size 5.2 GiB.
Set the swap
partition type to swap with the t
command. Again you will need to make several entries.
Command (m for help): t ⟵⟵⟵
Partition number (1,2, default 2): 1 ⟵⟵⟵
Partition type (type L to list all types): 19 ⟵⟵⟵
Changed type of partition 'Linux' to 'Linux swap'.
You may now print the partition table with the p
command to verify what you have done. It should show something like this.
Command (m for help): p ⟵⟵⟵
Disk /dev/mmcblk1: 7.2 GiB, 7746879488 bytes, 15130624 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: gpt
Disk identifier: 2FB1A165-A292-432E-8B58-F2E2C51BB656
Device Start End Sectors Size Type
/dev/mmcblk1p1 2048 4196351 4194304 2G Linux swap
/dev/mmcblk1p2 4196352 15130590 10934239 5.2G Linux filesystem
If all looks good, write the partition with the w
command.
Command (m for help): w ⟵⟵⟵
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
This will drop you back to the shell, run fdisk -l
again and you should see your partitions have changed and shows something like this.
Disk /dev/mmcblk1: 7.2 GiB, 7746879488 bytes, 15130624 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: gpt
Disk identifier: 2FB1A165-A292-432E-8B58-F2E2C51BB656
Device Start End Sectors Size Type
/dev/mmcblk1p1 2048 4196351 4194304 2G Linux swap
/dev/mmcblk1p2 4196352 15130590 10934239 5.2G Linux filesystem
Take note of your Linux swap
and Linux
partition Devices.
Format your Linux
partition as ext4.
mkfs.ext4 /dev/mmcblk1p2
This will take a minute and output something like the following.
mke2fs 1.44.1 (24-Mar-2018)
Discarding device blocks: done
Creating filesystem with 1366779 4k blocks and 342048 inodes
Filesystem UUID: f22e65c8-55a7-45f5-80bb-986e7c9a36e2
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
Format your Linux swap
partition and enable the swap
.
mkswap /dev/mmcblk1p1
swapon /dev/mmcblk1p1
Again use the free
command.
free -k
It should now show your updated swap space.
total used free shared buffers cached
Mem: 1025092 123108 901984 1728 2448 58268
-/+ buffers/cache: 62392 962700
Swap: 2097148 0 2097148
You may also use the swapon
command to show your swap space.
swapon -s
This should display something like this.
Filename Type Size Used Priority
/dev/mmcblk1p1 partition 2097148 0 -2
If you have anything in your /root
currently, move it to /tmp
.
mkdir /tmp/root_temp
mv /root/* /tmp/root_temp
ls -lah /root
Mount the drive and try writing to it.
mount /dev/mmcblk1p2 /root
cd /root
echo "test" > test.txt
cat test.txt
This should display test. Now you can move your stuff back from /tmp
to /root
.
mv /tmp/root_temp/* /root
rmdir /tmp/root_temp/
Enable the fstab.
/etc/init.d/fstab enable
Detect the mounts.
block detect > /etc/config/fstab
cat /etc/config/fstab
This should display something similar to this, take note of your uuid
, they are always different.
config 'global'
option anon_swap '0'
option anon_mount '0'
option auto_swap '1'
option auto_mount '1'
option delay_root '5'
option check_fs '0'
config 'mount'
option target '/mnt/mmcblk0p1'
option uuid 'YOUR_UUID_HERE"
option enabled '0'
config 'mount'
option target '/mnt/mmcblk0p2'
option uuid 'YOUR_UUID_HERE"
option enabled '0'
config 'mount'
option target '/mnt/mmcblk0p3'
option uuid 'YOUR_UUID_HERE"
option enabled '0'
config 'mount'
option target '/mnt/mmcblk1'
option uuid 'YOUR_UUID_HERE"
option enabled '0'
config 'swap'
option uuid 'YOUR_UUID_HERE"
option enabled '0'
config 'mount'
option target '/mnt/mmcblk1p2'
option uuid 'YOUR_UUID_HERE"
option enabled '0'
You'll want to edit the fstab.
vi /etc/config/fstab
Make it look like this.
config 'global'
option anon_swap '0'
option anon_mount '0'
option auto_swap '1'
option auto_mount '1'
option delay_root '5'
option check_fs '0'
config 'mount'
option target '/mnt/mmcblk0p1'
option uuid 'YOUR_UUID_HERE"
option enabled '1'
config 'mount'
option target '/mnt/mmcblk0p2'
option uuid 'YOUR_UUID_HERE"
option enabled '1'
config 'mount'
option target '/mnt/mmcblk0p3'
option uuid 'YOUR_UUID_HERE"
option enabled '1'
config 'mount'
option target '/mnt/mmcblk1'
option uuid 'YOUR_UUID_HERE"
option enabled '1'
config 'swap'
option uuid 'YOUR_UUID_HERE"
option enabled '1'
config 'mount'
option target '/root'
option uuid 'YOUR_UUID_HERE"
option enabled '1'
Test it, it should throw no error messages.
mount -a
Reboot and exit.
reboot && exit
SSH back into the unit and make sure the mount worked.
df -h
Should display something like this.
Filesystem Size Used Available Use% Mounted on
udev 512.0K 0 512.0K 0% /dev
tmpfs 100.1M 124.0K 100.0M 0% /run
overlay 6.7G 22.5M 6.4G 0% /
tmpfs 500.5M 636.0K 499.9M 0% /tmp
tmpfs 512.0K 0 512.0K 0% /dev
/dev/mmcblk0p3 6.7G 22.5M 6.4G 0% /mnt/mmcblk0p3
/dev/mmcblk0p1 39.9M 11.3M 28.6M 28% /mnt/mmcblk0p1
/dev/mmcblk1p2 5.1G 21.5M 4.8G 0% /root
/dev/mmcblk0p1 39.9M 11.3M 28.6M 28% /boot
Then check the swap.
swapon -s
Should still display something like this.
Filename Type Size Used Priority
/dev/mmcblk1p1 partition 2097148 0 -2
opkg update
opkg install libustream-openssl ca-bundle ca-certificates
# INSTALL BASH
opkg update
opkg install bash
# SET SHELL TO BASH
sed -i 's/\/ash/\/bash/' /etc/passwd
opkg install nano vim-full
opkg install usbutils pciutils coreutils
You can view these in LuCI Statistics ⟶ Graphs.
opkg install collectd collectd-mod-rrdtool rrdtool1
opkg list |grep collectd-mod
opkg install collectd-mod-cpu
opkg install collectd-mod-df collectd-mod-disk
mkdir ~/bin
wget https://raw.githubusercontent.com/dylanaraps/neofetch/master/neofetch -O ~/bin/neofetch
chmod +x ~/bin/neofetch
Create your local bin.
mkdir ~/bin
Touch your profile.
touch ~/.profile
Edit it.
vi ~/.profile
Add some stuff to it.
~/bin/neofetch
alias l='ls -lah'
export PATH=~/bin:$PATH
Source it, this applies the changes you made.
source ~/.profile
mkdir ~/.ssh
dropbearkey -t rsa -f ~/.ssh/id_rsa
dropbearkey -y -f ~/.ssh/id_rsa | sed -n 2p > ~/.ssh/id_rsa.pub
All ssh keys go in:
/etc/dropbear/authorized_keys
Upgrading some packages such as netifd
may cause the unit to have problems.
opkg update
opkg list-upgradable
opkg upgrade opkg
opkg install git git-http
If you have a git account, put your ssh key into your account. Go to GitHub's SSH keys page.
cat ~/.ssh/id_rsa.pub
Copy and paste the out put into GitHub, do not make this public.
You can clone stuff with git via https, but I didn't want to do that for reasons.
With the NanoPi by default you'll get an unfriendly message if you try to ssh into github.
ssh git@github.com
ssh: Connection to git@github.com:22 exited: No auth methods could be used.
What does this mean? From what I've read it means it isn't using your generated ssh key to login, because OpenWRT uses dropbear's ssh instead of OpenSSH.
This section is largely derived from this answer on stackoverflow.
Normally you should be able to ssh into github as shown above, it won't give you a shell, but it will give you a friendly message.
You can ssh
specifying your user's specific id_rsa
key and get the friendly authentication message.
ssh -i ~/.ssh/id_rsa git@github.com
Hi pjobson! You've successfully authenticated, but GitHub does not provide shell access.
Get the ssh-git
script in this repo.
wget https://gist.githubusercontent.com/pjobson/95b67bc4f17c2f60278ec40bf15ca99d/raw/91f4dcaee3afe5c321899b6d656a0c8ff9fcc45b/ssh-git.sh -O ~/bin/ssh-git
chmod +x ~/bin/ssh-git
Edit your .profile
.
vi ~/.profile
Add these exports, replace your info where relevant.
export GIT_SSH=~/bin/ssh-git
export GIT_AUTHOR_NAME="USER NAME"
export GIT_AUTHOR_EMAIL="user@email.address"
export GIT_COMMITTER_NAME=$GIT_AUTHOR_NAME
export GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL
Now try to clone this gist.
git clone git@gist.github.com:95b67bc4f17c2f60278ec40bf15ca99d.git