View previous topic :: View next topic |
Author |
Message |
cwr Veteran
Joined: 17 Dec 2005 Posts: 1969
|
Posted: Tue Jul 02, 2013 8:57 am Post subject: Gentoo and read-only root file system. |
|
|
I need to run Gentoo from an SD Card, and since these are notoriously failure-prone I'd like
to make the card read-only and use a ramdisk for /var, which as far as I can tell is the only
place which has to be writeable.
Someone's done this before - are there any major snags I should watch for?
Thanks - Will |
|
Back to top |
|
|
NeddySeagoon Administrator
Joined: 05 Jul 2003 Posts: 54633 Location: 56N 3W
|
Posted: Wed Jul 03, 2013 6:57 pm Post subject: |
|
|
cwr,
For root to be read only you need to make /etc/mtab a symlink to /proc/mounts
Thats not needed if you will tolerate /etc/mtab being written.
You will need to put /tmp in RAM too _________________ Regards,
NeddySeagoon
Computer users fall into two groups:-
those that do backups
those that have never had a hard drive fail. |
|
Back to top |
|
|
slis Retired Dev
Joined: 11 Oct 2010 Posts: 67 Location: Limanowa
|
Posted: Wed Jul 03, 2013 8:05 pm Post subject: |
|
|
I have prepared this kind of system about year ago (with kernel 3.2.6). It was based on gentoo, and I've made it 346MB in total.
As far as I can remember, I've done this like this:
1. prepare VirtualBox machine and install some base gentoo on it
2. copy all of this into directory (devel) where I can chroot and update & install packages
3. do some size-optimizations, such as busybox symlinks, remove unnecessary libraries and so
4. copy all necessary files into new directory (release) - that skips linux source, portage tree and some more
5. create two squashfs filesystems - root and usr (separated)
6. prepare disc images (loop filesystems) and copy kernel & root.squashfs into first, and "burn" usr into second
7. this image can be dd'ed into real device (in my situation, it was CF-card)
I have also done some sort of auto-backup, so the system may recover, when something will broke. As I can remember now, I've done some tests, where I've manually damaged filesystem, and all goes auto-recovered.
fstab on this looks like this:
Code: |
/dev/sda1 /boot ext2 noauto,noatime 1 2
/boot/root.squashfs / squashfs noatime,ro 0 0
/dev/sda2 /usr squashfs noatime,ro 0 0
/dev/sda3 /backup ext3 noatime,noauto 0 1
/dev/sda4 /var ext3 noatime 0 1
tmpfs /tmp tmpfs size=10M 0 0
|
I haven't touch this for very long time and many things I just don't remember, but if you wish I could give you the script that creates 'release' from my 'devel' filesystem, so you could try to dig something worthy for you from there.
Regards |
|
Back to top |
|
|
cwr Veteran
Joined: 17 Dec 2005 Posts: 1969
|
Posted: Thu Jul 04, 2013 9:28 am Post subject: |
|
|
slis - very, very many thanks. That gives me a clear starting point and a good idea
of the way ahead, just what I was looking for.
Will |
|
Back to top |
|
|
steveL Watchman
Joined: 13 Sep 2006 Posts: 5153 Location: The Peanut Gallery
|
Posted: Sat Jul 06, 2013 6:05 am Post subject: |
|
|
Yeah, nice one slis. Added to my favourite tips under Advanced usage.
I for one would be interested to see your script. |
|
Back to top |
|
|
slis Retired Dev
Joined: 11 Oct 2010 Posts: 67 Location: Limanowa
|
Posted: Sat Jul 06, 2013 9:38 am Post subject: |
|
|
Thanks!
I did not expect such an interest.
As I said if someone would want, then I may publish some more details. But they are very solution-specific, so it may need much improvements before it would be useful for you. Also, the system is quite old for now, but that's the smallest problem |
|
Back to top |
|
|
steveL Watchman
Joined: 13 Sep 2006 Posts: 5153 Location: The Peanut Gallery
|
Posted: Sat Jul 06, 2013 6:35 pm Post subject: |
|
|
slis wrote: | As I said if someone would want, then I may publish some more details. But they are very solution-specific, so it may need much improvements before it would be useful for you. |
Sure, but with a few eyeballs we can probably make it generic. |
|
Back to top |
|
|
slis Retired Dev
Joined: 11 Oct 2010 Posts: 67 Location: Limanowa
|
Posted: Sat Jul 06, 2013 7:13 pm Post subject: |
|
|
If someone will help - then, why not?
fun fact: this system was running one Python+QT app, which was auto-started (something like kiosk?) So, if someone will need only console for example, without all X11 & qt stuff, it'll have huge size benefits.
I'll try to refresh this topic and publish something for few weeks, just after I'll finish my current task. I'll let you know here. |
|
Back to top |
|
|
trumee Guru
Joined: 02 Mar 2003 Posts: 551 Location: London,UK
|
Posted: Fri Oct 31, 2014 5:34 pm Post subject: |
|
|
This is exactly what i am trying to do. Did you get around to posting the details? |
|
Back to top |
|
|
slis Retired Dev
Joined: 11 Oct 2010 Posts: 67 Location: Limanowa
|
Posted: Fri Oct 31, 2014 7:54 pm Post subject: |
|
|
It's nice to know that it still usefull for someone.
I'm currently working on preparing LinuxCNC + Gentoo system, which among others would contain: prepared images (about 300-400MB) with full system, and a script for creating one from scratch.
For now, I can paste only some very-very-developement version of script for creating image from directory with gentoo inside.
If you're interested, it looks like this:
1. Download stage3 and portage
2. Create ``ROOT'' directory, make it like your regular '/' (mkdir usr mnt dev proc sys tmp lib etc var bin sbin)
3. Unpack stage3 and portage as usual
4. You should be able to chroot inside. I, for convenience, prepared a script:
Code: |
mount -t proc proc ROOT/proc
mount -o bind /dev ROOT/dev
linux32 chroot ROOT /bin/bash
umount ROOT/proc
umount ROOT/dev
|
You're now inside your new os, which would be then 'burned' into raw image, and then into regular sd, cf or so.
Remember to env-update && source /etc/profile.
Prepare what you need. Emerge all stuff needed. Remember to emerge and build some kernel.
CTRL+D or exit
5. Now it's fun. You have to create some loopback devices, create image, copy files, optionally create squashfs and so on.
I'll post my very-very-dev-dev script, please do modify it to your needs.
What it does:
- creates empty image with four partitions on it (/, /boot, /var, /home) - do change that to your needs
- /boot have to be regular partition, as known on your 'normal' system
- I've left /home and /var as writable space for files
- the rest is squashfs (what implies that you can't emerge anything, can't modify /etc settings and so on)
Remember: change that for your needs, it's created to fit my needs right now, it's not optimized, nor flexible anyway. And I don't have time right now to prepare this that way. I hope I'll do this some day
You work with that way:
- create what you want, emerge what you need and config everything on your ROOT (chrooted)
- create_release.sh -> release.img
- dd if=release.img of=/dev/YOUR_DEVICE bs=1M
Code: |
losetup -d /dev/loop[012]
TMPROOT=.tmp_root
for f in boot bin lib sys usr sbin etc root home; do
if [ ! -d release/$f ] ; then
mkdir release/$f;
fi
rsync -avh --delete --exclude include --exclude portage --exclude src ROOT/$f/ release/$f/ ;
done
# remove unnecessary files
rsync -avh --delete ROOT/usr/share/keymaps release/usr/share/
rsync -avh --delete ROOT/usr/share/include release/usr/share/
# YOU MAY WANT TO RSYNC SOME ADDITIONAL FILES HERE
# like your 'kiosk' program files etc
if [ -f release.squashfs ] ; then
rm release.squashfs
fi
if [ -f release.img ] ; then
rm release.img
fi
mksquashfs release/ release.squashfs
ROOT_SIZE=$(stat -c%s release.squashfs)
ROOT_SIZE_MB=$(( $ROOT_SIZE / 1024 / 1024 + 2 ))
# There are some constant size declarations, you may want to modify them
# 15M for boot
# 100 + 50 M for home + var in my case
dd if=/dev/zero of=release.img bs=1M count=$(( $ROOT_SIZE_MB + 15 + 100 + 50 ))
echo 'n
p
1
+15M
n
p
2
+'$ROOT_SIZE_MB'M
n
p
3
+100M
n
p
4
w' | fdisk release.img
O1=`fdisk -l release.img | grep release.img | tr -s ' ' ' ' | cut -d" " -f2 | tail -n4 | head -n1`
O2=`fdisk -l release.img | grep release.img | tr -s ' ' ' ' | cut -d" " -f2 | tail -n3 | head -n1`
O3=`fdisk -l release.img | grep release.img | tr -s ' ' ' ' | cut -d" " -f2 | tail -n2 | head -n1`
O4=`fdisk -l release.img | grep release.img | tr -s ' ' ' ' | cut -d" " -f2 | tail -n1 | head -n1`
S1=`fdisk -l release.img | grep release.img | tr -s ' ' ' ' | cut -d" " -f4 | tail -n4 | head -n1`
S2=`fdisk -l release.img | grep release.img | tr -s ' ' ' ' | cut -d" " -f4 | tail -n3 | head -n1`
S3=`fdisk -l release.img | grep release.img | tr -s ' ' ' ' | cut -d" " -f4 | tail -n2 | head -n1`
S4=`fdisk -l release.img | grep release.img | tr -s ' ' ' ' | cut -d" " -f4 | tail -n1 | head -n1`
O1=$(( $O1 * 512 ))
S1=$(( $S1 * 512 ))
O2=$(( $O2 * 512 ))
S2=$(( $S2 * 512 ))
O3=$(( $O3 * 512 ))
S3=$(( $S3 * 512 ))
O4=$(( $O4 * 512 ))
S4=$(( $S4 * 512 ))
losetup -o $O1 --sizelimit $S1 /dev/loop1 release.img
losetup -o $O2 --sizelimit $S2 /dev/loop2 release.img
losetup -o $O3 --sizelimit $S3 /dev/loop3 release.img
losetup -o $O4 --sizelimit $S4 /dev/loop4 release.img
losetup /dev/loop0 release.img
mkfs.ext2 /dev/loop1
mkfs.ext2 /dev/loop3
mkfs.ext2 /dev/loop4
dd if=release.squashfs of=/dev/loop2
mkdir $TMPROOT
mount /dev/loop2 $TMPROOT
mount /dev/loop1 $TMPROOT/boot
mount /dev/loop3 $TMPROOT/var
mount /dev/loop4 $TMPROOT/home
cp -vr release/boot/* $TMPROOT/boot/
rsync -avh release/home/ $TMPROOT/home/
umount $TMPROOT/boot
umount $TMPROOT/var
umount $TMPROOT/home
umount $TMPROOT
rm -rfv $TMPROOT
losetup -D
echo -e "device (hd0) release.img\nroot (hd0,0)\nsetup (hd0)" | grub --batch
|
Hope I haven't forgot anything. Write for help, when needed
Cheers! |
|
Back to top |
|
|
N8Fear Tux's lil' helper
Joined: 15 Apr 2013 Posts: 140 Location: Berlin (Germany)
|
Posted: Sat Nov 01, 2014 7:46 pm Post subject: |
|
|
I think the problem with SD-cards is vastly overstated.
I've been running Gentoo for about 1 1/2 years on a ultra cheap micro sd (from a german discounter called aldi - was something about 6 euro for 16 GB) on my raspberry pi. It's one of the first models with just 256MB ram, so I don't use tmpfs for anything except /dev while I even run emerge locally.
I have had no issues so far.
On the other hand I had 3 normal HDDs dying within 3 months after being bought. Just backup your data (for (small) SDcards dd is relatively quick so you can even have a pre-readied backup card at hand so you just need to reinstall userdata |
|
Back to top |
|
|
slis Retired Dev
Joined: 11 Oct 2010 Posts: 67 Location: Limanowa
|
Posted: Sat Nov 01, 2014 8:05 pm Post subject: |
|
|
I agree that when properly used sd/cf cards are good (safe enough).
Using read-only filesystems has several advantages and in some scenarios is the only real choice. |
|
Back to top |
|
|
slis Retired Dev
Joined: 11 Oct 2010 Posts: 67 Location: Limanowa
|
Posted: Fri Dec 12, 2014 1:58 pm Post subject: |
|
|
If someone is interested, I've created a script for creating gentoo-based system, which also is able to create raw image and write it directly into for example CF/SD card.
There is no WIKI page yet, but I'm working on it.
Basically, it's possible to create "blank" gentoo system, chroot into - look around and build what is needed, then build and write image.
There is no wiki page with tutorials, but --help should be sufficient.
https://sourceforge.net/p/gentoocnc/code/ci/default/tree/gaston/ |
|
Back to top |
|
|
|