raspberry pi树莓派学习笔记(一)制作自定义镜像

前言

       树莓派官方的镜像只有3种:1)lite,就是没有图形界面的精简版;2)pixel的图形界面,这个是上手就用的,有很多我用不着的软件;3)大杂烩版本,可以自己选择装几个推荐的系统的。

我搞树莓派主要是学习一下linux还有学习python还有搞搞GPIO什么的,所以其实只要一个带有图形界面的精简系统+python IDE就好了。所以简单的作法就是用lite系统安装图形界面再安装自己习惯的IDE就好了,不过每次都重头做起就非常繁琐,所以需要学会制作一个自定义镜像。


总体步骤环节

1.生成临时目录、软件准备

2.生成镜像文件

3.对镜像文件进行分区、格式化还有装载

4.拷贝镜像文件,备份文件

5.设置PARTUUID

6.清理过程文档

使用方式:在脚本所在目录里,执行命令

sudo  ./backup.sh /home/pi


代码解释

#!/bin/bash

set -e

# start   设置备份的路径,我习惯是/home/pi

if [ -z $1 ]; then  

  echo "Backup directory not set, required."

  exit 1

fi

BACKUP_DIR=$1

BACK_UP_DIR=$BACKUP_DIR/backup

sudo mkdir $BACK_UP_DIR

echo

# install  安装需要的软件安装包 

echo "Installing package ..."

apt-get install dosfstools dump parted kpartx rsync -y

echo "Finish."

echo

# create image  生成 备份镜像img文件

echo "Creating image ..."

ROOT=`df -P | grep /dev/root | awk '{print $3}'`   #获取 ROOT的文件大小

MMCBLK0P1=`df -P | grep /dev/mmcblk0p1 | awk '{print $2}'`  #获取主目录的文件大小

ALL=`echo $ROOT $MMCBLK0P1 |awk '{print int(($1+$2)*1.2)}'`  #生成一个比ROOT目录和主目录大一点的IMG文件

#TIME=`date "+%Y%m%d%H%M%S"`  #用于添加时间戳,不过没有什么太大的用处。所以注释掉。

FILE=$BACK_UP_DIR/backup.img  #备份后的img文件名

dd if=/dev/zero of=$FILE bs=1K count=$ALL

echo "Root size is $ROOT"

echo "root size is $MMCBLK0P1"

echo "FILE Path is $FILE"

echo "Finish."

echo

# part

echo "Parting image ..."  #格式化 ROOT和根目录

P1_START=`fdisk -l /dev/mmcblk0 | grep /dev/mmcblk0p1 | awk '{print $2}'`

P1_END=`fdisk -l /dev/mmcblk0 | grep /dev/mmcblk0p1 | awk '{print $3}'`

P2_START=`fdisk -l /dev/mmcblk0 | grep /dev/mmcblk0p2 | awk '{print $2}'`

echo "P1_start is :$P1_START .P1_end is : $P1_END  .P2_start is :$P2_START"

parted $FILE --script -- mklabel msdos

parted $FILE --script -- mkpart primary fat32 ${P1_START}s ${P1_END}s

parted $FILE --script -- mkpart primary ext4 ${P2_START}s -1

parted $FILE --script -- quit

echo "Finish."

echo

# mount

echo "Mounting ..."

loopdevice_dst=`sudo losetup -f --show $FILE` 

echo "loopdevice_dst is $loopdevice_dst"

PART_BOOT="/dev/dm-0"

PART_ROOT="/dev/dm-1"

sleep 1

device_dst=`kpartx -va $loopdevice_dst | sed -E 's/.*(loop[0-9])p.*/\1/g' | head -1`

sleep 1

device_dst="/dev/mapper/${device_dst}"

sleep 1

sudo mkfs.vfat ${device_dst}p1  #-n boot 

sleep 1

sudo mkfs.ext4 ${device_dst}p2

sleep 1

echo "======4 copy file to img========="  # 开始拷贝文件

sleep 2

# backup /dev/boot

echo "Backing up disk /dev/boot ..."

sleep 1

dst_boot_path=$BACK_UP_DIR/dst_boot

sudo mkdir  $dst_boot_path

mount -t vfat ${device_dst}p1 $dst_boot_path 

cp -rfp /boot/* $dst_boot_path

echo "Finish."

echo

# backup /dev/root

echo "Backing up disk /dev/root ..."

sleep 1

dst_root_path=$BACK_UP_DIR/dst_root

sudo mkdir  $dst_root_path

sleep 1

sudo mount -t ext4 ${device_dst}p2 $dst_root_path

cd $dst_root_path

echo "dst_root_path is $dst_root_path"

sudo chmod 777  $dst_root_path/

sudo rsync -ax  -q --exclude="$FILE" --exclude=$BACK_UP_DIR/*  --exclude=/sys/* --exclude=/proc/*  --exclude=/tmp/* /  $dst_root_path/   #通过rsync 来同步根目录到IMG镜像中,排除了一些不需要同步的文件

echo "Finish."

echo "back folder  $BACKUP_DIR"

cd $BACKUP_DIR

sync

echo

# replace PARTUUID  #替换PARTUUID 这步非常重要,liunx启动时会对PARTUUID有特定的指定,备份的时候是把旧的也同步过来,需要根据新的IMG文件来更新PARTUUID

echo "======5 replace PARTUUID========="

opartuuidb=`blkid -o export /dev/mmcblk0p1 | grep PARTUUID`

opartuuidr=`blkid -o export /dev/mmcblk0p2| grep PARTUUID`

npartuuidb=`blkid -o export ${device_dst}p1 | grep PARTUUID`

npartuuidr=`blkid -o export ${device_dst}p2 | grep PARTUUID`

echo "BOOT uuid old=$opartuuidb -> new=$npartuuidb"

echo "ROOT uuid old=$opartuuidr -> new=$npartuuidr"

sudo sed -i "s/$opartuuidr/$npartuuidr/g" $dst_boot_path/cmdline.txt

sudo sed -i "s/$opartuuidb/$npartuuidb/g" $dst_root_path/etc/fstab

sudo sed -i "s/$opartuuidr/$npartuuidr/g" $dst_root_path/etc/fstab

echo "======6 cleaning =========" #清理释放装载的文件夹

echo "Create backup img done, clear job ? Y/N"

read key

if [ "$key" = "y" -o "$key" = "Y" ]; then

sleep 15

sudo umount $dst_boot_path

sudo umount $dst_root_path

  sudo  kpartx  -d ${device_dst}p1

  sudo  kpartx -d ${device_dst}p2

sudo  losetup -d $loopdevice_dst   

sudo rm -rf  $dst_boot_path

sudo rm -rf  $dst_root_path

fi

echo "==========Done==================="

exit 0

恢复的时候用winimage将img文件恢复就行,用镜像文件是第一步是需要用fdisk 来扩展根目录的大小。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容