Cài đặt Ubuntu Server vào ổ đĩa flash, vĩnh viễn


20

Điều đầu tiên, tôi muốn chắc chắn, có một sự hiểu biết về bài đăng này KHÔNG phải là về:

Những gì tôi đang tìm kiếm là có một máy chủ NAS (tệp) tại nhà khởi động từ thẻ nhớ USB hoặc thẻ CF. Không liên quan đến điểm của bài đăng này về cách ổ đĩa flash được kết nối (USB, IDE, một số cách khác), có liên quan: Tôi muốn có toàn bộ cài đặt hệ điều hành khởi động và chạy từ ổ đĩa flash. Những lý do tôi muốn cụ thể loại cài đặt này là: Tôi muốn có thể dễ dàng tạo một bản sao dự phòng của hệ điều hành (hình ảnh flash), tôi muốn đảm bảo rằng tôi có thể trao đổi hệ điều hành ngay lập tức và khởi động nó (bằng cách thay thế ổ đĩa flash ) và tôi muốn các ổ đĩa trên một máy chủ tệp có thể thay thế riêng biệt với HĐH.

Tôi biết rằng có thể chỉ cần định dạng ổ đĩa flash là ext2 và cài đặt trên nó. Những gì tôi đang tìm kiếm là các khuyến nghị để tạo ra giải pháp mạnh mẽ hơn. Dưới đây là một vài mục tôi đang muốn làm:

  • cấu hình phân vùng gốc là YAFF2 hoặc LogFS hoặc như một số hệ thống tệp khác được thiết kế dành riêng cho ổ đĩa flash.
  • cấu hình lại hệ điều hành cơ sở để giảm thiểu việc ghi (ramfs in / tmp và như vậy)

Vui lòng gửi đề xuất của bạn. Tôi tự hỏi nếu Ubuntu thậm chí có thể áp dụng cho kịch bản như vậy thực sự ...

Tôi muốn làm rõ mục tiêu của tôi một chút. Các ổ SSD thông thường có các phần cứng sẽ giữ cho ổ đĩa tồn tại trong một thời gian dài bằng cách sử dụng các thủ thuật, chẳng hạn như: liên tục tái phân bổ ghi vào các lĩnh vực mới. Các thanh USB không có phần sụn như vậy, vì vậy sử dụng hệ thống tệp thông thường có thể tiêu diệt chúng nhanh chóng. Tôi đang tìm kiếm nếu có thể mô phỏng firmware SSD bằng cách sử dụng hệ thống tệp được thiết kế cho flash. Theo một nghĩa nào đó, tôi đang cố gắng làm cho nó để ổ USB có thể chạy một hệ thống theo cách thông thường, như thể đó là một ổ SSD thực sự.


1
Sẽ hỏi điều này trong vài giờ nữa, +1.
Bruno Pereira

1
Một số thông tin trong câu trả lời được liên kết có liên quan, đặc biệt là noatimecờ và các thủ thuật khác để không ghi vào ổ đĩa. Tôi nghĩ thực sự câu hỏi của bạn không phải là về việc cài đặt vào ổ flash (vì điều đó đã được trả lời tốt) mà là làm thế nào để giảm thiểu việc ghi vào ổ đĩa.
Huckle

@Huckle Tôi thích câu trả lời toàn diện hơn. Tôi muốn được chạy HĐH theo cách được tối ưu hóa cho ổ đĩa flash. Giảm thiểu viết là một phần của nó, nhưng nó không phải là câu trả lời. Tôi muốn chạy HĐH bằng hệ thống tệp nhắm mục tiêu cụ thể vào ổ đĩa flash
galets

Tại sao không thử nó? Tôi đã cài đặt Linux bình thường theo cách này và nó hoạt động tốt.
bntser

@bntser đây KHÔNG chỉ đơn giản là khởi động từ USB
galets

Câu trả lời:


1

Sử dụng LVM . Trong trường hợp này, bạn có thể sử dụng ảnh chụp nhanh - bản sao tức thời của hệ thống, do đó bạn có thể dễ dàng sao chép toàn bộ hệ thống hoặc chỉ cần di chuyển giữa các ổ đĩa flash *.

Và nếu bạn muốn có loại " Cân bằng hao mòn" , bạn có thể sử dụng aufs cho hệ thống tập tin gốc trên flash USB . Vì vậy, bạn không phải sử dụng YAFF2, vv, ext4 sẽ ổn.

* Nhưng / boot bạn sẽ luôn cần sao chép thủ công + bạn sẽ cần sửa đổi UUID của grub / đĩa . Bạn sẽ cần đĩa CD cứu hộ trong trường hợp thay đổi kích thước âm lượng gốc theo kích thước của USB Flash. Và trong trường hợp bạn sẽ phá vỡ grub đọc hướng dẫn này .

Tôi đã viết hướng dẫn cho điều đó.


Cảm ơn câu trả lời, nhưng làm thế nào để aufs mặc địa chỉ san bằng? Tôi thấy không có dấu hiệu nào cho thấy điều đó
galets

Tôi có nghĩa là loại "Mặc cân bằng". Aufs sẽ giúp bạn lưu USB FlashDrive của bạn. Trên thực tế FlashDrive trở thành chỉ đọc và tất cả các bài viết / thay đổi sẽ được lưu trữ trong bộ nhớ RAM.
BBK

Đợi một thời gian. Tôi sẽ thêm hướng dẫn đầy đủ để thực hiện thay đổi kích thước gốc lvm + di chuyển sang Flash Drive + aufs sau một thời gian, sau khi sửa một số lỗi. Tôi cũng làm máy chủ NAS.
BBK

4

Nếu bạn tình cờ có Ubuntu tại HDD với LVM (Máy chủ Ubuntu sử dụng LVM theo mặc định).

Tập lệnh này đã được thử nghiệm trong máy chủ Ubuntu Oneiric 11.10 x86_64 3.0.0-16 với các ứng dụng tiếp theo:

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

Bước 1. Thu nhỏ gốc FS theo kích thước FlashDrive của bạn hoặc nhỏ hơn. Bỏ qua bước này nếu kích thước FS gốc của bạn giống hoặc nhỏ hơn FlashDrive.

Khởi động với Resc CD gắn phân vùng gốc của bạn. Chạy các lệnh tiếp theo:

#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

Bước 2. Chuẩn bị FlashDrive: để di chuyển

hãy nhìn vào UUID gốc của bạn

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) Nếu grub của bạn được tải nhưng nó không thể tải HĐH lần đầu tiên trong bài viết này . thử lệnh ls để tìm ra những gì grub nhìn thấy.

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

Sau khi khởi động thành công các thay đổi không vĩnh viễn, vì vậy bạn phải cập nhật grub

update-grub

B) Nếu bạn hoàn toàn không thấy grub, hãy sử dụng Cứu CD để khởi động.

#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

Bước 3. AUFS cho hệ thống tập tin gốc trên ổ đĩa 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

Bây giờ tạo tập tin / etc / initramfs-tools / scripts / init-bottom / __ rootaufs và đặt tập lệnh tiếp theo:

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

Sau khi chúng tôi cần thay đổi quyền cho tệp này:

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

Bước 4. Thay đổi 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
Cảm ơn ... Tôi nghĩ bây giờ tôi đã hiểu làm thế nào aufs có thể được sử dụng để bảo vệ ổ đĩa flash. Tôi vẫn không hiểu tại sao LVM, nhưng câu trả lời của bạn là tốt nhất cho đến nay và dường như không có giải pháp nào tốt hơn vào lúc này
galets

Với LVM trên flash Drive, việc chuyển hệ thống của bạn sang ổ flash khác sẽ dễ dàng hơn trong tương lai.
BBK

Mục tiêu của tôi chỉ là đưa nó sang một đèn flash khác
galets

Chỉ cần làm rõ nhận xét cuối cùng của tôi: Kế hoạch của tôi chỉ là đưa một đèn flash vào một cái khác và giữ nó an toàn, trong trường hợp tôi cần nó để phục hồi
galets

Trong trường hợp một khi bạn sẽ cần sao chép toàn bộ hệ thống sang ổ đĩa flash khác nhưng nó sẽ nhỏ hơn một chút (hoặc lớn hơn, tại sao không gian eo), bạn sẽ làm gì? dd sẽ không giúp đỡ. Vì vậy LVM (hoặc một cái gì đó tương tự) là tương lai cho các hệ thống * nix, việc duy trì hệ thống của bạn trong tương lai sẽ dễ dàng hơn.
BBK

1

Tôi muốn hỏi cùng một câu hỏi và làm chính xác điều tương tự. Câu trả lời này có giúp ích không?

Làm cách nào để tối ưu hóa HĐH cho SSD?

các liên kết này cũng có vẻ rất hữu ích mặc dù tôi không thể đảm bảo tính chính xác của thông tin

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

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

Tôi đoán một khi bạn đã thực hiện những điều đó bạn sẽ cần theo dõi để xem những gì ứng dụng cụ thể của bạn đang ghi vào ổ đĩa flash khởi động. Có cách nào dễ dàng để xem những gì đang ghi vào một ổ đĩa nhất định không?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.