mirror of
https://github.com/flatcar/scripts.git
synced 2025-08-08 05:26:58 +02:00
Fix image_to_usb.sh, build_image.sh
image_to_usb.sh didn't handle the case where the devices were being automounted. build_image.sh didn't handle the case where the version string > ~14 characters. Review URL: http://chromereview.prom.corp.google.com/1173161 git-svn-id: svn://chrome-svn/chromeos/trunk@108 06c00378-0e64-4dae-be16-12b19f9950a1
This commit is contained in:
parent
e0841e376c
commit
1c98ef4e44
@ -148,7 +148,7 @@ if [ ! -e /etc/mtab ]; then
|
||||
sudo touch /etc/mtab
|
||||
fi
|
||||
UUID=`uuidgen`
|
||||
DISK_LABEL=C-$CHROMEOS_VERSION_STRING
|
||||
DISK_LABEL=C-ROOT
|
||||
LOOP_DEV=`sudo losetup -f`
|
||||
sudo losetup "$LOOP_DEV" "$ROOT_FS_IMG"
|
||||
sudo mkfs.ext3 "$LOOP_DEV"
|
||||
|
100
file_copy.py
Executable file
100
file_copy.py
Executable file
@ -0,0 +1,100 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# This program operates much like dd, but with two important differences:
|
||||
# 1. Many features lacking
|
||||
# 2. seek_bytes= param can specify seek offset in bytes, not block size
|
||||
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
|
||||
def parseNumber(numstr):
|
||||
if numstr.endswith("GB"):
|
||||
return int(numstr[:-2]) * 1000 * 1000 * 1000
|
||||
if numstr.endswith("MB"):
|
||||
return int(numstr[:-2]) * 1000 * 1000
|
||||
if numstr.endswith("kB"):
|
||||
return int(numstr[:-2]) * 1000
|
||||
if numstr.endswith("G"):
|
||||
return int(numstr[:-1]) * 1024 * 1024 * 1024
|
||||
if numstr.endswith("M"):
|
||||
return int(numstr[:-1]) * 1024 * 1024
|
||||
if numstr.endswith("K"):
|
||||
return int(numstr[:-1]) * 1024
|
||||
if numstr.endswith("b"):
|
||||
return int(numstr[:-1]) * 512
|
||||
if numstr.endswith("w"):
|
||||
return int(numstr[:-1]) * 2
|
||||
if numstr.endswith("c"):
|
||||
return int(numstr[:-1])
|
||||
if not numstr.isdigit():
|
||||
print >> sys.stderr, "Don't know how to parse number", numstr
|
||||
sys.exit(1)
|
||||
return int(numstr)
|
||||
|
||||
def main(argv):
|
||||
arg_if = ""
|
||||
arg_of = ""
|
||||
arg_bs = 512
|
||||
arg_seek = -1
|
||||
arg_seek_bytes = -1
|
||||
|
||||
for i in argv:
|
||||
if i.startswith("if="):
|
||||
arg_if=i[3:]
|
||||
elif i.startswith("of="):
|
||||
arg_of=i[3:]
|
||||
elif i.startswith("bs="):
|
||||
arg_bs=parseNumber(i[3:])
|
||||
elif i.startswith("seek="):
|
||||
arg_seek=int(i[5:])
|
||||
elif i.startswith("seek_bytes="):
|
||||
arg_seek_bytes=parseNumber(i[11:])
|
||||
|
||||
if arg_seek >= 0 and arg_seek_bytes >= 0:
|
||||
print >> sys.stderr, "you can't specify seek= and seek_bytes="
|
||||
sys.exit(1)
|
||||
|
||||
seek_bytes = 0
|
||||
if arg_seek >= 0:
|
||||
seek_bytes = arg_seek * arg_bs
|
||||
elif arg_seek_bytes >= 0:
|
||||
seek_bytes = arg_seek_bytes
|
||||
|
||||
if_fd = 0
|
||||
of_fd = 1
|
||||
if len(arg_if) != 0:
|
||||
print >> sys.stderr, "opening for read", arg_if
|
||||
if_fd = os.open(arg_if, os.O_RDONLY)
|
||||
if len(arg_of) != 0:
|
||||
print >> sys.stderr, "opening for write", arg_of
|
||||
of_fd = os.open(arg_of, os.O_WRONLY | os.O_TRUNC | os.O_CREAT)
|
||||
|
||||
if arg_seek_bytes > 0:
|
||||
print >> sys.stderr, "seeking to", seek_bytes, "bytes in output file"
|
||||
os.lseek(of_fd, seek_bytes, os.SEEK_SET)
|
||||
|
||||
bytes_copied = 0
|
||||
|
||||
t1 = time.time()
|
||||
|
||||
buf = os.read(if_fd, arg_bs)
|
||||
while len(buf) > 0:
|
||||
bytes_written = 0
|
||||
while bytes_written < len(buf):
|
||||
bytes_written += os.write(of_fd, buf[bytes_written:])
|
||||
bytes_copied += bytes_written
|
||||
buf = os.read(if_fd, arg_bs)
|
||||
|
||||
t2 = time.time()
|
||||
|
||||
os.close(if_fd)
|
||||
os.close(of_fd)
|
||||
|
||||
# print timing info
|
||||
print >> sys.stderr, 'copy %d bytes took %0.3f s' % (bytes_copied, t2 - t1)
|
||||
print >> sys.stderr, 'speed: %0.1f MB/s' % \
|
||||
((bytes_copied / 1000000) / (t2 - t1))
|
||||
|
||||
if __name__ == '__main__':
|
||||
main(sys.argv)
|
@ -45,6 +45,10 @@ set -e
|
||||
FLAGS_from=`eval readlink -f $FLAGS_from`
|
||||
FLAGS_to=`eval readlink -f $FLAGS_to`
|
||||
|
||||
function do_cleanup {
|
||||
sudo losetup -d "$LOOP_DEV"
|
||||
}
|
||||
|
||||
# Copy MBR and rootfs to output image
|
||||
if [ -b "$FLAGS_to" ]
|
||||
then
|
||||
@ -65,15 +69,40 @@ then
|
||||
fi
|
||||
fi
|
||||
|
||||
STATE_PART="$FLAGS_to"1
|
||||
ROOT_PART="$FLAGS_to"3
|
||||
echo "attempting to unmount any mounts on the USB device"
|
||||
for i in "$FLAGS_to"*
|
||||
do
|
||||
! sudo umount "$i"
|
||||
done
|
||||
sleep 3
|
||||
|
||||
sudo dd if="${FLAGS_from}/mbr.image" of="$FLAGS_to"
|
||||
PART_SIZE=$(stat -c%s "${FLAGS_from}/rootfs.image") # Bytes
|
||||
|
||||
echo "Copying root fs..."
|
||||
sudo ./file_copy.py if="${FLAGS_from}/rootfs.image" of="$FLAGS_to" bs=4M \
|
||||
seek_bytes=$(( ($PART_SIZE * 2) + 512 ))
|
||||
|
||||
# Set up loop device
|
||||
LOOP_DEV=$(sudo losetup -f)
|
||||
if [ -z "$LOOP_DEV" ]
|
||||
then
|
||||
echo "No free loop device. Free up a loop device or reboot. exiting."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
trap do_cleanup EXIT
|
||||
|
||||
echo "Creating stateful partition..."
|
||||
sudo losetup -o 512 "$LOOP_DEV" "$FLAGS_to"
|
||||
sudo mkfs.ext3 -F -b 4096 -L C-STATE "$LOOP_DEV" $(( $PART_SIZE / 4096 ))
|
||||
sync
|
||||
sudo partprobe "$FLAGS_to"
|
||||
sudo losetup -d "$LOOP_DEV"
|
||||
sync
|
||||
sudo dd if="${FLAGS_from}/rootfs.image" of="$ROOT_PART" bs=4M
|
||||
sudo mkfs.ext3 -F -L C-STATE "$STATE_PART"
|
||||
|
||||
trap - EXIT
|
||||
|
||||
echo "Copying MBR..."
|
||||
sudo ./file_copy.py if="${FLAGS_from}/mbr.image" of="$FLAGS_to"
|
||||
sync
|
||||
echo "Done."
|
||||
else
|
||||
|
Loading…
Reference in New Issue
Block a user