Difference between revisions of "debootstrap disk image"
From Noah.org
Jump to navigationJump to searchm |
m |
||
(One intermediate revision by the same user not shown) | |||
Line 5: | Line 5: | ||
<pre> | <pre> | ||
#!/bin/bash | #!/bin/bash | ||
+ | |||
+ | mktempdir () { | ||
+ | CLEAN_NAME=$(echo $0 | sed -e "s/[^[:alpha:]]//g") | ||
+ | NEW_TMPDIR=${TMPDIR-/tmp}/$(date "+tmp-${CLEAN_NAME}.$$.%H%M%S") | ||
+ | (umask 077 && mkdir ${NEW_TMPDIR} 2>/dev/null && echo ${NEW_TMPDIR}) || return 1 | ||
+ | return 0 | ||
+ | } | ||
+ | |||
+ | if ! LOOP=$(mktempdir); then | ||
+ | echo "ERROR: Could not create a temporary directory for loop mount." >&2 | ||
+ | exit 1 | ||
+ | fi | ||
DISK_NAME=$1 | DISK_NAME=$1 | ||
Line 14: | Line 26: | ||
GW=$7 | GW=$7 | ||
NS=$8 | NS=$8 | ||
− | + | AUTHORIZED_KEYS=$9 | |
− | # Allocate the disk image | + | # Allocate the disk image. Use fallocate if possible. |
if type fallocate 2>/dev/null 1>/dev/null; then | if type fallocate 2>/dev/null 1>/dev/null; then | ||
fallocate -l ${DISK_SIZE} ${DISK_NAME} | fallocate -l ${DISK_SIZE} ${DISK_NAME} | ||
else | else | ||
− | |||
dd if=/dev/zero of=${DISK_NAME} bs=1048576 count=$((1+${DISK_SIZE}/1048576)) of=${DISK_NAME} | dd if=/dev/zero of=${DISK_NAME} bs=1048576 count=$((1+${DISK_SIZE}/1048576)) of=${DISK_NAME} | ||
fi | fi | ||
Line 26: | Line 37: | ||
mkdir -p ${LOOP} | mkdir -p ${LOOP} | ||
mount -o loop ${DISK_NAME} ${LOOP} | mount -o loop ${DISK_NAME} ${LOOP} | ||
+ | # Debootstrap | ||
debootstrap --include=openssh-server,vim sid ${LOOP} http://ftp.us.debian.org/debian/ | debootstrap --include=openssh-server,vim sid ${LOOP} http://ftp.us.debian.org/debian/ | ||
# FIXME: This sets the console to use the Xen virtual console, which only applies to Xen. | # FIXME: This sets the console to use the Xen virtual console, which only applies to Xen. | ||
Line 33: | Line 45: | ||
cat > ${LOOP}/etc/network/interfaces <<EOF_INTERFACES | cat > ${LOOP}/etc/network/interfaces <<EOF_INTERFACES | ||
# interfaces(5) file used by ifup(8) and ifdown(8) | # interfaces(5) file used by ifup(8) and ifdown(8) | ||
− | + | ||
source-directory /etc/network/interfaces.d | source-directory /etc/network/interfaces.d | ||
Line 49: | Line 61: | ||
nameserver ${NS} | nameserver ${NS} | ||
EOF_RESOLV_CONF | EOF_RESOLV_CONF | ||
+ | # SSH | ||
mkdir ${LOOP}/root/.ssh | mkdir ${LOOP}/root/.ssh | ||
chmod 700 ${LOOP}/root/.ssh | chmod 700 ${LOOP}/root/.ssh | ||
chown 0:0 ${LOOP}/root/.ssh | chown 0:0 ${LOOP}/root/.ssh | ||
− | cat | + | if [ -r "${AUTHORIZED_KEYS}" ]; then |
− | chmod 600 ${LOOP}/root/.ssh/authorized_keys | + | cat "${AUTHORIZED_KEYS}" > ${LOOP}/root/.ssh/authorized_keys |
− | chown 0:0 ${LOOP}/root/.ssh/authorized_keys | + | chmod 600 ${LOOP}/root/.ssh/authorized_keys |
− | # | + | chown 0:0 ${LOOP}/root/.ssh/authorized_keys |
− | + | fi | |
+ | # inputrc | ||
+ | cat > ${LOOP}/etc/inputrc <<EOF_INPUTRC | ||
+ | "\e[A": history-search-backward | ||
+ | "\e[B": history-search-forward | ||
+ | "\e[2~": quoted-insert | ||
+ | "\e[3~": delete-char | ||
+ | "\e[1~": beginning-of-line | ||
+ | "\e[4~": end-of-line | ||
+ | set show-all-if-ambiguous on | ||
+ | set show-all-if-unmodified on | ||
+ | set completion-query-items -1 | ||
+ | set skip-completed-text on | ||
+ | set page-completions off | ||
+ | set print-completions-horizontally on | ||
+ | $if bash | ||
+ | set expand-tilde on | ||
+ | set match-hidden-files off | ||
+ | set visible-stats on | ||
+ | set completion-ignore-case on | ||
+ | set mark-directories on | ||
+ | set mark-symlinked-directories on | ||
+ | $endif | ||
+ | EOF_INPUTRC | ||
</pre> | </pre> |
Latest revision as of 15:33, 15 May 2014
This creates a minimal Debian Sid root filesystem with added networking and OpenSSH Server. The root password is set to password. This also adds your public SSH RSA key to the new environment's /root/.ssh/authorized_keys file.
#!/bin/bash mktempdir () { CLEAN_NAME=$(echo $0 | sed -e "s/[^[:alpha:]]//g") NEW_TMPDIR=${TMPDIR-/tmp}/$(date "+tmp-${CLEAN_NAME}.$$.%H%M%S") (umask 077 && mkdir ${NEW_TMPDIR} 2>/dev/null && echo ${NEW_TMPDIR}) || return 1 return 0 } if ! LOOP=$(mktempdir); then echo "ERROR: Could not create a temporary directory for loop mount." >&2 exit 1 fi DISK_NAME=$1 DISK_SIZE=$2 HOSTNAME=$3 DOMAIN=$4 IP=$5 NM=$6 GW=$7 NS=$8 AUTHORIZED_KEYS=$9 # Allocate the disk image. Use fallocate if possible. if type fallocate 2>/dev/null 1>/dev/null; then fallocate -l ${DISK_SIZE} ${DISK_NAME} else dd if=/dev/zero of=${DISK_NAME} bs=1048576 count=$((1+${DISK_SIZE}/1048576)) of=${DISK_NAME} fi mkfs -F -t ext4 ${DISK_NAME} mkdir -p ${LOOP} mount -o loop ${DISK_NAME} ${LOOP} # Debootstrap debootstrap --include=openssh-server,vim sid ${LOOP} http://ftp.us.debian.org/debian/ # FIXME: This sets the console to use the Xen virtual console, which only applies to Xen. ### sed -i -e 's/tty1/hvc0/g' ${LOOP}/etc/inittab echo root:password | chroot ${LOOP} chpasswd cp /etc/hosts ${LOOP}/etc/hosts cat > ${LOOP}/etc/network/interfaces <<EOF_INTERFACES # interfaces(5) file used by ifup(8) and ifdown(8) source-directory /etc/network/interfaces.d auto lo iface lo inet loopback auto eth0 iface eth0 inet static address ${IP} netmask ${NM} gateway ${GW} EOF_INTERFACES cat > ${LOOP}/etc/resolv.conf <<EOF_RESOLV_CONF search ${HOSTNAME}.${DOMAIN} nameserver ${NS} EOF_RESOLV_CONF # SSH mkdir ${LOOP}/root/.ssh chmod 700 ${LOOP}/root/.ssh chown 0:0 ${LOOP}/root/.ssh if [ -r "${AUTHORIZED_KEYS}" ]; then cat "${AUTHORIZED_KEYS}" > ${LOOP}/root/.ssh/authorized_keys chmod 600 ${LOOP}/root/.ssh/authorized_keys chown 0:0 ${LOOP}/root/.ssh/authorized_keys fi # inputrc cat > ${LOOP}/etc/inputrc <<EOF_INPUTRC "\e[A": history-search-backward "\e[B": history-search-forward "\e[2~": quoted-insert "\e[3~": delete-char "\e[1~": beginning-of-line "\e[4~": end-of-line set show-all-if-ambiguous on set show-all-if-unmodified on set completion-query-items -1 set skip-completed-text on set page-completions off set print-completions-horizontally on $if bash set expand-tilde on set match-hidden-files off set visible-stats on set completion-ignore-case on set mark-directories on set mark-symlinked-directories on $endif EOF_INPUTRC