Hình ảnh SD sẽ không vừa với Thẻ SD


13

Tôi đã có một pi được thiết lập và chạy tốt trong một thời gian (RPi - 1). Tôi muốn tạo một hình ảnh của RPi - 1 để tôi có thể tải một bản sao chính xác lên pi thứ 2 của mình (RPi - 2). Thẻ SD trong RPi - 1 là 4GB (thực tế chỉ sử dụng khoảng một nửa) và thẻ SD trong RPi - 2 cũng là 4GB. Tôi sử dụng Win32 Disk Imager để tạo bản sao RPi - 1, thành công. Sau đó, tôi định dạng thẻ SD cho RPi - 2 với SD Formatter 4.0 (trên Windows 7). Tuy nhiên, khi tôi sử dụng Win32 Disk Imager để ghi RPi - 1 hình ảnh vào RPi - 2 thẻ SD tôi nhận được: "Không đủ dung lượng trên đĩa: Kích thước 7744512 Có sẵn: 7626752 ngành Kích thước ngành: 512"

Tôi biết đó không phải là một hình ảnh xấu vì tôi có thể định dạng thẻ SD cho RPi - 1 và viết lại hình ảnh cho nó không có vấn đề gì.

Tôi đang thiếu gì ở đây? Không phải tất cả các thẻ SD 4GB có cùng kích thước hay chúng có thay đổi một chút không? Có điều gì bạn cần làm với một thẻ SD hoàn toàn mới mà tôi đã bỏ lỡ không?

(RPi - 1 Thẻ SD = Sandisk 4GB // RPi - 2 Thẻ SD = Kingston 4GB)


2
KHÔNG có hai thẻ SD có cùng kích thước, trừ khi chúng đến từ cùng một nhà sản xuất, cùng nhãn hiệu và từ cùng một lô sản xuất. bạn KHÔNG nên sử dụng hình ảnh thẻ SD cho mục đích sao lưu, nhưng thay vào đó hãy sao chép tệp .
lenik

Máy tính của bạn có bao nhiêu dung lượng trên thẻ trống?
Beta Decay

Câu trả lời:


6

Thật vậy, không phải tất cả các thẻ SD đều có cùng kích thước. Bạn sẽ phải thu nhỏ phân vùng để làm cho nó phù hợp với SD nhỏ hơn. Tôi đã có một vấn đề tương tự bản thân mình. Những gì tôi đã làm là có một SD riêng với (trong trường hợp của tôi) Raspbian. Và tôi đã cắm SD của mình, tôi muốn thay đổi kích thước, sử dụng đầu đọc thẻ USB.

Trước khi bạn có thể thu nhỏ phân vùng của mình một cách an toàn, bạn cần đảm bảo không có dữ liệu nào ở cuối bạn đang xóa. Bạn có thể làm điều này với resize2fs -M -p /dev/sda2(bạn phải thay thế / dev / sda2 bằng đường dẫn chính xác đến đầu đọc thẻ USB và phân vùng linux mà bạn muốn thay đổi kích thước). Điều này sẽ thay đổi kích thước hệ thống tập tin đến kích thước nhỏ nhất có thể. Bạn thực sự có thể chỉ định kích thước chính xác mà bạn muốn, nhưng nó liên quan đến một số phép toán và chuyển đổi kích thước thành khối và các ngành và những gì không. An toàn hơn và dễ dàng hơn để không làm điều này.

Sau đó, bạn có thể thu nhỏ các phần. Tôi nghĩ rằng tôi đã sử dụng fdiskcho việc này. Lấy vị trí bắt đầu chính xác của phần, xóa nó một lần nữa bằng cách sử dụng cùng một vị trí bắt đầu, nhưng với kích thước nhỏ hơn.

Cuối cùng, bạn cần phóng to lại hệ thống tập tin để chiếm toàn bộ phân vùng bằng cách sử dụng resize2fs -p /dev/sda2


Tôi chỉ muốn làm rõ câu trả lời này một chút vì tôi thấy nó hơi khó theo dõi. Lần đầu tiên tôi ngắt kết nối các phân vùng trên thẻ SD. Sau đó, tôi phải chạy e2fsck -f /dev/mmcblk0p2(Tôi thu nhỏ phân vùng thứ hai của mmcblk0) để kiểm tra tính nhất quán. Sau đó tôi được phép chạy resize2fs -M -p /dev/mmcblk0p2theo đề nghị.
audiFanatic


1

Bạn nên tạo một tarball của hệ thống tập tin, bởi vì khi bạn tạo một hình ảnh đĩa đầy đủ, bạn cũng sao chép dữ liệu đã xóa. Khi bạn xóa một tập tin, inode không được liên kết nhưng dữ liệu thực tế vẫn còn trên đĩa. Một hình ảnh đĩa đầy đủ sử dụng ddsẽ sao chép dữ liệu cũ đó (ngoại trừ nếu lần đầu tiên bạn ghi đè lên nó /dev/zero, sẽ mất một chút thời gian) nhưng một bản sao lưu sử dụng tarsẽ chỉ sao chép dữ liệu hiện tại.

Hoặc ... bạn có thể làm như nhiều bản phân phối: giảm kích thước hệ thống tệp của bạn xuống mức an toàn như 1.9 GiB trước khi bạn tạo hình ảnh của mình và thay đổi kích thước để lấp đầy đĩa sau khi bạn khôi phục bản sao lưu.

Hãy cẩn thận: Tôi không quen thuộc với các công cụ hình ảnh của Windows, tôi là một người dùng Linux.


1

Nếu bạn sử dụng linux, đây là một đoạn script nhỏ:

#!/bin/bash
# Automatic Image file resizer
# Written by SirLagz
strImgFile=$1

export PATH=$PATH:/sbin

if [[ ! $(whoami) =~ "root" ]]; then
echo ""
echo "**********************************"
echo "*** This should be run as root ***"
echo "**********************************"
echo ""
exit
fi

if [[ -z $1 ]]; then
echo "Usage: ./autosizer.sh <Image File>"
exit
fi

if [[ ! -e $1 || ! $(file $1) =~ "x86" ]]; then
echo "Error : Not an image file, or file doesn't exist"
exit
fi

partinfo=`parted -ms $1 unit B p | awk '{if (NR!=2) {print}}'`  
fileSystemType=`echo "$partinfo" | grep -o 'ext4\|ext3'`
numberOfMatchPart=`echo "$fileSystemType" | wc -l`

if [[ $fileSystemType == "" || $numberOfMatchPart -eq 0 || $numberOfMatchPart -gt 1 ]] ; then
echo "Error : Your partition layout is not currently supported by this tool."
exit
fi

partnumber=`echo "$partinfo" | grep $fileSystemType | awk -F: ' { print $1 } '`
partstart=`echo "$partinfo" | grep $fileSystemType | awk -F: ' { print substr($2,0,length($2)) } '`
loopback=`losetup -f --show -o $partstart $1`

e2fsck -f $loopback

minsize=`resize2fs -P $loopback | awk -F': ' ' { print $2 } '`
minsize=`echo $minsize+200000 | bc`

resize2fs -p $loopback $minsize
sleep 1
losetup -d $loopback

partnewsize=`echo "$minsize * 4096" | bc`
newpartend=`echo "$partstart + $partnewsize" | bc`

parted $1 rm $partnumber
parted $1 unit B mkpart primary $partstart $newpartend
endresult=`parted -m $1 unit B print free | tail -1 | awk -F: ' { print substr($2,0,length($2)) } '`
truncate -s $endresult $1

tín dụng: Sirlagz (xin lỗi!)


4
bạn có tử tế để giải thích kịch bản này được cho là để làm gì không? Làm thế nào tôi có thể chỉ định kích thước hình ảnh cần thiết, bằng thần giao cách cảm?
lenik

tập lệnh thu nhỏ kích thước img, lấy kích thước đã sử dụng, thêm 200000 để kết thúc (để ghi nhật ký, v.v.), sau khi khởi động với img này, bạn cần phóng to để phù hợp với kích thước của thẻ SD mới ...
Gilles Grandguillaume

Xin chào, tôi đã viết kịch bản này vì vậy hãy thoải mái bắn cho tôi bất kỳ câu hỏi nào trên blog của tôi: sirlagz.net - Kịch bản này cần được chạy trên Linux. Kịch bản sẽ thu nhỏ hình ảnh xuống kích thước tối thiểu có thể, cộng với một chút không gian chùng. Điều này cho phép bạn đặt hình ảnh 8 gb (trong đó chỉ sử dụng 1gb) vào thẻ 1gb.
Lawrence

cần sử dụng "partstart = echo "$partinfo" | grep $fileSystemType | awk -F: ' { print substr($2,0,length($2) - 1) } '" để loại bỏ B trong partstart.
netawater

@netawater Tôi có một kết quả khác cho lệnh này với kubfox / debian: sirlagz.net/2013/03/10/script-automatic-rpi-image-downsizer/, ... tôi sử dụng tập lệnh này mà không "-1" thành công ! tôi không hiểu
Gilles Grandguillaume
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.