Difference between revisions of "debootstrap disk image"

From Noah.org
Jump to navigationJump to search
(Created page with 'Category:Engineering This creates a very minimal Debian Sid root filesystem with networking and OpenSSH Server. The root password is set to '''password'''. <pre> #!/bin/bas…')
 
m
 
(3 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
[[Category:Engineering]]
 
[[Category:Engineering]]
  
This creates a very minimal Debian Sid root filesystem with networking and OpenSSH Server.
+
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'''.
The root password is set to '''password'''.
+
 
 
 
<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 15: Line 26:
 
GW=$7
 
GW=$7
 
NS=$8
 
NS=$8
LOOP=/mnt/loop
+
AUTHORIZED_KEYS=$9
  
dd if=/dev/zero of=${DISK_NAME} bs=1048576 count=$((1+${DISK_SIZE}/1048576)) of=${DISK_NAME}
+
# 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}
 
mkfs -F -t ext4 ${DISK_NAME}
 
mkdir -p ${LOOP}
 
mkdir -p ${LOOP}
 
mount -o loop ${DISK_NAME} ${LOOP}
 
mount -o loop ${DISK_NAME} ${LOOP}
debootstrap sid ${LOOP} http://ftp.us.debian.org/debian/
+
# Debootstrap
sed -i -e 's/tty1/hvc0/g' ${LOOP}/etc/inittab
+
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
 
echo root:password | chroot ${LOOP} chpasswd
 
cp /etc/hosts ${LOOP}/etc/hosts
 
cp /etc/hosts ${LOOP}/etc/hosts
 
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)
# Include files from /etc/network/interfaces.d:
+
 
 
source-directory /etc/network/interfaces.d
 
source-directory /etc/network/interfaces.d
  
Line 35: Line 53:
 
auto eth0
 
auto eth0
 
iface eth0 inet static
 
iface eth0 inet static
  address ${IP}
+
    address ${IP}
  netmask ${NM}
+
    netmask ${NM}
  gateway ${GW}
+
    gateway ${GW}
 
EOF_INTERFACES
 
EOF_INTERFACES
 
cat > ${LOOP}/etc/resolv.conf <<EOF_RESOLV_CONF
 
cat > ${LOOP}/etc/resolv.conf <<EOF_RESOLV_CONF
Line 43: 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 ~/.ssh/id_rsa.pub >> ${LOOP}/root/.ssh/authorized_keys
+
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
chroot ${LOOP} apt-get install -q -y --allow-unauthenticated openssh-server
+
        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