Sistem akan berjalan lebih baik dan kartu akan bertahan lebih lama dengan lebih banyak ruang kosong di partisi utama Anda, jadi jangan menyusut terlalu banyak - pertahankan setidaknya dua kali lipat penggunaan Anda (misalnya, jika sistem Anda 2-3 GB gunakan Kartu 8GB, dan kembangkan partisi untuk mengisi semua ruang yang tersedia). Perhatikan bahwa jika Anda tidak menumbuhkan partisi untuk memulai, itu tidak akan menjadi 32 GB, jadi Anda mungkin tidak perlu mengecilkannya.
goldilocks
Terima kasih telah menunjukkan ini, tetapi Raspberry saya saat ini hanya menggunakan 1,8 GB karena ini adalah instalasi yang sangat dasar. Jadi saya kira 4 GB sudah cukup.
mwld
Saya kira saya mengembangkannya sampai ukuran penuh ketika saya pertama kali menginstal Debian Wheezy. Sekarang saya mengecilkannya menjadi 2,5 GB tetapi masih tidak berhasil. Lihat komentar saya di bawah ini.
Jika salah satu jawaban di bawah ini memuaskan pertanyaan Anda, silakan periksa jawabannya.
Wes Mode
Jawaban:
12
Dalam jawaban ini, saya menunjukkan apa yang harus dilakukan selangkah demi selangkah bagi orang untuk memahami logika di balik solusi dan untuk dapat menerapkan langkah-langkah dalam masalah mereka yang lain.
Tetapi pertama-tama, harus dinyatakan bahwa ini adalah masalah generik (tidak spesifik raspi) untuk memigrasi sistem file dari kartu SD ke kartu SD yang lebih kecil (tapi cukup besar untuk data).
Persyaratan
Laptop dengan pembaca kartu micro SD dan Linux (saya lebih suka Ubuntu) berjalan di atasnya.
Singkatan
PIBOX : Raspberry Pi which is used
SD_CARD_A : 8GB micro SD card which is used on PIBOX and on which Raspbian-lite (the OS) is installed
SD_CARD_B : 2GB micro SD card which will be used on PIBOX and on which Raspbian-lite (the OS) will be installed
Partisi SD_CARD_A
Ketika PIBOX sedang berjalan, kami mencantumkan partisi (partisi sistem yang tidak perlu tidak ditampilkan di sini).
root@pibox:~# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/root ext4 7.3G 1.1G 5.9G 16% /
/dev/mmcblk0p1 vfat 63M 21M 43M 33% /boot
Ada 2 partisi di SD_CARD_A sebagai /dan /boot. Bahkan 2GB tidak digunakan secara total.
Cadangkan SD_CARD_A
Setelah kami mematikan dan menghentikan PIBOX, kami mengeluarkan SD_CARD_A dari papan PIBOX dan memasukkannya ke pembaca kartu laptop kami.
Partisi SD_CARD_A secara otomatis dipasang ke sistem kami sebagai /dev/sdc1dan /dev/sdc2.
root@mylaptop:~# resize2fs /dev/loop0p2 3710940s
resize2fs 1.42.9 (4-Feb-2014)
Resizing the filesystem on /dev/loop0p2 to 463867 (4k) blocks.
The filesystem on /dev/loop0p2 is now 463867 blocks long.
Partisi menyusut
Kami mengetahui nomor THE_PARTITION itu parted.
root@mylaptop:~# parted /dev/loop0
GNU Parted 2.3
Using /dev/loop0
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Model: Loopback device (loop)
Disk /dev/loop0: 7969MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 4194kB 70.3MB 66.1MB primary fat16 lba
2 70.3MB 7969MB 7899MB primary ext4
(parted) quit
Kami menyusutkan THE_PARTITION dengan parted.
root@mylaptop:~# parted /dev/loop0 unit s resizepart 2 3848155
Warning: Shrinking a partition can cause data loss, are you sure you want to continue?
Yes/No? Yes
Kami selesai dengan perangkat loopback. Kami lepaskan itu.
root@mylaptop:~# losetup -d /dev/loop0
Memotong file gambar
Kami memverifikasi tabel partisi baru.
root@mylaptop:~# fdisk -l pibox.img
Disk pibox.img: 7969 MB, 7969177600 bytes
255 heads, 63 sectors/track, 968 cylinders, total 15564800 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
Disk identifier: 0x2019f6d8
Device Boot Start End Blocks Id System
pibox.img1 8192 137215 64512 c W95 FAT32 (LBA)
pibox.img2 137216 3848155 1855470 83 Linux
Dalam output, terlihat jelas bahwa jumlah blok akhir THE_PARTITION berkurang from 15564799 to 3848155.
Blok terakhir yang kami gunakan adalah 3848155. Penomoran blok dimulai dari 0. Jadi, kami memiliki 3848155 +1 blok total dan ukuran baru file pibox.img seharusnya 1970255872 bytes (= (3848155 + 1) * 512).
Bagus Saya pikir beberapa barang Anda dengan mengatur loopback mungkin panjang lebar dan tidak perlu, Anda mungkin ingin memeriksanya. Sesuatu yang sangat mirip dari pertanyaan yang sangat mirip: raspberrypi.stackexchange.com/a/29952/5538
goldilocks
@goldilocks, tidak diuji tetapi saya pikir menggunakan loopback diperlukan. Sejauh yang saya tahu bahwa parted tidak dapat bekerja pada file gambar secara langsung, perlu antarmuka perangkat untuk operasinya.
vaha
Ya tapi saya pikir Anda akan menemukan Anda tidak perlu repot losetupatau bahkan -o loop=whatever. Per posting lain saya hanya menggunakan mount -o offset=123 /imagefilepath /mntpointdan penggunaan loopback adalah implisit. Saya kira itu umumnya berlaku di linux sekarang - coba dan lihat. Anda kemudian dapat mengurangi itu hanya mengatakan partisi dipasang melalui "perangkat loopback" virtual.
goldilocks
5
Saat Anda menggunakan dd if=/dev/sdx of=/path/to/image bs=1M, /dev/sdxmerujuk ke seluruh "disk", sehingga gambar akan selalu menjadi ukuran seluruh kartu.
Sebagai gantinya, Anda harus menggunakan di dd if=/dev/sdxn ...mana nnomor partisi.
Anda mungkin perlu melakukan ini dua kali - satu kali untuk /bootpartisi dan satu kali untuk /partisi.
Maka Anda harus membuat partisi pada kartu baru yang setidaknya sebesar dua yang asli, untuk menemukan kembali konten.
Gunakan sesuatu seperti parted (editor partisi) untuk mengecilkan partisi utama ke ukuran yang lebih kecil dan kemudian menggunakan alat seperti Clonezilla untuk menyalin dari partisi yang sekarang lebih kecil ke kartu baru Anda. Anda mungkin harus melakukan ini di komputer lain.
Sayangnya ini tidak berhasil. Saya menyusutkan partisi menjadi 2,5 GB dengan GParted. Tetapi ketika saya mencoba untuk membuat gambar dari itu ke USB stick itu mendapat cara yang lebih besar (4,3 GB - tapi saya pikir itu ingin menyalin seluruh 32 GB dan hanya berhenti di 4,3 GB karena keterbatasan ukuran file FAT).
Apakah Anda punya ide tentang bagaimana saya bisa menyalin partisi utama dengan 2,5 GB ke dalam gambar dan masih membuat kartu SD dengan Raspbian bootable dari itu?
mwld
Maaf atas respons yang terlambat. Saya mulai dengan kartu SD 4GB, membuat gambar, dan kemudian menulis gambar itu ke 8GB dan kartu yang lebih besar. Saya belum perlu menggunakan partisi yang lebih besar untuk apa pun yang saya kerjakan. Saya tidak tahu alat yang hanya akan membiarkan Anda membuat gambar partisi individu pada kartu SD.
Saya menemukan halaman ini karena saya mencoba untuk mencapai target yang sama untuk memiliki cadangan gambar raspbian saya namun saya tidak ingin seluruh kartu HANYA seluruh data yang relevan pada kartu. Sesuai saran di atas, saya sedang mencari skrip di sini sirlagz.net/2013/03/10/script-automatic-rpi-image-downsizer tetapi tidak dapat menemukannya. dapatkah ada satu pembaruan pada tautan ini jika tersedia di suatu tempat?
shallyverma
Saya masih dapat mengakses tautan dan posnya sendiri adalah sebuah skrip. Salin skrip ke dalam file dan beri nama script.sh, Jadikan file itu dapat dieksekusi menggunakan chmoddan jalankan.
Mihir
1
Saya telah menggunakan rsyncuntuk menyalin sistem file dari satu disk ke disk lain untuk sementara waktu sekarang, tanpa cegukan. Keuntungan menggunakan rsync adalah menyalin konten sistem file, daripada melakukan salinan level-blok perangkat; sebagai hasilnya, itu benar-benar tidak peduli berapa ukuran drive target dan sumber, asalkan drive target memiliki cukup ruang untuk menyimpan data.
Jadi, inilah cara saya akan melakukannya:
Buat instalasi raspbian baru di kartu SD Anda yang baru dan lebih kecil yang Anda inginkan.
Boot ke instalasi baru dan perluas sistem file untuk mengisi seluruh disk. Matikan pi.
Sekarang pasang kartu baru dan lama dan gunakan rsync -avx oldFilesystem newFilesystemuntuk menyalin / menimpa sistem file pada kartu baru dengan sistem file dari kartu lama.
Terakhir, boot ke sistem baru Anda, dan jalankan rpi-updateuntuk memastikan bahwa firmware Anda konsisten dan terbaru.
Setelah ini, kartu baru Anda harus memiliki sistem Raspbian yang berfungsi sempurna.
Jadi untuk metode ini (Langkah 3), saya perlu 2 pembaca kartu SD?
Victor Van Hee
Baik dua pembaca kartu SD atau perangkat perantara. Anda dapat rsync sistem file lama ke folder di hard drive Anda, kemudian rsync folder itu ke kartu SD kedua, jika Anda tidak ingin mengambil pembaca.
sdenton4
1
Saya membuat skrip shell untuk membuat cadangan dan memulihkan semua data pada Kartu SD. Pertama menghapus beberapa data (sesuai dengan proyek saya) dan menyusutkan partisi ke ukuran minimum sehingga gambar sebesar data pada kartu SD. Sebagai tambahan, skrip membuat file * .zip dari gambar. Setelah mengembalikan gambar yang dibuat ke Kartu SD lain, partisi akan diperbesar ke ukuran maksimum. Script menggunakan perintah yang disebutkan dalam jawaban lain. Karena ini adalah skrip shell kepalan tanganku dengan ukuran ini, aku butuh waktu berjam-jam untuk membuatnya dan itu bukan jet sempurna. Terutama saya tidak tahu bagaimana menangani nilai kembali dari resize2fs dan fdisk sehingga pengguna harus mengetikkan nilai yang saya butuhkan. Apakah ada ide untuk memperbaikinya? Saya harap skrip ini membantu orang lain. Jangan ragu untuk mengedit dan memperbaikinya.
"Usage:
<skriptname> -b <path> create backup of SC Card (dev/mmcblk0) to file <path>/JJJJ-MM-DD_HHMM.img
<skriptname> -r <path>/FILENAME.img restore an exitsting image (<path>/FILENAME.img) to the SD Card (dev/mmcblk0)
<skriptname> -r <path>/FILENAME.zip unzip and restore an exitsting image (<path>/FILENAME.zip) to the SD Card (dev/mmcblk0)
<skriptname> -h show this hlep
ini dia:
#!/bin/bash
# check if the user is root
if (( $EUID != 0 )); then
echo "This script requires root privileges please run as root"
exit
fi
while getopts ":b:r:h" opt; do
case $opt in
b)
mode="backup"
OUTPATH=$OPTARG
;;
r)
mode="restore"
DIRFILENAME=$OPTARG
;;
h)
mode="help"
;;
\?)
echo "Invalid option: -$OPTARG. Use -h for help" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument. Use -h for help" >&2
exit 1
;;
esac
done
# no option
if [ $OPTIND == 1 ]
then
echo "$(basename "$0") needs an option! Use -h for help"
exit 1
fi
myMount(){
# create mountpoint if not existing
if [ ! -d /tmp/sd2/ ] ; then
mkdir /tmp/sd2
fi
# mount partition
mount -v -t ext4 /dev/mmcblk0p2 /tmp/sd2
err=$?
if [ $err != 0 ]; then
echo "mount failed error: $err"
exit 1
fi
}
myUmount(){
cd /home/ # otherwise umount will fail
# fuser -vm /tmp/sd2/
# umount partition
umount -v /tmp/sd2
err=$?
if [ $err != 0 ]; then
echo "umount failed error: $err"
exit 1
fi
}
myEnlarge(){
echo "enlarge partition..."
# enlarge partition is not posible with fdisk -> delete and recreate it
(
echo d # delete partition
echo 2 # patition number
echo n # add a new partition
echo p # primary partition
echo 2 # partition number
echo # first sector (accept default: varies)
echo # last sector (accept default: varies)
echo w # write changes
) | fdisk /dev/mmcblk0
echo "\n check filesystem... "
e2fsck -f -v -C 0 /dev/mmcblk0p2
# enlarge filesystem to maxsize
resize2fs -p /dev/mmcblk0p2
}
case "$mode" in
"help")
echo "Usage:
$(basename "$0") -b <path> create backup of SC Card (dev/mmcblk0) to file <path>/JJJJ-MM-DD_HHMM.img
$(basename "$0") -r <path>/FILENAME.img restore an exitsting image (<path>/FILENAME.img) to the SD Card (dev/mmcblk0)
$(basename "$0") -r <path>/FILENAME.zip unzip and restore an exitsting image (<path>/FILENAME.zip) to the SD Card (dev/mmcblk0)
$(basename "$0") -h show this hlep
--------------------------------
Adrian Zeitler, Germany 2017"
;;
"backup") ####################################### backup #######################################
echo "an image of the SD Card (/dev/mmcblk0) whitch is as smal as possible will be created to $OUTPATH."
# ------------------ delete some data --------------------
echo "Do you want to delete tempfiles? [y/n]"
read delfiles
if [ "$delfiles" = "y" ]
then
echo "Delete tempfiles..."
myMount
# remove some data
cd /tmp/sd2/home/alarm/
rm -v -f hagelbeere.db
rm -v -f HAILcam.log
rm -v -f HAILcam.log.1
rm -v -f test.jpg
myUmount
elif [ "$delfiles" = "n" ]
then
echo "I don't delete anything."
else
echo "Sorry, I didn't understand."
exit 1
fi
# --------------------------------------------------------------
# shrink partition 2 to minimum size
echo "check file system... "
e2fsck -f -v -C 0 /dev/mmcblk0p2
err=$?
if [ $err != 0 ]; then
echo "file system check failed, error: $err"
exit 1
fi
echo "shrink filesystem of partition 2 to minimum size..."
resize2fs -p -M /dev/mmcblk0p2
err=$?
if [ $err != 0 ]; then
echo "resize2fs failed, error: $err"
exit 1
fi
# --> Das Dateisystem auf /dev/mmcblk0p2 ist nun 692365 Blöcke groß.
echo "Please tell me the new filesystem size displayed above:"
read size
# from resize2fs blocksize, fdisk wants sector: sector = block * 8
size=$(( $size*8 ))
# shrink partition is not posible with fdisk -> delete and recreate it
(
echo d # delete partition
echo 2 # patition number
echo n # add a new partition
echo p # primary partition
echo 2 # partition number
echo # first sector (accept default: varies)
echo +$size # last sector
echo w # write changes
) | fdisk /dev/mmcblk0
err=$?
if [ $err != 0 ]; then
echo "fdisk failed, error: $err"
exit 1
fi
# --------------------------------------------------------------
# fill unused space with zeros
echo "Do you want to fill unused space with zeros? [y/n]"
read fillzeros
if [ "$fillzeros" = "y" ]
then
echo "Copy zeros. This will end up with an error. But this is ok."
myMount
dd if=/dev/zero | pv | dd of=/tmp/sd2/nullen.datei conv=noerror,notrunc,sync bs=10240
# exits with error -> this is normal
# dlelete zeros
rm -v -f /tmp/sd2/nullen.datei
sync
myUmount
elif [ "$fillzeros" = "n" ]
then
echo "I don't delete anything."
else
echo "Sorry, I didn't understand."
exit 1
fi
# --------------------------------------------------------------
# find out end of partition
fdisk -l /dev/mmcblk0
echo "Please tell me the end of mmcblk0p2 displayed above."
read count
DATE=$(date +"%Y-%m-%d_%H%M")
IMGFILENAME=$DATE.img
echo "Do you want to create image with filename $OUTPATH$IMGFILENAME? [y/n]"
read answer
if [ "$answer" = "y" ]
then
echo "Do you want to create a *.zip file of the created image? [y/n]"
read zip
echo "Do you want to enlarge partition 2 to maxsize after image creation? [y/n]"
read enlarge
echo "create image..."
cd $OUTPATH
# create image with dd, stop at and of partition
# count=N copy only N input blocks
# bs=BYTES read and write up to BYTES bytes at a time = block size
# pv show status
dd if=/dev/mmcblk0 | pv -s $(( $count*512 )) | dd of=$IMGFILENAME bs=512 count=$count
err=$?
if [ $err != 0 ]; then
echo "dd failed error: $err"
exit 1
fi
# --------------------------------------------------------------
# create zip file
# or like this:
# sudo dd if=/dev/sdX | pv |gzip > /pfad/zur/datei.img.gz
if [ "$zip" = "y" ]
then
echo "create zip file..."
zip $DATE.zip $IMGFILENAME
fi
# --------------------------------------------------------------
fi
# --------------------------------------------------------------
# enlarge partition 2
if [ "$enlarge" = "y" ]
then
myEnlarge
fi
;; #end case mode backup
"restore") ####################################### restore #######################################
#chek if image exists
if [[ -s "$DIRFILENAME" ]]
then
# check if file is an image or zip file
if [[ $DIRFILENAME =~ \.img$ ]]
then
IMGFILENAME=$(basename "$DIRFILENAME")
elif [[ $DIRFILENAME =~ \.zip$ ]]
then
ZIPFILENAME=$(basename "$DIRFILENAME")
else
echo "Not the right file format. I accept *.img and *.zip"
exit 1
fi
else
echo "Image file does not exist."
exit 1
fi
echo "the file $DIRFILENAME will be restored to the SD Card /dev/mmcblk0"
#change to the path of the imagefile
SOURCEPATH=$(dirname "$DIRFILENAME")
cd $SOURCEPATH
if [ "$ZIPFILENAME" != "" ]
then
echo "unzip file"
# change file extention form zip zu img
l=$(( ${#ZIPFILENAME}-3 ))
IMGFILENAME="${ZIPFILENAME:0:l}img"
unzip $ZIPFILENAME
fi
echo "Do you realy want to restore $SOURCEPATH/$IMGFILENAME to the SD card /dev/mmcblk0?
Warning: all data on the device /dev/mmcblk0 will be lost! [y/n]"
read answer
if [ "$answer" = "y" ]
then
echo "Do you want to enlarge partition 2 to maxsize after restoring? [y/n]"
read enlarge
echo "restore image..."
filesize=$(wc -c <"$IMGFILENAME")
echo "Filesize = $filesize Byte"
dd if=$IMGFILENAME | pv -s $filesize | dd of=/dev/mmcblk0 bs=512
err=$?
if [ $err != 0 ]; then
echo "dd failed error: $err"
exit 1
fi
fi
# --------------------------------------------------------------
# enlarge partition 2
if [ "$enlarge" = "y" ]
then
myEnlarge
fi
;; #end case mode restore
esac
Solusi termudah yang saya temukan adalah melakukan pencadangan kartu yang lebih besar asli menggunakan perintah dd yang diuraikan di atas dan kemudian mengembalikan gambar ke kartu yang lebih kecil menggunakan sesuatu seperti penulis naskah. dd mungkin bekerja juga ... tidak yakin. PiWriter mengembalikan kesalahan karena kehabisan ruang, tetapi karena gambar tidak berisi data aktual di luar ukuran kartu yang lebih kecil itu hanya memotong sektor kosong. Saya tidak yakin apa implikasi dari ini adalah ... partisi mungkin perlu diperiksa atau diperbaiki tetapi saya dapat memverifikasi bahwa itu berhasil ketika saya memasukkannya ke dalam Pi.
ini adalah saran yang sangat berbahaya, Anda tidak akan pernah tahu apakah sebenarnya ada data di luar ukuran. kami mencari solusi kerja yang lebih andal dan terbukti.
Lenik
Saya hidup dengan berbahaya, apa yang bisa saya katakan;) Dalam semua keseriusan meskipun saya tidak punya banyak pengalaman bekerja dengan dd atau peta partisi jadi saya berada di wilayah yang belum dipetakan di sini. Saya mungkin beruntung karena saya hanya memiliki sekitar 800MB data dari kartu 16GB ke kartu 8GB. Karena penasaran, apakah mungkin ada cara untuk men-defrag data terlebih dahulu untuk memastikan semuanya dikelompokkan di awal partisi? Tampak hackish tapi mungkin?
Pooch
saya tidak tahu tentang defrag, tetapi Anda pasti dapat mengubah ukuran partisi Anda dan memindahkannya ke awal kartu SD, sehingga mereka hanya menempati awal. membutuhkan waktu sedikit lebih lama daripada dd sederhana, tetapi hasilnya jauh lebih dapat diandalkan.
lenik
0
Saya menggunakan versi lama win32diskimager-RELEASE-0.1-r15-win32untuk membaca gambar, itu menciptakan gambar 4GB bahkan dari kartu SD 8GB dan kemudian menulis gambar dengan versi terbaru win32diskimager.
Saya menggunakan versi yang lebih lama karena yang lama akan melewatkan setiap kesalahan.
Apakah tidak ada opsi di versi baru, 0,95, yang memungkinkan Anda melakukan hal yang sama, yaitu, lewati setiap kesalahan? Sayangnya halaman sourceforge tidak muncul untuk mencantumkan opsi yang tersedia. Sepertinya agak berisiko menggunakan perangkat lunak pra-beta
Greenonline
Saya tidak mendapatkan hangat-dan-fuzzies dari menggunakan program yang akan melewati setiap kesalahan.
Jawaban:
Dalam jawaban ini, saya menunjukkan apa yang harus dilakukan selangkah demi selangkah bagi orang untuk memahami logika di balik solusi dan untuk dapat menerapkan langkah-langkah dalam masalah mereka yang lain.
Tetapi pertama-tama, harus dinyatakan bahwa ini adalah masalah generik (tidak spesifik raspi) untuk memigrasi sistem file dari kartu SD ke kartu SD yang lebih kecil (tapi cukup besar untuk data).
Persyaratan
Laptop dengan pembaca kartu micro SD dan Linux (saya lebih suka Ubuntu) berjalan di atasnya.
Singkatan
Partisi SD_CARD_A
Ketika PIBOX sedang berjalan, kami mencantumkan partisi (partisi sistem yang tidak perlu tidak ditampilkan di sini).
Ada 2 partisi di SD_CARD_A sebagai
/
dan/boot
. Bahkan 2GB tidak digunakan secara total.Cadangkan SD_CARD_A
Setelah kami mematikan dan menghentikan PIBOX, kami mengeluarkan SD_CARD_A dari papan PIBOX dan memasukkannya ke pembaca kartu laptop kami.
Partisi SD_CARD_A secara otomatis dipasang ke sistem kami sebagai
/dev/sdc1
dan/dev/sdc2
.Kami unmount partisi tersebut dari sistem kami agar dapat beroperasi dengan sukses.
Kami menampilkan info perangkat SD_CARD_A secara detail untuk konfirmasi di langkah selanjutnya.
Di atas Anda dapat melihat bahwa SD_CARD_A memiliki kapasitas 8GB.
Kami mengkloning SD_CARD_A ke file pibox.img.
Periksa ukuran byte yang disalin, itu sama dengan nilai yang kami dapatkan dengan
fdisk -l /dev/sdc
perintah.Modul loopback Linux
Linux memiliki modul yang disebut loopback yang menyediakan kita untuk menangani file sebagai perangkat blok.
Kami memuat modul loopback.
Kami menemukan jalur perangkat loopback yang tidak digunakan.
Sekarang, kami membuat perangkat loopback untuk file pibox.img.
Kami memicu kernel tentang perubahan partisi.
Kami mengkonfirmasi jika operasi sebelumnya berhasil.
Kami menampilkan info perangkat loopback secara detail untuk membandingkannya dengan SD_CARD_A.
Di atas Anda dapat melihat bahwa ukuran perangkat loopback (= 7969177600 bytes) dan partisi sama dengan SD_CARD_A.
Matematika Dasar
Mulai sekarang, kita akan fokus pada partisi
/dev/loop0p2
. Sebut saja THE_PARTITION .Ukuran blok adalah 512 byte (seperti yang dicetak pada baris dimulai dengan Unit = sektor .....)
THE_PARTITION dimulai dari blok 137216 dan berakhir di blok 15564799 yang berarti memiliki ukuran
15427584 blocks
(= 15564799 - 137216 +1).Jadi, ukuran THE_PARTITION dalam byte adalah
7898923008 bytes
(= 512 * 15427584).Agar sesuai dengan THE_PARTITION dalam SD_CARD_B, kami ingin ukurannya baru
3710940 blocks
atau dengan kata lain1900001280 bytes
(= 512 * 3710940).Jadi, nomor blok akhir baru
3848155
dihitung denganstart block number
(= 137216) +size in blocks
(= 3710940) -1
.Filesystem vs. Partition
Ada 2 operasi yang tidak boleh keliru satu sama lain.
3710940 blocks
.3848155
.Menyusut sistem file
Sebelum menyusut sistem file, itu harus ditandai sebagai bersih oleh
e2fsck
.Kami menyusutkan sistem file dengan
resize2fs
.Partisi menyusut
Kami mengetahui nomor THE_PARTITION itu
parted
.Kami menyusutkan THE_PARTITION dengan
parted
.Kami selesai dengan perangkat loopback. Kami lepaskan itu.
Memotong file gambar
Kami memverifikasi tabel partisi baru.
Dalam output, terlihat jelas bahwa jumlah blok akhir THE_PARTITION berkurang
from 15564799 to 3848155
.Blok terakhir yang kami gunakan adalah
3848155
. Penomoran blok dimulai dari 0. Jadi, kami memiliki 3848155 +1 blok total dan ukuran baru file pibox.img seharusnya1970255872 bytes
(= (3848155 + 1) * 512).Kami memotong file pibox.img.
Kami memverifikasi ukuran baru file pibox.img.
Membuat SD_CARD_B
Kami memasukkan SD_CARD_B ke pembaca kartu laptop kami. Partisi SD_CARD_B secara otomatis dipasang ke sistem kami sebagai
/dev/sdc1
dan/dev/sdc2
.Di atas Anda dapat melihat bahwa SD_CARD_B memiliki kapasitas 2GB.
Kami melepas partisi tersebut dari sistem kami agar dapat beroperasi di SD_CARD_B dengan sukses.
Kami mengkloning pibox.img file ke SD_CARD_B.
Periksa ukuran byte yang disalin, itu sama dengan nilai yang kami dapatkan dengan
ls -l pibox.img
perintah.Booting PIBOX
Setelah kami mengeluarkan SD_CARD_B dari laptop kami dan memasukkannya ke papan PIBOX, kami mem-boot sistem dan masuk ke konsol PIBOX.
Kami mencantumkan partisi (beberapa partisi sistem lain yang tidak perlu tidak ditampilkan di sini).
sumber
losetup
atau bahkan-o loop=whatever
. Per posting lain saya hanya menggunakanmount -o offset=123 /imagefilepath /mntpoint
dan penggunaan loopback adalah implisit. Saya kira itu umumnya berlaku di linux sekarang - coba dan lihat. Anda kemudian dapat mengurangi itu hanya mengatakan partisi dipasang melalui "perangkat loopback" virtual.Saat Anda menggunakan
dd if=/dev/sdx of=/path/to/image bs=1M
,/dev/sdx
merujuk ke seluruh "disk", sehingga gambar akan selalu menjadi ukuran seluruh kartu.Sebagai gantinya, Anda harus menggunakan di
dd if=/dev/sdxn ...
manan
nomor partisi.Anda mungkin perlu melakukan ini dua kali - satu kali untuk
/boot
partisi dan satu kali untuk/
partisi.Maka Anda harus membuat partisi pada kartu baru yang setidaknya sebesar dua yang asli, untuk menemukan kembali konten.
sumber
Gunakan sesuatu seperti parted (editor partisi) untuk mengecilkan partisi utama ke ukuran yang lebih kecil dan kemudian menggunakan alat seperti Clonezilla untuk menyalin dari partisi yang sekarang lebih kecil ke kartu baru Anda. Anda mungkin harus melakukan ini di komputer lain.
sumber
dd if=/dev/sdx of=/path/to/image bs=1M
dari utas ini: raspberrypi.stackexchange.com/questions/311/…Buat gambar kartu menggunakan salah satu metode yang telah disebutkan - Bagaimana cara mencadangkan Raspberry Pi saya?
Gunakan skrip di http://sirlagz.net/2013/03/10/script-automatic-rpi-image-downsizer/ untuk memperkecil ukuran gambar
Kembalikan gambar yang dirampingkan pada kartu yang lebih kecil
sumber
script.sh
, Jadikan file itu dapat dieksekusi menggunakanchmod
dan jalankan.Saya telah menggunakan
rsync
untuk menyalin sistem file dari satu disk ke disk lain untuk sementara waktu sekarang, tanpa cegukan. Keuntungan menggunakan rsync adalah menyalin konten sistem file, daripada melakukan salinan level-blok perangkat; sebagai hasilnya, itu benar-benar tidak peduli berapa ukuran drive target dan sumber, asalkan drive target memiliki cukup ruang untuk menyimpan data.Jadi, inilah cara saya akan melakukannya:
rsync -avx oldFilesystem newFilesystem
untuk menyalin / menimpa sistem file pada kartu baru dengan sistem file dari kartu lama.rpi-update
untuk memastikan bahwa firmware Anda konsisten dan terbaru.Setelah ini, kartu baru Anda harus memiliki sistem Raspbian yang berfungsi sempurna.
sumber
Saya membuat skrip shell untuk membuat cadangan dan memulihkan semua data pada Kartu SD. Pertama menghapus beberapa data (sesuai dengan proyek saya) dan menyusutkan partisi ke ukuran minimum sehingga gambar sebesar data pada kartu SD. Sebagai tambahan, skrip membuat file * .zip dari gambar. Setelah mengembalikan gambar yang dibuat ke Kartu SD lain, partisi akan diperbesar ke ukuran maksimum. Script menggunakan perintah yang disebutkan dalam jawaban lain. Karena ini adalah skrip shell kepalan tanganku dengan ukuran ini, aku butuh waktu berjam-jam untuk membuatnya dan itu bukan jet sempurna. Terutama saya tidak tahu bagaimana menangani nilai kembali dari resize2fs dan fdisk sehingga pengguna harus mengetikkan nilai yang saya butuhkan. Apakah ada ide untuk memperbaikinya? Saya harap skrip ini membantu orang lain. Jangan ragu untuk mengedit dan memperbaikinya.
ini dia:
sumber
Solusi termudah yang saya temukan adalah melakukan pencadangan kartu yang lebih besar asli menggunakan perintah dd yang diuraikan di atas dan kemudian mengembalikan gambar ke kartu yang lebih kecil menggunakan sesuatu seperti penulis naskah. dd mungkin bekerja juga ... tidak yakin. PiWriter mengembalikan kesalahan karena kehabisan ruang, tetapi karena gambar tidak berisi data aktual di luar ukuran kartu yang lebih kecil itu hanya memotong sektor kosong. Saya tidak yakin apa implikasi dari ini adalah ... partisi mungkin perlu diperiksa atau diperbaiki tetapi saya dapat memverifikasi bahwa itu berhasil ketika saya memasukkannya ke dalam Pi.
sumber
Saya menggunakan versi lama
win32diskimager-RELEASE-0.1-r15-win32
untuk membaca gambar, itu menciptakan gambar 4GB bahkan dari kartu SD 8GB dan kemudian menulis gambar dengan versi terbaru win32diskimager.Saya menggunakan versi yang lebih lama karena yang lama akan melewatkan setiap kesalahan.
sumber