Remounting a read-only filesystem on Android

Following on from my last post, I figured that copying the hosts file from my laptop to my phone would be a very good idea. In principle, this is just a case of getting the file onto my phone and then copying it to /etc/hosts.

Obviously, I need root access to do this but, with a Fairphone 1 this is not a problem.

What did catch me out, though, is that /system is mounted as a read only file system. It’s not difficult to get around, but I am noting it here so I can easily look up the steps when I next do this.

# mount -o rw,remount /system
# cp /storage/sdcard0/Download/hosts /etc
# mount -o ro,remount /system

For other phones, some pathnames may vary.

Unified hosts file with base extensions

Using the /etc/hosts file to block malicious sites at the operating system level is an effective way of ensuring that none of your applications will access any of these sites, ever, and has the advantage of removing the need for a separate browser plugin for every browser you might possibly use. But maintaining the /etc/hosts file involves doing work and this is where Steven Black‘s hosts comes in handy.

This repository consolidates several reputable hosts files, and merges them into a unified hosts file with duplicates removed. This repo provides several hosts files tailored to you need to block.

Using it is simple. Clone the repository, update the myhosts file with any custom host records you may have, and add any domains you don’t want to block to the whitelist. Then build your hosts file:

python updateHostsFile.py

There are a number of switches you can use (all of which are documented in the readme file) which allow you to control which types of sites to block and whether you want to automatically replace your existing /etc/hosts file.

This all works very nicely indeed, but I’m lazy. So I knocked together a short script to grab any updates from the repository and rebuild my hosts file:

#! /bin/bash
# Automatically update hosts file

# Change to the correct folder and do a git pull
cd /home/paul/Stuff/hosts
git pull origin master

# And update the hosts file
python updateHostsFile.py -a -r

And put it in /usr/local/bin.

This means I can use a systemd service and timer to execute this every Saturday afternoon.

[Unit]
Description=Auto-update hosts file

[Service]
Type=oneshot
Environment=DISPLAY=:0
ExecStart=/usr/local/bin/hosts
StandardOutput=journal

[Install]
WantedBy=basic.target
[Unit]
Description=Auto Update Hosts File

[Timer]
OnCalendar=Sat 14:00:00
Persistent=true
Unit=hosts.service

[Install]
WantedBy=basic.target

And, so far, it all appears to be working very nicely indeed.