mirror of https://github.com/CIRCL/Circlean
Update readme, changelog, and contributing
parent
a2f2d39582
commit
58ae576343
|
@ -1,6 +1,9 @@
|
||||||
Version 2.1 - 2017-02-XX
|
Version 2.1 - 2017-02-XX
|
||||||
- Updated to the newest version of Raspbian Jessie lite (January 11th 2017 release)
|
- Updated to the newest version of Raspbian Jessie lite (January 11th 2017 release)
|
||||||
- NTFS files can be mounted
|
- NTFS files can now be mounted as source or destination keys
|
||||||
|
- Added udev rules that ensure the USB ports map deterministically to source and destination keys
|
||||||
|
- New debug flag and debug logging functionality to make working on Circlean without a monitor easier
|
||||||
|
- Turned off automatic display sleep
|
||||||
|
|
||||||
Version 2.0.2 - 2016-05-12
|
Version 2.0.2 - 2016-05-12
|
||||||
- Improve filename encoding
|
- Improve filename encoding
|
||||||
|
|
|
@ -1,17 +1,52 @@
|
||||||
Building the project
|
Getting started
|
||||||
====================
|
===============
|
||||||
|
|
||||||
To get started contributing to Circlean, first, fork the project and `git clone`
|
If you'd like to work on the Python code that processes files for Circlean, you should
|
||||||
your fork. Then, follow the instructions in [README_setup.md](README_setup.md)
|
take a look at [PyCIRCLean](https://github.com/CIRCL/PyCIRCLean), specifically the
|
||||||
to build an image.
|
filecheck.py script. To get started contributing to Circlean, first, fork the project and
|
||||||
|
`git clone` your fork. Then, follow the instructions in [setup_with_proot.md](doc/
|
||||||
|
setup_with_proot.md) to build an image. To make things easier, you can also download a
|
||||||
|
prebuilt image as mentioned in the README, and then mount and make modifications to this
|
||||||
|
image to test your changes.
|
||||||
|
|
||||||
The issue tracker
|
The issue tracker
|
||||||
=================
|
=================
|
||||||
|
|
||||||
If you find a bug or see a problem with PyCIRCLean, please open an issue in the Github
|
If you find a bug or see a problem with PyCIRCLean, please open an issue in the Github
|
||||||
repo. We'll do our best to respond as quickly as possible. Also, feel free to contribute a solution
|
repo. We'll do our best to respond as quickly as possible. Also, feel free to contribute a
|
||||||
to any of the open issues - we'll do our best to review your pull request in a timely manner.
|
solution to any of the open issues - we'll do our best to review your pull request in a
|
||||||
This project is in active development, so any contributions are welcome!
|
timely manner. This project is in active development, so any contributions are welcome!
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
============
|
||||||
|
* Timidity for playing midi files
|
||||||
|
* Git for installing some Python dependencies
|
||||||
|
* 7Zip for unpacking archives
|
||||||
|
* Pmount and ntfs-3g for mounting usb key partitions
|
||||||
|
* Python 3 and pip for installing and running Python dependencies
|
||||||
|
* Python3-lxml for handling ooxml and other Office files in filecheck.py
|
||||||
|
* libjpeg-dev libtiff-dev libwebp-dev liblcms2-dev tcl-dev for various image formats (
|
||||||
|
dependencies for pillow)
|
||||||
|
* Exifread for file metadata
|
||||||
|
* Pillow for handling images
|
||||||
|
* Olefile, oletools, and officedissector for handling various Office filetypes
|
||||||
|
* PyCIRCLean for main file handling code
|
||||||
|
|
||||||
|
Helper scripts
|
||||||
|
==============
|
||||||
|
|
||||||
|
Use the scripts in shell_utils/ as examples - do not run them blindly as you will most
|
||||||
|
probably have to change some constants/paths accordingly to your configuration.
|
||||||
|
|
||||||
|
IN ALL CASES, PLEASE READ THE COMMENTS IN THE SCRIPTS AT LEAST ONCE.
|
||||||
|
|
||||||
|
* proper_chroot.sh: uses qemu to chroot into a raspbian instance (.img or SD Card)
|
||||||
|
* prepare_rPI.sh: update the system, some configuration
|
||||||
|
* create_user.sh: create the user who will run the scripts, assign the proper sudo rights.
|
||||||
|
* copy_to_final.sh: populate the content of the directory fs/ in the image,
|
||||||
|
contains a sample of dd command to write the image on the SD card.
|
||||||
|
NOTE: TAKE CARE NOT TO USE THE WRONG DESTINATION
|
||||||
|
|
||||||
|
|
||||||
Running the tests
|
Running the tests
|
||||||
=================
|
=================
|
||||||
|
|
41
README.md
41
README.md
|
@ -3,17 +3,20 @@ CIRCLean
|
||||||
![CIRCLean logo](https://www.circl.lu/assets/images/logos/circlean.png)
|
![CIRCLean logo](https://www.circl.lu/assets/images/logos/circlean.png)
|
||||||
![Cleaner in action](http://www.circl.lu/assets/images/CIRCLean/CIRCLean.png)
|
![Cleaner in action](http://www.circl.lu/assets/images/CIRCLean/CIRCLean.png)
|
||||||
|
|
||||||
How To
|
How To Install
|
||||||
======
|
==============
|
||||||
|
|
||||||
[Graphical how-to and pre-built image](http://circl.lu/projects/CIRCLean/).
|
[Graphical how-to and pre-built image download](http://circl.lu/projects/CIRCLean/).
|
||||||
|
|
||||||
To prepare the SD card on Windows, you can use [Win32DiskImager](http://sourceforge.net/projects/win32diskimager/).
|
To prepare the SD card on Windows, you can use [Win32DiskImager](http://sourceforge.net/
|
||||||
|
projects/win32diskimager/). On linux/macOS, use dd (see the how-to link for
|
||||||
|
instructions).
|
||||||
|
|
||||||
And the linux way is in the command line, via dd (see in copy_to_final.sh)
|
The current prebuilt image is based on the 1-11-17 release of Raspbian Jessie Lite.
|
||||||
|
The smallest SD card that Circlean can fit on is currently 4GB.
|
||||||
|
|
||||||
If you'd like to contribute to the project or build the image yourself, see
|
If you'd like to contribute to the project or build the image yourself, see
|
||||||
[contributing](CONTRIBUTING.md) and the [setup readme](README_setup.md).
|
[contributing](CONTRIBUTING.md) and the [setup instructions](doc/setup_with_proot.md).
|
||||||
This is a work in progress - contributions are welcome.
|
This is a work in progress - contributions are welcome.
|
||||||
|
|
||||||
Why/What
|
Why/What
|
||||||
|
@ -21,11 +24,15 @@ Why/What
|
||||||
|
|
||||||
This project aims to be useful when you get/find a USB key that you can't trust,
|
This project aims to be useful when you get/find a USB key that you can't trust,
|
||||||
and you want to look at its contents without taking the risk of plugging it into
|
and you want to look at its contents without taking the risk of plugging it into
|
||||||
your computer directly.
|
your computer directly. The official project page can be found at [https://www.circl.lu/projects/CIRCLean/]
|
||||||
|
|
||||||
|
The Raspberry Pi Foundation blog has a [post](https://www.raspberrypi.org/blog/kittengroomercirclean-data-security-for-journalists-and-activists/) with more information
|
||||||
|
about an older version of the project and details of the inspiration behind it.
|
||||||
|
|
||||||
CIRCLean is currently tested to work with USB keys that have FAT32, NTFS, or
|
CIRCLean is currently tested to work with USB keys that have FAT32, NTFS, or
|
||||||
ext2/3/4 filesystems. Currently, exFAT is not supported due to lack of support for
|
ext2/3/4 filesystems (ext* filesystems can only be used as source keys, not destination
|
||||||
this format in pmount. The vast majority of USB keys will be FAT32 or NTFS.
|
keys). Currently, exFAT is not supported due to lack of support for this format in pmount.
|
||||||
|
The vast majority of USB keys will be FAT32 or NTFS.
|
||||||
|
|
||||||
The content of the untrusted key will be copied or/and converted to the second
|
The content of the untrusted key will be copied or/and converted to the second
|
||||||
(blank) key following these rules (based on the mime type as determined bylibmagic):
|
(blank) key following these rules (based on the mime type as determined bylibmagic):
|
||||||
|
@ -71,19 +78,3 @@ there are more than 2).
|
||||||
connected the HDMI cable, check the screen. The process is slow and can take
|
connected the HDMI cable, check the screen. The process is slow and can take
|
||||||
30-60 minutes depending on how many document conversions take place.
|
30-60 minutes depending on how many document conversions take place.
|
||||||
6. Power off the device and disconnect the drives.
|
6. Power off the device and disconnect the drives.
|
||||||
|
|
||||||
Helper scripts
|
|
||||||
==============
|
|
||||||
|
|
||||||
You should use them as examples when you are creating a new image and probably not
|
|
||||||
run them blindly as you will most probably have to change parameters accordingly to
|
|
||||||
your configuration.
|
|
||||||
|
|
||||||
IN ALL CASES, PLEASE READ THE COMMENTS IN THE SCRIPTS AT LEAST ONCE.
|
|
||||||
|
|
||||||
* proper_chroot.sh: uses qemu to chroot into a raspbian instance (.img or SD Card)
|
|
||||||
* prepare_rPI.sh: update the system, some configuration
|
|
||||||
* create_user.sh: create the user who will run the scripts, assign the proper sudo rights.
|
|
||||||
* copy_to_final.sh: populate the content of the directory fs/ in the image,
|
|
||||||
contains a sample of dd command to write the image on the SD card.
|
|
||||||
NOTE: TAKE CARE NOT TO USE THE WRONG DESTINATION
|
|
||||||
|
|
|
@ -1,196 +0,0 @@
|
||||||
Building the image from scratch
|
|
||||||
===============================
|
|
||||||
|
|
||||||
There is always a prebuilt image available for download and installation as
|
|
||||||
described in the [README](README.md). If you'd like to build the project yourself,
|
|
||||||
there are several steps involved:
|
|
||||||
|
|
||||||
* Downloading a generic Raspbian Lite image
|
|
||||||
* Adding space to the image
|
|
||||||
* Downloading and building the dependencies
|
|
||||||
* Copying the project filesystem into the image
|
|
||||||
|
|
||||||
This procedure will only work on Ubuntu or Debian Linux. If you use MacOS or
|
|
||||||
Windows, the best option is to install Linux in a virtual machine using
|
|
||||||
something like VirtualBox.
|
|
||||||
|
|
||||||
Downloading the Raspbian image
|
|
||||||
==============================
|
|
||||||
|
|
||||||
* Get the most recent version of Raspbian Jessie Lite:
|
|
||||||
|
|
||||||
```
|
|
||||||
wget https://downloads.raspberrypi.org/raspbian_lite_latest
|
|
||||||
```
|
|
||||||
|
|
||||||
* Unpack it:
|
|
||||||
|
|
||||||
```
|
|
||||||
unzip XXXX-XX-XX-raspbian-jessie-lite.zip
|
|
||||||
```
|
|
||||||
|
|
||||||
Adding space to the image
|
|
||||||
=========================
|
|
||||||
|
|
||||||
* Use dd to add 2GB (2048 blocks at 1024k each). Using /dev/zero as the input
|
|
||||||
file yields an unlimited number of "0x00" bytes.
|
|
||||||
|
|
||||||
```
|
|
||||||
> dd if=/dev/zero bs=1024k count=2048 >> XXXX-XX-XX-raspbian-jessie-lite.img
|
|
||||||
```
|
|
||||||
|
|
||||||
* Grow the root partition using fdisk. The "p" command prints the current partition
|
|
||||||
table. The first partition listed is the boot partition, which shouldn't be changed.
|
|
||||||
The "d" command, when given the parameter "2", deletes the current root partition.
|
|
||||||
The "n" command then makes a new partition. It can take the default for "type"
|
|
||||||
and "number". The "First sector" should be the value that was the "start" sector of the root
|
|
||||||
partition (131072 in the example below, but this varies depending on the version of the
|
|
||||||
Raspbian image). The "Last sector" should be the default, and it should be significantly
|
|
||||||
larger than it was before (6852607 vs. 2658303 in the example).
|
|
||||||
|
|
||||||
|
|
||||||
```
|
|
||||||
> fdisk XXXX-XX-XX-raspbian-jessie-lite.img
|
|
||||||
|
|
||||||
Command (m for help): *p*
|
|
||||||
Disk XXXX-XX-XX-raspbian-jessie-lite.img: 3.3 GiB, 3537895424 bytes, 6909952 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: 0x244b8248
|
|
||||||
|
|
||||||
Device Boot Start End Sectors Size Id Type
|
|
||||||
XXXX-XX-XX-raspbian-jessie-lite.img1 8192 137215 129024 63M c W95 FAT32 (LBA)
|
|
||||||
XXXX-XX-XX-raspbian-jessie-lite.img2 137216 2715647 2578432 1.2G 83 Linux
|
|
||||||
|
|
||||||
Command (m for help): *d*
|
|
||||||
Partition number (1,2, default 2): *2*
|
|
||||||
|
|
||||||
Partition 2 has been deleted.
|
|
||||||
|
|
||||||
Command (m for help): *n*
|
|
||||||
Partition type
|
|
||||||
p primary (1 primary, 0 extended, 3 free)
|
|
||||||
e extended (container for logical partitions)
|
|
||||||
Select (default p):
|
|
||||||
|
|
||||||
Using default response p.
|
|
||||||
Partition number (2-4, default 2):
|
|
||||||
First sector (2048-6852607, default 2048): *137216*
|
|
||||||
Last sector, +sectors or +size{K,M,G,T,P} (131216-6909951, default 6909951):
|
|
||||||
|
|
||||||
Created a new partition 2 of type 'Linux' and of size 3.2 GiB.
|
|
||||||
|
|
||||||
Command (m for help): *w*
|
|
||||||
The partition table has been altered.
|
|
||||||
Syncing disks.
|
|
||||||
```
|
|
||||||
|
|
||||||
* Mount the image in loop mode: first, edit /mount_image.sh to use the proper values
|
|
||||||
for $OFFSET_BOOT and $OFFSET_ROOTFS, which you can obtain using fdisk and "p" as
|
|
||||||
shown above. You must also change $IMAGE to the correct path. Then run:
|
|
||||||
|
|
||||||
```
|
|
||||||
sudo ./proper_chroot.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
* After mounting the image, the above script will chroot into the mounted image.
|
|
||||||
While in a chroot, the / directory of the image appears as the system / directory
|
|
||||||
(thus the name, change root). To exit the chroot, run "exit" in the root directory.
|
|
||||||
Then, verify the path to the mounted partitions, and resize the filesystem
|
|
||||||
to fill the new larger partition using resize2fs:
|
|
||||||
|
|
||||||
```
|
|
||||||
> df | grep /mnt/arm
|
|
||||||
|
|
||||||
/dev/loop0 3927752 1955672 1794172 53% /mnt/arm_rPi
|
|
||||||
/dev/loop1 57288 18960 38328 34% /mnt/arm_rPi/boot
|
|
||||||
|
|
||||||
> sudo resize2fs /dev/loop0
|
|
||||||
```
|
|
||||||
|
|
||||||
Installing the dependencies
|
|
||||||
===========================
|
|
||||||
|
|
||||||
* To install the dependencies, you'll have to reenter the chroot again:
|
|
||||||
|
|
||||||
```
|
|
||||||
sudo chroot /mnt/arm_rPi
|
|
||||||
```
|
|
||||||
|
|
||||||
* Change your user to root (your global variables may be broken as a result):
|
|
||||||
|
|
||||||
```
|
|
||||||
su root
|
|
||||||
```
|
|
||||||
|
|
||||||
* Change the locales (remove "en_GB.UTF-8 UTF-8", add "en_US.UTF-8 UTF-8"). The
|
|
||||||
arrow keys move the cursor, spacebar selects/deselects a locale, tab moves the cursor
|
|
||||||
to a different context, and enter lets you select "ok":
|
|
||||||
|
|
||||||
```
|
|
||||||
dpkg-reconfigure locales
|
|
||||||
```
|
|
||||||
|
|
||||||
* In the image, make sure everything is up-to-date and remove the old packages:
|
|
||||||
|
|
||||||
```
|
|
||||||
apt-get update
|
|
||||||
apt-get dist-upgrade
|
|
||||||
apt-get autoremove
|
|
||||||
apt-get install timidity git p7zip-full python-dev python-pip python-lxml pmount libjpeg-dev libtiff-dev libwebp-dev liblcms2-dev tcl-dev tk-dev python-tk libxml2-dev libxslt1-dev
|
|
||||||
```
|
|
||||||
|
|
||||||
* Install the Python dependencies for PyCIRCLean. Currently, PyCIRCLean is
|
|
||||||
Python 2.7 and 3.3+ compatible, but Python 2 support might be dropped at some point.
|
|
||||||
|
|
||||||
```
|
|
||||||
pip install oletools olefile exifread Pillow
|
|
||||||
pip install git+https://github.com/Rafiot/officedissector.git
|
|
||||||
pip install git+https://github.com/CIRCL/PyCIRCLean.git
|
|
||||||
```
|
|
||||||
|
|
||||||
* Create a new user and make mounting work with a read-only filesystem.
|
|
||||||
|
|
||||||
```
|
|
||||||
useradd -m kitten
|
|
||||||
chown -R kitten:kitten /home/kitten
|
|
||||||
ln -s /proc/mounts /etc/mtab
|
|
||||||
```
|
|
||||||
|
|
||||||
* Enable rc.local, which ensures that the code in /etc/rc.local is run on boot.
|
|
||||||
This is what triggers CIRCLean to run.
|
|
||||||
|
|
||||||
```
|
|
||||||
systemctl enable rc-local.service
|
|
||||||
```
|
|
||||||
|
|
||||||
* Exit the chroot again, and copy the files from your repository into the mounted
|
|
||||||
image.
|
|
||||||
|
|
||||||
```
|
|
||||||
sudo ./copy_to_final.sh /mnt/arm_rPi/
|
|
||||||
```
|
|
||||||
|
|
||||||
Write the image on a SD card
|
|
||||||
============================
|
|
||||||
|
|
||||||
* Plug your SD card into the computer. Then, find where it is mounted using df:
|
|
||||||
|
|
||||||
```
|
|
||||||
df -h
|
|
||||||
```
|
|
||||||
|
|
||||||
* If it has been automatically mounted, unmount the SD card (use the path you
|
|
||||||
found in the previous step):
|
|
||||||
|
|
||||||
```
|
|
||||||
umount $PATH_TO_YOUR_SD
|
|
||||||
```
|
|
||||||
|
|
||||||
* Write the image to the card:
|
|
||||||
|
|
||||||
```
|
|
||||||
sudo dd bs=4M if=$PATH_TO_YOUR_IMAGE of=$PATH_TO_YOUR_SD
|
|
||||||
```
|
|
|
@ -1,24 +1,25 @@
|
||||||
* Download qemu and qemu-user-static if not already installed
|
* Download qemu, qemu-user-static, and proot if not already installed
|
||||||
* Download the newest raspbian-lite image from raspberrypi.org
|
* Download the newest raspbian-lite image from raspberrypi.org
|
||||||
* Verify the sha1 hash of the downloaded .zip file
|
* Verify the sha1 hash of the downloaded .zip file
|
||||||
* Unzip the image
|
* Unzip the image
|
||||||
* Expand the image by 2GB using dd
|
* Expand the image by 2GB using dd
|
||||||
* Expand the root partition using fdisk
|
* Expand the root partition using fdisk
|
||||||
* Mount both partitions in loop mode using /shell_utils/simple_mount_image.sh
|
* Mount both partitions in loop mode using /shell_utils/basic_mount_image.sh
|
||||||
* Use df to find the larger partition, and resize the filesystem to fill it
|
* Use df to find the larger partition, and resize the filesystem to fill it
|
||||||
|
* Copy circlean_fs/root_partition/etc/systemd/system/rc-local.service into the equivalent location
|
||||||
* Use proot to enter a chroot in the image: sudo proot -q qemu-arm -S /mnt/rpi-root -b /mnt/rpi-boot:/boot /bin/bash
|
* Use proot to enter a chroot in the image: sudo proot -q qemu-arm -S /mnt/rpi-root -b /mnt/rpi-boot:/boot /bin/bash
|
||||||
* Run dpkg-reconfigure locales (this step + others using proot + qemu can be slow, be patient)
|
* Run dpkg-reconfigure locales
|
||||||
* apt-get update
|
* apt-get update
|
||||||
* apt-get dist-upgrade (might have to run this and autoremove several times)
|
* apt-get dist-upgrade (might have to run this and autoremove several times)
|
||||||
* apt-get autoremove
|
* apt-get autoremove
|
||||||
* apt-get install the linux dependencies:
|
* apt-get install the linux dependencies:
|
||||||
- timidity # for playing music
|
- timidity
|
||||||
- git # for installing python dependencies from github
|
- git
|
||||||
- p7zip-full
|
- p7zip-full
|
||||||
- pmount ntfs-3g # for mounting, including ntfs
|
- pmount ntfs-3g
|
||||||
- python3 python3-pip
|
- python3 python3-pip
|
||||||
- python3-lxml
|
- python3-lxml
|
||||||
- libjpeg-dev libtiff-dev libwebp-dev liblcms2-dev tcl-dev # dependencies for building pillow
|
- libjpeg-dev libtiff-dev libwebp-dev liblcms2-dev tcl-dev
|
||||||
* Compile p7zip-rar from source
|
* Compile p7zip-rar from source
|
||||||
- Change your source.list file
|
- Change your source.list file
|
||||||
- Make a new directory and cd to it
|
- Make a new directory and cd to it
|
||||||
|
@ -35,21 +36,19 @@
|
||||||
- git+https://github.com/CIRCL/PyCIRCLean.git
|
- git+https://github.com/CIRCL/PyCIRCLean.git
|
||||||
* Add a user named "kitten"
|
* Add a user named "kitten"
|
||||||
* Symlink /proc/mounts to /etc/mtab
|
* Symlink /proc/mounts to /etc/mtab
|
||||||
* Copy circlean_fs/root_partition/systemd/system/rc-local.service into the equivalent location
|
* Turn on rc-local.service `systemctl enable rc-local.service`
|
||||||
* Turn on rc-local.service `systemctl enable rc.local`
|
|
||||||
- If it doesn't work, read these instructions: https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd
|
- If it doesn't work, read these instructions: https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd
|
||||||
|
* apt-get autoclean
|
||||||
|
* apt-get autoremove
|
||||||
|
* Exit from proot
|
||||||
* Copy all of the project files from circlean_fs/ into the two partitions:
|
* Copy all of the project files from circlean_fs/ into the two partitions:
|
||||||
- rsync -vnri <source> <destination> will do a dry run of what will be copied, remove the -n to copy. See the rsync manpage for details.
|
- rsync -vnri <source> <destination> will do a dry run of what will be copied, remove the -n to copy. See the rsync manpage for details.
|
||||||
- diode_controller/ if you're using the led functionality and have an external led
|
- diode_controller/ if you're using the led functionality and have an external led
|
||||||
- midi/ files into /opt/midi/
|
- midi/ files into /opt/midi/
|
||||||
- you might want to double check all of the permissions of the new files/directories
|
- you might want to double check all of the permissions of the new files/directories
|
||||||
* apt-get autoclean
|
|
||||||
* apt-get autoremove
|
|
||||||
* Exit the chroot
|
|
||||||
* Copy the image over to the SD card: sudo dd bs=4M if=<image> of=/dev/sd<letter>
|
* Copy the image over to the SD card: sudo dd bs=4M if=<image> of=/dev/sd<letter>
|
||||||
- In newer versions of dd, you can add status=progress
|
- In newer versions of dd, you can add status=progress
|
||||||
* Mount the image
|
|
||||||
* Optional: fsck the root partition (sudo e2fsck -f /dev/sd<letter>2).
|
* Optional: fsck the root partition (sudo e2fsck -f /dev/sd<letter>2).
|
||||||
* Test with an rpi
|
* Test with an rpi
|
||||||
- FAT32 partition
|
- FAT32 filesystem
|
||||||
- NTFS partition
|
- NTFS filesystem
|
||||||
|
|
|
@ -0,0 +1,224 @@
|
||||||
|
Building the image from scratch
|
||||||
|
===============================
|
||||||
|
|
||||||
|
There is always a prebuilt image available for download and installation as
|
||||||
|
described in the [README](README.md). If you'd like to build the project yourself,
|
||||||
|
there are several steps involved:
|
||||||
|
|
||||||
|
* Downloading a generic Raspbian Lite image
|
||||||
|
* Resizing the image and partition
|
||||||
|
* Downloading and building the dependencies
|
||||||
|
* Modifying the image configuration
|
||||||
|
* Copying the project filesystem into the image
|
||||||
|
|
||||||
|
This procedure will only work on Ubuntu or Debian Linux. If you use MacOS or
|
||||||
|
Windows, the best option is to install Linux in a virtual machine using
|
||||||
|
something like VirtualBox.
|
||||||
|
|
||||||
|
It is recommended that you make a copy of image_setup_checklist.md and √ items off
|
||||||
|
on the list as you go.
|
||||||
|
|
||||||
|
Preparation
|
||||||
|
===========
|
||||||
|
|
||||||
|
* Make sure your development environment is up to date:
|
||||||
|
```
|
||||||
|
apt-get update
|
||||||
|
apt-get dist-upgrade
|
||||||
|
```
|
||||||
|
* Install qemu, qemu-user-static, and proot if not already installed:
|
||||||
|
```
|
||||||
|
apt-get install qemu qemu-user-static proot
|
||||||
|
```
|
||||||
|
|
||||||
|
Download the Raspbian image
|
||||||
|
==============================
|
||||||
|
|
||||||
|
* Get the most recent version of Raspbian Jessie Lite from https://downloads.raspberrypi.org/raspbian_lite/images/:
|
||||||
|
|
||||||
|
```
|
||||||
|
wget https://downloads.raspberrypi.org/raspbian_lite_latest
|
||||||
|
```
|
||||||
|
* Verify the hash of the downloaded file and compare it to the hash on the server:
|
||||||
|
```
|
||||||
|
shasum XXXX-XX-XX-raspbian-jessie-lite.zip
|
||||||
|
```
|
||||||
|
* Unpack it:
|
||||||
|
```
|
||||||
|
unzip XXXX-XX-XX-raspbian-jessie-lite.zip
|
||||||
|
```
|
||||||
|
|
||||||
|
Add space to the image
|
||||||
|
=========================
|
||||||
|
|
||||||
|
* Use dd to add 2GB (2048 blocks of 1024k each). Using /dev/zero as the input
|
||||||
|
file yields an unlimited number of "0x00" bytes.
|
||||||
|
```
|
||||||
|
> dd if=/dev/zero bs=1024k count=2048 >> XXXX-XX-XX-raspbian-jessie-lite.img
|
||||||
|
```
|
||||||
|
* Expand the root (second) partition using fdisk. The first partition listed is the boot
|
||||||
|
partition, which shouldn't be changed. In the new partition, the "First sector" should be
|
||||||
|
the value that was the "start" sector of the old root partition (137216 in the example
|
||||||
|
below, but this varies depending on the version of the Raspbian image). The "Last sector"
|
||||||
|
should be the default, and it should be significantly larger than it was before (6909951 vs.
|
||||||
|
2715647 in the example).
|
||||||
|
|
||||||
|
```
|
||||||
|
> fdisk XXXX-XX-XX-raspbian-jessie-lite.img
|
||||||
|
|
||||||
|
Command (m for help): *p*
|
||||||
|
Disk XXXX-XX-XX-raspbian-jessie-lite.img: 3.3 GiB, 3537895424 bytes, 6909952 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: 0x244b8248
|
||||||
|
|
||||||
|
Device Boot Start End Sectors Size Id Type
|
||||||
|
XXXX-XX-XX-raspbian-jessie-lite.img1 8192 137215 129024 63M c W95 FAT32 (LBA)
|
||||||
|
XXXX-XX-XX-raspbian-jessie-lite.img2 137216 2715647 2578432 1.2G 83 Linux
|
||||||
|
|
||||||
|
Command (m for help): *d*
|
||||||
|
Partition number (1,2, default 2): *2*
|
||||||
|
|
||||||
|
Partition 2 has been deleted.
|
||||||
|
|
||||||
|
Command (m for help): *n*
|
||||||
|
Partition type
|
||||||
|
p primary (1 primary, 0 extended, 3 free)
|
||||||
|
e extended (container for logical partitions)
|
||||||
|
Select (default p):
|
||||||
|
|
||||||
|
Using default response p.
|
||||||
|
Partition number (2-4, default 2):
|
||||||
|
First sector (2048-6852607, default 2048): *137216*
|
||||||
|
Last sector, +sectors or +size{K,M,G,T,P} (131216-6909951, default 6909951):
|
||||||
|
|
||||||
|
Created a new partition 2 of type 'Linux' and of size 3.2 GiB.
|
||||||
|
|
||||||
|
Command (m for help): *w*
|
||||||
|
The partition table has been altered.
|
||||||
|
Syncing disks.
|
||||||
|
```
|
||||||
|
* Mount the image in loop mode: first, edit shell_utils/basic_mount_image.sh to use the
|
||||||
|
proper values for $BOOT_START and $ROOT_START, which you can obtain using fdisk and "p"
|
||||||
|
as in the previous step. You must also change $IMAGE to the correct path. Then run:
|
||||||
|
```
|
||||||
|
sudo ./shell_utils/basic_mount_image.md
|
||||||
|
```
|
||||||
|
* Verify the path to the mounted partitions in /dev, and resize the root (larger) filesystem
|
||||||
|
to fill the new larger partition using resize2fs:
|
||||||
|
```
|
||||||
|
> df | grep /mnt/arm
|
||||||
|
|
||||||
|
/dev/loop0 3927752 1955672 1794172 53% /mnt/rpi-root
|
||||||
|
/dev/loop1 57288 18960 38328 34% /mnt/rpi-boot
|
||||||
|
|
||||||
|
> sudo resize2fs /dev/loop0
|
||||||
|
```
|
||||||
|
|
||||||
|
Installing the dependencies
|
||||||
|
===========================
|
||||||
|
|
||||||
|
* Copy circlean_fs/root_partition/systemd/system/rc-local.service into the equivalent location in the image.
|
||||||
|
```
|
||||||
|
cp circlean_fs/root_partition/systemd/system/rc-local.service /mnt/rpi-root/etc/systemd/system/rc-local.service
|
||||||
|
```
|
||||||
|
* Use [proot](https://proot-me.github.io/) to enter the equivalent of a chroot inside
|
||||||
|
the mounted image.
|
||||||
|
```
|
||||||
|
sudo proot -q qemu-arm -S /mnt/rpi-root -b /mnt/rpi-boot:/boot /bin/bash
|
||||||
|
```
|
||||||
|
* Change your locales (remove "en_GB.UTF-8 UTF-8", add "en_US.UTF-8 UTF-8"). The
|
||||||
|
arrow keys move the cursor, spacebar selects/deselects a locale, tab moves the cursor
|
||||||
|
to a different context, and enter lets you select "ok". This step might take some time,
|
||||||
|
be patient:
|
||||||
|
```
|
||||||
|
dpkg-reconfigure locales
|
||||||
|
```
|
||||||
|
* In the image, make sure everything is up-to-date and remove old packages. You may have to
|
||||||
|
run dist-upgrade and autoremove several times for everything to be installed, and a few
|
||||||
|
raspbian-sys-mods related installs may fail - you can ignore them:
|
||||||
|
```
|
||||||
|
apt-get update
|
||||||
|
apt-get dist-upgrade
|
||||||
|
apt-get autoremove
|
||||||
|
```
|
||||||
|
* Install the linux dependencies (see CONTRIBUTING.md for more details):
|
||||||
|
```
|
||||||
|
apt-get install timidity git p7zip-full python3 python3-pip python3-lxml pmount ntfs-3g libjpeg-dev libtiff-dev libwebp-dev liblcms2-dev tcl-dev
|
||||||
|
```
|
||||||
|
* Compile p7zip-rar from source. First, uncomment out the second line in /etc/apt/sources.list. Then:
|
||||||
|
```
|
||||||
|
cd /home/pi
|
||||||
|
mkdir rar && cd rar/
|
||||||
|
apt-get build-dep p7zip-rar
|
||||||
|
dpkg -i ${path to p7zip-rar .deb file}
|
||||||
|
```
|
||||||
|
* Install the Python dependencies for PyCIRCLean/filecheck.py. PyCIRCLean is 3.3+
|
||||||
|
compatible, so use pip -V to make sure you're using the right version of pip. You might
|
||||||
|
have to edit your PATH variable or use pip3 to get the correct pip. You also might want to
|
||||||
|
verify that these dependencies are current by checking in the PyCIRCLean git repo.
|
||||||
|
```
|
||||||
|
pip install -U pip
|
||||||
|
pip install oletools exifread pillow
|
||||||
|
pip install git+https://github.com/decalage2/oletools.git
|
||||||
|
pip install git+https://github.com/Rafiot/officedissector.git
|
||||||
|
pip install git+https://github.com/CIRCL/PyCIRCLean.git
|
||||||
|
```
|
||||||
|
* Create a new user named "kitten":
|
||||||
|
```
|
||||||
|
useradd -m kitten
|
||||||
|
chown -R kitten:kitten /home/kitten
|
||||||
|
```
|
||||||
|
* Symlinking /proc/mounts to /etc/mtab is necessary because /etc/mtab cannot be edited by
|
||||||
|
pmount if root is read-only. /proc/mounts is maintained by the kernel and is guaranteed to
|
||||||
|
be accurate.
|
||||||
|
```
|
||||||
|
ln -s /proc/mounts /etc/mtab
|
||||||
|
```
|
||||||
|
* Enable rc.local, which ensures that the code in /etc/rc.local is run on boot.
|
||||||
|
This is what triggers CIRCLean to run.
|
||||||
|
```
|
||||||
|
systemctl enable rc-local.service
|
||||||
|
```
|
||||||
|
* Clean up:
|
||||||
|
```
|
||||||
|
apt-get clean
|
||||||
|
apt-get autoremove
|
||||||
|
apt-get autoclean
|
||||||
|
```
|
||||||
|
* Exit proot, and copy the files from your repository into the mounted
|
||||||
|
image. Adding a -n flag will make rsync do a dry run instead of copying. See the rsync
|
||||||
|
manpage for more details. Make sure to include the trailing slashes on the paths:
|
||||||
|
```
|
||||||
|
exit
|
||||||
|
sudo rsync -vri circlean_fs/boot/ /mnt/rpi-boot/
|
||||||
|
sudo rsync -vri circlean_fs/root_partition/ /mnt/rpi-root/
|
||||||
|
cp -rf midi /mnt/rpi-root/opt/
|
||||||
|
```
|
||||||
|
* If have an external hardware led and you're using the led functionality, copy
|
||||||
|
the led files from diode_controller/ as well.
|
||||||
|
|
||||||
|
Write the image on a SD card
|
||||||
|
============================
|
||||||
|
|
||||||
|
* Plug your SD card into the computer. Then, find where it is mounted using lsblk or df:
|
||||||
|
```
|
||||||
|
lsblk
|
||||||
|
df -h
|
||||||
|
```
|
||||||
|
* If it has been automatically mounted, unmount the SD card (use the path you
|
||||||
|
found in the previous step):
|
||||||
|
```
|
||||||
|
umount $PATH_TO_YOUR_SD
|
||||||
|
```
|
||||||
|
* Write the image to the card. Newer versions of dd include a status option to monitor the
|
||||||
|
copying process:
|
||||||
|
```
|
||||||
|
sudo dd bs=4M if=$PATH_TO_YOUR_IMAGE of=$PATH_TO_YOUR_SD status=progress
|
||||||
|
```
|
||||||
|
* Use fsck to verify the root partition:
|
||||||
|
```
|
||||||
|
sudo e2fsck -f /dev/sd<number>2
|
||||||
|
```
|
Loading…
Reference in New Issue