Installer Ubuntu Server sur un lecteur flash, en permanence


20

Tout d'abord, je voulais m'assurer, il y a une compréhension de ce que ce poste n'est PAS sur:

Ce que je cherche à faire, c'est d'avoir un serveur NAS (fichier) domestique qui démarre à partir d'une clé USB ou d'une carte CF. Il n'est pas pertinent pour le point de cet article comment le lecteur flash est connecté (USB, IDE, d'une autre manière), ce qui est pertinent: je veux avoir un démarrage complet de l'installation du système d'exploitation et exécuter à partir du lecteur flash. Les raisons pour lesquelles je veux spécifiquement ce type d'installation sont: je veux pouvoir faire facilement une copie de sauvegarde du système d'exploitation (image du flash), je veux m'assurer que je peux échanger le système d'exploitation instantanément et le démarrer (en remplaçant le lecteur flash ), et je souhaite que les lecteurs d'un serveur de fichiers soient remplaçables séparément du système d'exploitation.

Je suis conscient qu'il est possible de formater simplement le lecteur flash en ext2 et de l'installer dessus. Ce que je recherche, ce sont des recommandations pour créer une solution plus robuste. Voici quelques articles que je cherche à faire:

  • configurer la partition racine comme YAFF2, ou LogFS, ou comme un autre système de fichiers spécialement conçu pour les lecteurs flash.
  • reconfigurer le système d'exploitation de base pour minimiser les écritures (ramfs dans / tmp et autres)

Veuillez soumettre vos recommandations. Je me demande si Ubuntu est même applicable à un tel scénario vraiment ...

Je veux clarifier un peu mon objectif. Les disques SSD standard comportent des firmwares qui maintiendront le disque en vie pendant longtemps en utilisant des astuces, telles que: réallouer constamment les écritures vers de nouveaux secteurs. Les clés USB n'ont pas de micrologiciel de ce type, donc l'utilisation d'un système de fichiers standard pourrait les tuer rapidement. Je cherche s'il est possible d'émuler le firmware SSD en utilisant un système de fichiers conçu pour le flash. Dans un sens, j'essaie de faire en sorte que la clé USB puisse faire fonctionner un système de manière normale, comme s'il s'agissait d'un SSD réel.


1
J'allais le demander dans quelques heures, +1.
Bruno Pereira

1
Certaines informations de la réponse liée sont pertinentes, en particulier l' noatimeindicateur et d'autres astuces pour ne pas écrire sur le lecteur. Je pense vraiment que votre question ne concerne pas l'installation sur un lecteur flash (car cela est bien répondu) mais plutôt comment minimiser les écritures sur le lecteur.
Huckle

@Huckle, je préfère une réponse plus complète. Je veux exécuter le système d'exploitation d'une manière optimisée pour un lecteur flash. Minimiser les écritures en fait partie, mais ce n'est pas la réponse. Je voudrais exécuter le système d'exploitation en utilisant un système de fichiers qui cible spécifiquement les lecteurs flash
galets

Pourquoi ne pas l'essayer? J'ai installé Linux normalement de cette façon et cela fonctionne très bien.
bntser

@bntser il ne s'agit PAS simplement de démarrer à partir de l'USB
galets

Réponses:


1

Utilisez LVM . Dans ce cas, vous pouvez utiliser des instantanés - des clones instantanés de votre système, vous pouvez donc facilement copier l'intégralité du système ou simplement le migrer entre des lecteurs flash *.

Et si vous souhaitez avoir une sorte de "nivellement par l'usure" , vous pouvez utiliser des aufs pour le système de fichiers racine sur flash USB . Vous n'avez donc pas besoin d'utiliser YAFF2, etc., ext4 ira bien.

* Mais / boot, vous devrez toujours copier manuellement + vous devrez modifier l'UUID de grub / disk . Vous aurez besoin d'un CD de secours pour redimensionner le volume racine à la taille de la mémoire flash USB. Et au cas où vous vous briseriez, lisez ce manuel .

J'ai écrit le manuel pour ça.


Merci pour la réponse, mais comment les aufs abordent-ils le nivellement de l'usure? Je ne vois aucune indication que ce soit le cas
galets

Je veux dire une sorte de "nivellement par l'usure". Aufs vous aidera à sauvegarder votre USB FlashDrive. En fait, FlashDrive devient en lecture seule et tous les écrits / modifications seront stockés dans la mémoire RAM.
BBK

Attendez un peu. Je vais ajouter un guide complet pour effectuer le redimensionnement et la migration de la racine lvm vers Flash Drive + aufs dans un certain temps, après avoir corrigé quelques bugs. Je fais aussi un serveur NAS domestique.
BBK

4

Si vous avez Ubuntu sur le disque dur avec LVM (le serveur Ubuntu utilise LVM par défaut).

Ces scripts ont été testés sur le serveur Ubuntu Oneiric 11.10 x86_64 3.0.0-16 avec les applications suivantes:

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

Étape 1. Raccourcissez root FS à la taille de votre FlashDrive ou plus petit. Ignorez cette étape si la taille de votre racine FS est identique ou inférieure à celle du FlashDrive.

Démarrez avec Resc CD pour monter votre partition racine. Exécutez les commandes suivantes:

#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

Étape 2. Préparation de FlashDrive: pour la migration

jetez un oeil à votre ancien UUID racine

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) Si votre grub est chargé mais qu'il ne parvient pas à charger le système d'exploitation, lisez d'abord cet article . essayez la commande ls pour comprendre ce que grub voit.

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

Après un démarrage réussi, les modifications ne sont pas permanentes, vous devez donc mettre à jour grub

update-grub

B) Si vous ne voyez pas du tout grub, utilisez le CD Rescue pour démarrer.

#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

Étape 3. AUFS pour le système de fichiers racine sur le lecteur flash USB.

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

Maintenant, créez le fichier / etc / initramfs-tools / scripts / init-bottom / __ rootaufs et placez le script suivant:

#!/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

Après avoir besoin de modifier les autorisations pour ce fichier:

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

Étape 4. Modification de GRUB2.

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

1
Merci ... Je pense que je comprends maintenant comment les aufs pourraient être utilisés pour protéger le lecteur flash. Je n'arrive toujours pas à comprendre pourquoi LVM, mais votre réponse est la meilleure jusqu'à présent, et il ne semble pas qu'il y ait de meilleure solution pour le moment
galets

Avec LVM sur lecteur flash, il sera plus facile de déplacer votre système vers un autre lecteur flash à l'avenir.
BBK

Mon objectif était juste de le faire dans un autre flash
galets

Juste pour clarifier mon dernier commentaire: mon plan était simplement de dd un flash sur un autre et de le garder dans le coffre-fort, au cas où j'en aurais besoin pour la récupération
galets

Dans le cas où une fois que vous aurez besoin de copier le système entier sur un autre lecteur flash mais qu'il sera légèrement plus petit (ou plus grand, pourquoi un espace à la taille), que ferez-vous? dd n'aidera pas. LVM (ou quelque chose comme ça) est donc l'avenir des systèmes * nix, il sera plus facile de maintenir votre système à l'avenir.
BBK

1

Je veux poser la même question et faire exactement la même chose aussi. Cette réponse est-elle utile?

Comment optimiser le système d'exploitation pour les SSD?

ces liens semblent également très utiles bien que je ne puisse pas garantir l'exactitude des informations

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

Je suppose qu'une fois que vous avez fait ces choses, vous devrez surveiller pour voir ce que vos applications spécifiques écrivent sur le lecteur flash de démarrage. Existe-t-il un moyen simple de voir ce qui est écrit sur un lecteur donné?

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.