Installieren Sie Ubuntu Server dauerhaft auf einem Flash-Laufwerk

20

Als erstes wollte ich sicherstellen, dass es ein Verständnis dafür gibt, worum es in diesem Beitrag NICHT geht:

Ich möchte einen NAS-Heimserver (Dateiserver) haben, der von einem USB-Stick oder einer CF-Karte gestartet wird. Für den Punkt in diesem Beitrag ist es unerheblich, wie das Flash-Laufwerk angeschlossen ist (USB, IDE, auf andere Weise), was relevant ist: Ich möchte eine vollständige Betriebssysteminstallation starten und vom Flash-Laufwerk ausführen. Die Gründe für diese Art der Installation sind: Ich möchte auf einfache Weise eine Sicherungskopie des Betriebssystems erstellen (Image des Flashs) und sicherstellen, dass das Betriebssystem sofort ausgetauscht und gebootet werden kann (durch Ersetzen des Flash-Laufwerks) ) und ich möchte, dass Laufwerke auf einem Dateiserver getrennt vom Betriebssystem austauschbar sind.

Mir ist bewusst, dass es möglich ist, ein Flash-Laufwerk einfach als ext2 zu formatieren und darauf zu installieren. Was ich suche, sind Empfehlungen für die Schaffung einer robusteren Lösung. Hier sind ein paar Dinge, die ich tun möchte:

  • Konfigurieren Sie die Root-Partition als YAFF2 oder LogFS oder als ein anderes Dateisystem, das speziell für Flash-Laufwerke entwickelt wurde.
  • Konfigurieren Sie das Basisbetriebssystem neu, um Schreibvorgänge zu minimieren (RAMFS in / tmp und so weiter).

Bitte reichen Sie Ihre Empfehlungen ein. Ich frage mich, ob Ubuntu überhaupt für ein solches Szenario geeignet ist ...

Ich möchte mein Ziel ein wenig klarstellen. Die regulären SSD-Laufwerke sind mit Firmwares ausgestattet, die das Laufwerk durch die folgenden Tricks für lange Zeit am Leben erhalten. USB-Sticks haben keine solche Firmware, daher können sie bei Verwendung eines regulären Dateisystems schnell zerstört werden. Ich suche, ob es möglich ist, SSD-Firmware mithilfe eines für Flash entwickelten Dateisystems zu emulieren. In gewissem Sinne versuche ich, es so zu machen, dass ein USB-Laufwerk ein System auf normale Weise ausführen kann, als wäre es eine tatsächliche SSD.

Galets
quelle
1
Wollte das in ein paar Stunden fragen, +1.
Bruno Pereira
1
Einige der Informationen in der verknüpften Antwort sind relevant, insbesondere das noatimeFlag und andere Tricks, um nicht auf das Laufwerk zu schreiben. Ich denke wirklich, Ihre Frage bezieht sich nicht auf die Installation auf einem Flash-Laufwerk (da dies gut beantwortet ist), sondern darauf, wie Sie Schreibvorgänge auf das Laufwerk minimieren können.
Huckle
@Huckle Ich würde eine umfassendere Antwort vorziehen. Ich möchte das Betriebssystem so ausführen, dass es für ein Flash-Laufwerk optimiert ist. Das Minimieren von Schreibvorgängen ist Teil davon, aber nicht die Antwort. Ich möchte das Betriebssystem mit einem Dateisystem ausführen, das speziell auf Flash-Laufwerke
abzielt
Warum nicht einfach mal probieren? Ich habe Linux normalerweise auf diese Weise installiert und es funktioniert gut.
bntser
@bntser Hier geht es NICHT darum, einfach von USB zu
booten

Antworten:

1

Verwenden Sie LVM . In diesem Fall können Sie Snapshots verwenden - sofortige Klone Ihres Systems, sodass Sie problemlos das gesamte System kopieren oder es einfach zwischen Flash-Laufwerken * migrieren können.

Und wenn Sie eine Art "Wear-Leveling" möchten , können Sie aufs für das Root-Dateisystem auf USB- Flash verwenden. Sie müssen also nicht YAFF2 usw. verwenden, ext4 ist in Ordnung.

*Aber / boot müssen Sie immer manuell kopieren + Sie müssen die UUID von grub / disk ändern . Sie Rettungs - CD für den Fall , müssen die Größe Wurzelvolumen auf die Größe des USB - Flash. Und für den Fall, dass Sie mürrisch werden, lesen Sie dieses Handbuch .

Ich habe das Handbuch dafür geschrieben.

BBK
quelle
Danke für die Antwort, aber wie geht aufs beim Wear Leveling vor? Ich sehe keine Anzeichen dafür
galets
Ich meine eine Art "Wear-Leveling". Aufs hilft Ihnen beim Speichern Ihres USB-Sticks. Tatsächlich ist FlashDrive schreibgeschützt und alle Schreib- / Änderungsvorgänge werden im RAM-Speicher gespeichert.
BBK
Warte eine Zeit lang. Ich werde eine vollständige Anleitung hinzufügen, um die Größe von LVM-Roots zu ändern + auf Flash-Laufwerk zu migrieren + aufzuspielen, nachdem einige Fehler behoben wurden. Ich mache auch Home NAS Server.
BBK
4

Wenn Sie Ubuntu auf der Festplatte mit LVM haben (Ubuntu Server verwendet standardmäßig LVM).

Dieses Skript wurde in Ubuntu Oneiric 11.10 x86_64 3.0.0-16-Server mit folgenden Anwendungen getestet:

LVM version:     2.02.66(2) (2010-05-20)
Library version: 1.02.48 (2010-05-20)
Driver version:  4.20.0
grub-install (GRUB) 1.99-12ubuntu5
aufs - advanced multi layered unification filesystem. version 2.1-standalone.tree-3.0-rcN-20110620

Schritt 1. Schrumpfwurzel FS auf die Größe Ihres FlashDrive oder kleiner. Überspringen Sie diesen Schritt, wenn Ihre Root-FS-Größe kleiner oder gleich der des FlashDrive ist.

Booten Sie mit der Resc-CD und hängen Sie Ihre Root-Partition ein. Führen Sie die folgenden Befehle aus:

#make the kernel realize the LVM volumes are there
lvm vgchange -a y

#Before shrinking the file system, it is good practice to check it is all in order.
# Change /dev/ubuntu/root with your root lvm partition
e2fsck -f /dev/ubuntu/root

#After the check, resize2fs can be used to shrink the file system on the LVM volume
# Change /dev/ubuntu/root with your root lvm partition. Replace 6G with your FlashDrive capacity-500Mb
resize2fs -f -p /dev/ubuntu/root 6G
#The e2fsck check command could be run again to make sure the, now significantly smaller, root file system is OK.
# Change /dev/ubuntu/root with your root lvm partition. Replace 6G with your FlashDrive capacity-500Mb
resize2fs -f -p /dev/ubuntu/root 6G

#The lvreduce command reduces the size of LVM volumes.
# Change /dev/ubuntu/root with your root lvm partition. Replace 6G with your FlashDrive capacity-500Mb
lvm lvreduce -L6G /dev/ubuntu/root

#you resided root partition !
reboot

Schritt 2. FlashDrive vorbereiten: z Migration

werfen Sie einen Blick auf Ihre alte Root-UUID

blkid  
#it will show something like:
#/dev/sda1: UUID="6b5085da-5b7c-4ca5-a907-1e527c87a478" TYPE="ext2"
#/dev/sda2: UUID="iZjCPX-AwGS-kEmg-zXPc-Z7ne-Xd3N-gXoPQd" TYPE="LVM2_member"

#We will need /dev/sda1's UUID later. Lets remember it (6b5085da-5b7c-4ca5-a907-1e527c87a478) for the future.

# Replace /dev/sdg with your FlashDrive. All data will be last!
fdisk /dev/sdg
make first partition (sdg1) about 500Mb as ext2/ext4
make second partition (sdg2) for example 6GB as LVM partition.

#replace ubuntu with the same LVM VolumeGroup for your root fs
#Extending VG with FlashDrive
vgextend ubuntu /dev/sdg2
modprobe dm-mirror
#Moving root partition to flash drive online :)
#Replace /dev/sdg2 with your Flash Drive's second partition
#Replace /dev/sda5 with your root drive
pvmove --verbose /dev/sda5 /dev/sdg2
#removing old root drive from VolumeGroup, so we can remove HDD from PC after manipulations. But not now.
vgreduce ubuntu /dev/sda5
#Creating boot partition.
#Replace /dev/sdg1 with your Flash Drive's first partition
mkfs -t ext4 -v /dev/sdg1
#Mounting first FlashDrive partition.
mkdir /mnt/boot
#Replace /dev/sdg1 with your Flash Drive's first partition
mount /dev/sdg1 /mnt/boot

#we will need some tools
apt-get install dump
#coping boot drive from HDD to FlashDrive first partition
#Replace /dev/sda1 (source) and /mnt/boot (destination) with your environments
(dump -0f - /dev/sda1) | ( cd /mnt/boot; restore -rf - )
#And let's not forget to restore boot sector (MBR):
# Replace /dev/sdg with FlashDrive disk path
grub-install /dev/sdg

#change UUID for /boot with the one we remember at the beginning of the Step 2 (6b5085da-5b7c-4ca5-a907-1e527c87a478).
vi /etc/fstab

#now we need to write changes to grub.
update-grub

#Now you can power off your PC.
poweroff
#Now you can replace old root FS's HDD.
#Do not forget configure your PC's BIOS to boot from your FlashDrive.

A) Wenn Ihr Grub geladen ist, aber das Betriebssystem auf Anhieb nicht geladen werden kann, lesen Sie diesen Artikel . Versuchen Sie ls Befehl, um herauszufinden, was Grub Seeing.

grub>ls
# Replace (hd0,msdos1) regard to previous output
grub>ls (hd0,msdos1)

# Replace (hd0,msdos1)/grub regard to previous output
grub>ls (hd0,msdos1)/grub

grub>configfile (hd0,msdos1)/grub/grub.cfg

Nach dem erfolgreichen Booten sind die Änderungen nicht dauerhaft, so dass Sie grub aktualisieren müssen

update-grub

B) Wenn Sie Grub überhaupt nicht sehen, booten Sie mit der Rescue-CD.

#and install grub
#Lets figure out new name of your FlashDrive
blkid
# Replace /dev/sda with new name of your FlashDrive which system shows you
grub-install /dev/sda
#Reboot without Rescue CD and go to point A)
reboot

Schritt 3. AUFS für Root-Dateisystem auf USB-Flash-Laufwerk.

apt-get update
 apt-get dist-upgrade
 apt-get install aufs-tools


# Aufs as root with apparmor. Enter dhclient3 to complain mode
# Network interface without it wount start/
apt-get install apparmor-utils
aa-complain dhclient3
# Or disable apparmor
#/etc/init.d/apparmor stop
#update-rc.d -f apparmor remove
#aptitude remove apparmor apparmor-utils

echo aufs >> /etc/initramfs-tools/modules

Erstellen Sie nun die Datei / etc / initramfs-tools / scripts / init-bottom / __ rootaufs und platzieren Sie das nächste Skript:

#!/bin/sh
#  Copyright 2008 Nicholas A. Schembri State College PA USA
#
#  This program is free software: you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation, either version 3 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see
#    <http://www.gnu.org/licenses/>.

# https://help.ubuntu.com/community/aufsRootFileSystemOnUsbFlash#rootaufs_Script

# Thank you Voyage Linux for the idea, http://voyage.hk/ Great job on release 0.5
#
# Tested with 8.04.1
# tested with 9.10
# tested with debian live 6.0.1
#
# ****************************************************************************************
# 
#                                 Change log
#
# 2008.08.01  Added debugging comments in "drop to a shell" section. grub option aufs=tmpfs-debug will stop the init script.
#             reviewed *********** fix fstab on tmpfs ******************
#             rootaufs failed when system was booted with /dev/xxx and fstab had uuid= info.
#             BlaYO pointed out the best and simplest solution was to use grep -v. Grep replaces a sed one liner.
#             Add the comment block to fstab
#             
# 2009.12.07 Corrected issue caused by Apparmor.
#            Name changed to __rootaufs.
# 
# 2011.08.19 Changed if condition to avoid issue (sh: bad number) when $aufsdebug is not set.
#            Now checks exists apparmor before delete.
#
# 2011.08.20 For work correctly with Debian Live 6.0.1 (http://live.debian.net/) two lines must be removed from rc.local modification part:
#             'mount -f  /ro'
#             'echo aufs-tmpfs /rw tmpfs rw 0 0 >>/etc/mtab'
#





case $1 in
prereqs)
    exit 0
    ;;
esac

export aufs

for x in $(cat /proc/cmdline); do 
    case $x in 
    root=*)
        ROOTNAME=${x#root=}
        ;;
    aufs=*)
        aufs=${x#aufs=}
        case $aufs in
        tmpfs-debug)
            aufs=tmpfs
            aufsdebug=1
            ;;
        esac    
        ;;
    esac
done


if [ "$aufs" != "tmpfs" ]; then
    #not set in boot loader 
    #I'm not loved. good bye
    exit 0
fi




# This is a simple overview of the steps needed to use aufs on the root file system and see the /rw and /ro  branches.
# initramfs init-botton script 
# move the root file system to aufs/unionfs readonly /ro
# root is mounted on ${rootmnt}
# create tmpfs on /rw
# create a aufs using /ro and /rw
# put some files on the tmpfs to fix mtab and fstab 
# move aufs to rootmnt to finish the init process.
# No changes to the root file system are made by this script.
#
#  Why!
#  This will allow you to use a usb flash drive and control what is written to the drive.
#  no need to rebuild the squashfs file just to add a program. 
#  boot to single user mode.  The system works the way you expect. boot aufs=tmpfs and no changes are written to the flash.
#  run ubuntu on an eeePC .  

# Install 
# Install ubuntu 8.04 Hardy. Hardy has aufs installed by default
# apt-get update
# apt-get dist-upgrade
# apt-get install aufs-tools
# echo aufs >> /etc/initramfs-tools/modules
# put this file in /etc/initramfs-tools/scripts/init-bottom/rootaufs
# chmod 0755 rootaufs
# # clean up menu.lst 
# update-grub
# update-initramfs -u
# vi /boot/grub/menu.lst
# add aufs=tmpfs to the default entry. 
# do not add this line to single user mode.
# boot to single user mode in order to install software. 
# note: if your home account is on the root file system, your files are in ram and not saved.
# 


echo 
echo "       root-aufs:  Setting up aufs on ${rootmnt} as root file system "
echo 

modprobe -q --use-blacklist aufs
if [ $? -ne 0 ]; then
    echo    root-aufs error:      Failed to load aufs.ko
    exit 0
fi

#make the mount points on the init root file system
mkdir /aufs
mkdir /rw
mkdir /ro

# mount the temp file system and move real root out of the way
mount -t tmpfs aufs-tmpfs /rw
mount --move ${rootmnt} /ro 
if [ $? -ne 0 ]; then
    echo    root-aufs error:    ${rootmnt}  failed to move to /ro
    exit 0
fi


mount -t aufs -o dirs=/rw:/ro=ro aufs /aufs
if [ $? -ne 0 ]; then
    echo    root-aufs error:      Failed to mount /aufs files system
    exit 0
fi


#test for mount points on aufs file system
[  -d /aufs/ro ] || mkdir /aufs/ro
[  -d /aufs/rw ] || mkdir /aufs/rw

# the real root file system is hidden on /ro of the init file system.  move it to /ro 
mount --move /ro /aufs/ro
if [ $? -ne 0 ]; then
    echo    root-aufs error:      Failed to move /ro /aufs/ro 
    exit 0
fi

# tmpfs file system is hidden on /rw
mount --move /rw /aufs/rw
if [ $? -ne 0 ]; then
    echo    root-aufs error:      Failed to move /rw /aufs/rw 
    exit 0
fi



#*********** fix fstab on tmpfs ******************
# test for /dev/sdx 
# this is not on the real file system.  This is created on the tmpfs each time the system boots.
# The init process will try to mount the root filesystem listed in fstab. / and swap must be removed.  
# the root file system must be mounted on /ro not on /

if [ "0$aufsdebug" -eq 1 ]; then
    echo  "   root-aufs debug:    Remove the root file system and swap from fstab "
    echo 
    echo 
    echo  "         ROOTNAME $ROOTNAME "
    echo  "         resume   $resume   "
    echo 
    echo  '     BlaYO pointed out that grep can be used to quickly remove '
    echo  '      the root file system from fstab. '
    echo 
    echo  '     Thank you BlaYO for the debug info.'
    echo

fi
# old code
# I'm sure that sed can do this in one step but I want to correct on the rootname  not matching the root in fstab.
#cat /aufs/ro/etc/fstab|sed -e s/$ROOTNAME/\#$ROOTNAME/ -e s/$resume/\#$resume/ >/aufs/etc/fstab  

#Add the comment block to fstab
cat <<EOF >/aufs/etc/fstab
#
#   RootAufs has mounted the root file system in ram
#
#  This fstab is in ram and the real fstab can be found /ro/etc/fstab
#  the root file system ' / ' has been removed.
#  All Swap files have been removed. 
#

EOF

#remove root and swap from fstab
cat /aufs/ro/etc/fstab|grep -v ' / ' | grep -v swap >>/aufs/etc/fstab  
if [ $? -ne 0 ]; then
    echo    root-aufs error:      Failed to create /aufs/etc/fstab 
    #exit 0
fi




# add the read only file system to fstab
#ROOTTYPE=$(/lib/udev/vol_id -t ${ROOT})
ROOTTYPE=$(cat /proc/mounts|grep ${ROOT}|cut -d' ' -f3)
ROOTOPTIONS=$(cat /proc/mounts|grep ${ROOT}|cut -d' ' -f4)
echo ${ROOT} /ro $ROOTTYPE $ROOTOPTIONS 0 0 >>/aufs/etc/fstab


# S22mount on debian systems is not mounting  /ro correctly after boot
# add to rc.local to correct what you see from df
#replace last case of exit with #exit
cat /aufs/ro/etc/rc.local|sed 's/\(.*\)exit/\1\#exit/' >/aufs/etc/rc.local  
echo mount -f  /ro >>/aufs/etc/rc.local 

# add back the root file system. mtab seems to be created by one of the init proceses. 
echo "echo aufs / aufs rw,xino=/rw/.aufs.xino,br:/rw=rw:/ro=ro 0 0 >>/etc/mtab" >>/aufs/etc/rc.local
echo "echo aufs-tmpfs /rw tmpfs rw 0 0 >>/etc/mtab" >>/aufs/etc/rc.local 
echo exit 0 >>/aufs/etc/rc.local 

#  Copyright 2008 Joaquin I. Bogado Garcia
#fix para apparmor, se desactiva y listo ( From the lethe project. )
[ -e /scripts/init-bottom/_apparmor ] && rm /scripts/init-bottom/_apparmor
[ -e /aufs/etc/init.d/apparmor ] && rm /aufs/etc/init.d/apparmor


#build remountrw
echo \#!/bin/sh >/aufs/bin/remountrw
echo mount -o remount,rw ${ROOT} >>/aufs/bin/remountrw
chmod 0700 /aufs/bin/remountrw

#build remountro
echo \#!/bin/sh >/aufs/bin/remountro
echo mount -o remount,ro ${ROOT} >>/aufs/bin/remountro
chmod 0700 /aufs/bin/remountro

# This should drop to a shell. (rewrite)
if [ "0$aufsdebug" -eq 1 ]; then
    echo
    echo "   root-aufs debug:    mount --move /aufs ${rootmnt} "
    echo 
    echo '   root-aufs debug:   init will stop here.   '
    echo  
    exit 0
fi

mount --move /aufs ${rootmnt}

exit 0

Nachdem wir die Berechtigungen für diese Datei ändern müssen:

chmod 0755 /etc/initramfs-tools/scripts/init-bottom/rootaufs

Schritt 4. GRUB2 ändern.

cat /etc/grub.d/10_linux|sed  s/'linux_entry "${OS}" "${version}" false'/'linux_entry "RO: ${OS}" "${version}" false'/ |sed  s/'"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_EXTRA} ${GRUB_CMDLINE_LINUX_DEFAULT}"'/'"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_EXTRA} ${GRUB_CMDLINE_LINUX_DEFAULT} aufs=tmpfs"'/ >/etc/grub.d/06_custom

sed -i.orig -e \
"/{GRUB_DISABLE_RECOVERY}\" != \"xtrue\" ]; then/s/^.*$/    \
if [ 0 ]; then/" \
/etc/grub.d/06_custom


sed -i.orig -e \
"/in_submenu=:/s/^.*$/    \
/" \
/etc/grub.d/06_custom

sed -i.orig -e \
"/\"Previous Linux versions/s/^.*$/    \
echo ''/" \
/etc/grub.d/06_custom

rm /etc/grub.d/06_custom.orig

chmod 755 /etc/grub.d/06_custom

update-grub
update-initramfs -u
BBK
quelle
1
Danke ... ich glaube ich verstehe jetzt, wie aufs verwendet werden könnte, um das Flash-Laufwerk zu schützen. Ich verstehe immer noch nicht, warum LVM, aber Ihre Antwort ist die bisher beste, und es scheint nicht, dass es
derzeit
Mit LVM auf Flash-Laufwerk ist es in Zukunft einfacher, Ihr System auf ein anderes Flash-Laufwerk zu verschieben.
BBK
Mein Ziel war es nur, es zu einem anderen Flash zu machen
Galets
Um meinen letzten Kommentar zu verdeutlichen: Mein Plan war es, einfach einen Blitz auf einen anderen zu
werfen
Falls Sie das gesamte System einmal auf ein anderes Flash-Laufwerk kopieren müssen, dieses jedoch etwas kleiner (oder größer, warum Platz in der Taille) ist, was werden Sie tun? dd wird nicht helfen. Damit LVM (oder so ähnlich) die Zukunft für * nix-Systeme darstellt, wird es in Zukunft einfacher sein, Ihr System zu warten.
BBK
1

Ich möchte die gleiche Frage stellen und auch genau das Gleiche tun. Hilft diese Antwort?

Wie optimiere ich das Betriebssystem für SSDs?

Diese Links sehen auch sehr nützlich aus, obwohl ich nicht für die Richtigkeit der Informationen bürgen kann

http://bernaerts.dyndns.org/linux/53-debian-server-compact-flash

http://www.chrisnewland.com/ using-linux-tmpfs-to-reduce-disk-writes-for-power-saving-and-longer-cf-lifespan-186

Ich denke, wenn Sie diese Dinge erledigt haben, müssen Sie überwachen, um zu sehen, was Ihre spezifischen Anwendungen auf das Boot-Flash-Laufwerk schreiben. Gibt es eine einfache Möglichkeit, festzustellen, was auf ein bestimmtes Laufwerk geschrieben wird?

Amir
quelle