<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.alpinelinux.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jlo</id>
	<title>Alpine Linux - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.alpinelinux.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jlo"/>
	<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/wiki/Special:Contributions/Jlo"/>
	<updated>2026-05-03T08:11:55Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=14136</id>
		<title>User:Jlo/Replacing Debian Jessie with Alpine remotely</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=14136"/>
		<updated>2017-11-08T15:04:56Z</updated>

		<summary type="html">&lt;p&gt;Jlo: /* Stage 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I want to &amp;quot;upgrade&amp;quot; 200 remote Debian Jessie embedded boxes to AlpineLinux in &#039;&#039;run-from-ram&#039;&#039; mode.&lt;br /&gt;
I have already successfully and happily validated the second stage as this is a minor variation around the &amp;quot;setup-ownbox&amp;quot; script I have added to a standard PXE apkovl.&lt;br /&gt;
Those box are remotely sshable via openVPN. We need to keep network settings as is because some boxes have ad-hoc network config is restricted zones.&lt;br /&gt;
&lt;br /&gt;
== Stage 0 ==&lt;br /&gt;
&lt;br /&gt;
we need to prepare or a cache with reduced set of package or maybe some local repo with all needed packages needed for first stage and use that repo with no-cache option...&lt;br /&gt;
&lt;br /&gt;
[[How_to_make_a_custom_ISO_image_with_mkimage]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sh mkimage.sh --tag 3.6.2 --outdir ~/iso --arch x86_64 --repository http://my.own.repo/alpine/v3.6/main --profile jessie&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
profile_jessie() {&lt;br /&gt;
	profile_standard&lt;br /&gt;
	title=&amp;quot;AL debian&amp;quot;&lt;br /&gt;
	desc=&amp;quot;Packages included.&lt;br /&gt;
		Suitable for Local install script.&amp;quot;&lt;br /&gt;
	apks=&amp;quot;$apks openvpn wpa_supplicant wireless-tools&amp;quot;&lt;br /&gt;
	#apks=&amp;quot;$apks linux-firmware&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==&amp;gt; &#039;&#039;&#039;alpine-jessie-3.6.2-x86_64.iso&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Stage 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;prepare-jessie-for-alpine&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
# this must be fully automatic&lt;br /&gt;
export DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
apt-get -y install rsync extlinux&lt;br /&gt;
# /boot is a separate partition&lt;br /&gt;
rm -fr /boot/boot&lt;br /&gt;
ln -sf . /boot/boot&lt;br /&gt;
# let&#039;s get system file from our install server&lt;br /&gt;
cd /tmp&lt;br /&gt;
wget http://my.server.home/alpine/alpine-jessie-3.6.2-x86_64.iso&lt;br /&gt;
wget http://my.server.home/alpine/debian.apkovl.tar.gz&lt;br /&gt;
mount -o loop /tmp/alpine-jessie-3.6.2-x86_64.iso /mnt&lt;br /&gt;
rsync -a /mnt/ /boot/&lt;br /&gt;
sync &lt;br /&gt;
umount /mnt&lt;br /&gt;
# prepare the config overlay&lt;br /&gt;
rm -fr /tmp/apkovl&lt;br /&gt;
mkdir /tmp/apkovl&lt;br /&gt;
tar xzf /tmp/debian.apkovl.tar.gz -C /tmp/apkovl&lt;br /&gt;
# keep current active network connection(s) and identity&lt;br /&gt;
cp /etc/hostname /tmp/apkovl/etc/&lt;br /&gt;
cp /etc/network/interfaces  /tmp/apkovl/etc/network/&lt;br /&gt;
cp -r /etc/openvpn /tmp/apkovl/etc/&lt;br /&gt;
cp -r /etc/ssh /tmp/apkovl/etc/&lt;br /&gt;
cd /tmp/apkovl&lt;br /&gt;
# be sure active VPN connections are preserved&lt;br /&gt;
mkdir -p /tmp/apkovl/etc/init.d&lt;br /&gt;
for v in /tmp/apkovl/etc/openvpn/*.conf ; do&lt;br /&gt;
  vn=$(basename $v|cut -d. -f1)&lt;br /&gt;
  ln -fs openvpn /tmp/apkovl/etc/init.d/openvpn.$vn&lt;br /&gt;
  ln -fs /etc/init.d/openvpn.$vn /tmp/apkovl/etc/runlevels/default/openvpn.$vn&lt;br /&gt;
done&lt;br /&gt;
# config done ; commit&lt;br /&gt;
tar czf /boot/$(hostname).apkovl.tar.gz .&lt;br /&gt;
# now the booltoader ; this will kill the active grub...&lt;br /&gt;
cat &amp;gt; /boot/extlinux.conf &amp;lt;&amp;lt; EOF&lt;br /&gt;
timeout 20&lt;br /&gt;
prompt 1&lt;br /&gt;
default hardened&lt;br /&gt;
label hardened&lt;br /&gt;
    kernel /boot/vmlinuz-hardened&lt;br /&gt;
    initrd /boot/initramfs-hardened&lt;br /&gt;
    append alpine_dev=sda1:ext2 modloop=modloop-hardened modules=loop,cramfs,sd-mod,usb-storage,ext2 quiet&lt;br /&gt;
EOF&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sda&lt;br /&gt;
extlinux -i /boot&lt;br /&gt;
# done&lt;br /&gt;
sync&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
usage: &amp;lt;pre&amp;gt;~:# prepare-jessie-for-alpine&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stage 2 ==&lt;br /&gt;
&lt;br /&gt;
not tested yet in this procedure but used successfully (a small variant) to prepare new AL boxes. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;setup-albox-from-debian&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
BEGIN=$(date +%s)&lt;br /&gt;
name=$1&lt;br /&gt;
D=sda&lt;br /&gt;
echo &amp;quot;Manufacturing box named *${name}*...&amp;quot; &lt;br /&gt;
rc-service modloop stop&lt;br /&gt;
umount /media/${D}* || (echo &amp;quot;Unable to unmount ${D}. Aborting...&amp;quot; ; exit 1)&lt;br /&gt;
### Partition the SSD $D&lt;br /&gt;
# f2fs want partition of type ext2 in parted&lt;br /&gt;
parted -a cylinder -s /dev/${D} -- \&lt;br /&gt;
 mklabel msdos                \&lt;br /&gt;
 mkpart primary fat32 0%  1%  \&lt;br /&gt;
 mkpart primary ext2  1%  2%  \&lt;br /&gt;
 mkpart primary ext2  2%  7%  \&lt;br /&gt;
 mkpart extended      7% 100% \&lt;br /&gt;
 mkpart logical ext2  7%  9%  \&lt;br /&gt;
 mkpart logical ext2  9% 15%  \&lt;br /&gt;
 mkpart logical ext2 15% 20%  \&lt;br /&gt;
 mkpart logical ext2 21% 22%  \&lt;br /&gt;
 mkpart logical ext2 22% 23%  \&lt;br /&gt;
 mkpart logical ext2 23% 24%  \&lt;br /&gt;
 mkpart logical ext2 24% 25%  \&lt;br /&gt;
 mkpart logical ext2 25% 26%  \&lt;br /&gt;
 mkpart logical ext2 26% 27%  \&lt;br /&gt;
 mkpart logical ext2 27% 28%  \&lt;br /&gt;
 mkpart logical ext2 28% 29%  \&lt;br /&gt;
 mkpart logical ext2 29% 30%  \&lt;br /&gt;
 set 1 boot on                \&lt;br /&gt;
 || exit 1&lt;br /&gt;
### prepare boot partition&lt;br /&gt;
mkfs.vfat /dev/${D}1 || exit 1&lt;br /&gt;
mkdir -p /media/${D}1&lt;br /&gt;
setup-bootable /media/${B} /dev/${D}1 || exit 1&lt;br /&gt;
mount -t vfat /dev/${D}1 /media/${D}1 || exit 1&lt;br /&gt;
### format partition to hold apkovl and apk/cache; it must be of ext? type&lt;br /&gt;
mkfs.ext4 -F -q /dev/${D}2 || exit 1&lt;br /&gt;
mkdir -p /media/${D}2&lt;br /&gt;
mount -t ext4 /dev/${D}2 /media/${D}2 || exit 1&lt;br /&gt;
### format remaining partitions with f2fs&lt;br /&gt;
for i in $(seq 3 16);do&lt;br /&gt;
  [ $i -eq 4 ] &amp;amp;&amp;amp; continue&lt;br /&gt;
  mkfs.f2fs -q /dev/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i&lt;br /&gt;
  mount -t f2fs /dev/${D}$i /media/${D}$i || exit 1&lt;br /&gt;
done&lt;br /&gt;
### copy apkovl and apk/cache and stuff&lt;br /&gt;
rsync -azur --numeric-ids root@my.server.home:sda* /media/ || exit 1&lt;br /&gt;
### prepare new apkovl&lt;br /&gt;
rm -fr /tmp/template&lt;br /&gt;
mkdir -p /tmp/template&lt;br /&gt;
tar xzf /media/${S}2/$(hostname).apkovl.tar.gz -C /tmp/template || exit 1&lt;br /&gt;
rm /media/${D}2/$(hostname).apkovl.tar.gz&lt;br /&gt;
cd /tmp/template&lt;br /&gt;
rm -f etc/ssh/ssh_host_*&lt;br /&gt;
for f in $(grep -r $(hostname) etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/$(hostname)/${name}/g $f;done&lt;br /&gt;
for f in $(grep -r ${S} etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/${S}/${D}/g $f;done&lt;br /&gt;
echo &amp;quot;/dev/sdb2 /media/sdb2 ext4 ro,relatime,errors=continue,user_xattr,acl 0 2&amp;quot; &amp;gt; etc/fstab&lt;br /&gt;
# remaining partitions are for own stuff&lt;br /&gt;
# partition 4 is the extended one &lt;br /&gt;
# (we maybe could just skip 3 and directly jump to extended for own stuff to simplify install script)&lt;br /&gt;
echo &amp;quot;/dev/sda3 /media/sda3 f2fs defaults,ro 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab&lt;br /&gt;
for i in $(seq 5 16);do echo &amp;quot;/dev/sda$i /media/sda$i f2fs defaults 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab;done&lt;br /&gt;
# partition 2 will hold apkovl and apk/cache&lt;br /&gt;
rm etc/apk/cache&lt;br /&gt;
ln -s /media/${D}2/cache etc/apk/cache&lt;br /&gt;
ln -s /etc/init.d/local etc/runlevels/default/local&lt;br /&gt;
tar czf /media/${D}2/${name}.apkovl.tar.gz . || exit 1&lt;br /&gt;
### done&lt;br /&gt;
sync&lt;br /&gt;
umount /media/${D}*&lt;br /&gt;
END=$(date +%s)&lt;br /&gt;
DURATION=$(($END-$BEGIN))&lt;br /&gt;
echo &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
logger &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;pre&amp;gt;~:# setup-albox-from-debian mynewbox&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=14135</id>
		<title>User:Jlo/Replacing Debian Jessie with Alpine remotely</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=14135"/>
		<updated>2017-11-08T15:04:12Z</updated>

		<summary type="html">&lt;p&gt;Jlo: /* Stage 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I want to &amp;quot;upgrade&amp;quot; 200 remote Debian Jessie embedded boxes to AlpineLinux in &#039;&#039;run-from-ram&#039;&#039; mode.&lt;br /&gt;
I have already successfully and happily validated the second stage as this is a minor variation around the &amp;quot;setup-ownbox&amp;quot; script I have added to a standard PXE apkovl.&lt;br /&gt;
Those box are remotely sshable via openVPN. We need to keep network settings as is because some boxes have ad-hoc network config is restricted zones.&lt;br /&gt;
&lt;br /&gt;
== Stage 0 ==&lt;br /&gt;
&lt;br /&gt;
we need to prepare or a cache with reduced set of package or maybe some local repo with all needed packages needed for first stage and use that repo with no-cache option...&lt;br /&gt;
&lt;br /&gt;
[[How_to_make_a_custom_ISO_image_with_mkimage]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sh mkimage.sh --tag 3.6.2 --outdir ~/iso --arch x86_64 --repository http://my.own.repo/alpine/v3.6/main --profile jessie&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
profile_jessie() {&lt;br /&gt;
	profile_standard&lt;br /&gt;
	title=&amp;quot;AL debian&amp;quot;&lt;br /&gt;
	desc=&amp;quot;Packages included.&lt;br /&gt;
		Suitable for Local install script.&amp;quot;&lt;br /&gt;
	apks=&amp;quot;$apks openvpn wpa_supplicant wireless-tools&amp;quot;&lt;br /&gt;
	#apks=&amp;quot;$apks linux-firmware&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==&amp;gt; &#039;&#039;&#039;alpine-jessie-3.6.2-x86_64.iso&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Stage 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;prepare-jessie-for-alpine&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
# this must be fully automatic&lt;br /&gt;
export DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
apt-get -y install rsync extlinux&lt;br /&gt;
# /boot is a separate partition&lt;br /&gt;
rm -fr /boot/boot&lt;br /&gt;
ln -sf . /boot/boot&lt;br /&gt;
# let&#039;s get system file from our install server&lt;br /&gt;
cd /tmp&lt;br /&gt;
wget http://my.server.home/alpine/alpine-jessie-3.6.2-x86_64.iso&lt;br /&gt;
wget http://my.server.home/alpine/debian.apkovl.tar.gz&lt;br /&gt;
mount -o loop /tmp/alpine-jessie-3.6.2-x86_64.iso /mnt&lt;br /&gt;
rsync -a /mnt/ /boot/&lt;br /&gt;
sync &lt;br /&gt;
umount /mnt&lt;br /&gt;
# prepare the config overlay&lt;br /&gt;
rm -fr /tmp/apkovl&lt;br /&gt;
mkdir /tmp/apkovl&lt;br /&gt;
tar xzf /tmp/debian.apkovl.tar.gz -C /tmp/apkovl&lt;br /&gt;
# keep current active network connection(s) and identity&lt;br /&gt;
cp /etc/hostname /tmp/apkovl/etc/&lt;br /&gt;
cp /etc/network/interfaces  /tmp/apkovl/etc/network/&lt;br /&gt;
cp -r /etc/openvpn /tmp/apkovl/etc/&lt;br /&gt;
cp -r /etc/ssh /tmp/apkovl/etc/&lt;br /&gt;
cd /tmp/apkovl&lt;br /&gt;
# be sure the install media was not already customized for own apps&lt;br /&gt;
unlink etc/runlevels/default/local&lt;br /&gt;
# be sure active VPN connections are preserved&lt;br /&gt;
mkdir -p /tmp/apkovl/etc/init.d&lt;br /&gt;
for v in /tmp/apkovl/etc/openvpn/*.conf ; do&lt;br /&gt;
  vn=$(basename $v|cut -d. -f1)&lt;br /&gt;
  ln -fs openvpn /tmp/apkovl/etc/init.d/openvpn.$vn&lt;br /&gt;
  ln -fs /etc/init.d/openvpn.$vn /tmp/apkovl/etc/runlevels/default/openvpn.$vn&lt;br /&gt;
done&lt;br /&gt;
# config done ; commit&lt;br /&gt;
tar czf /boot/$(hostname).apkovl.tar.gz .&lt;br /&gt;
# now the booltoader ; this will kill the active grub...&lt;br /&gt;
cat &amp;gt; /boot/extlinux.conf &amp;lt;&amp;lt; EOF&lt;br /&gt;
timeout 20&lt;br /&gt;
prompt 1&lt;br /&gt;
default hardened&lt;br /&gt;
label hardened&lt;br /&gt;
    kernel /boot/vmlinuz-hardened&lt;br /&gt;
    initrd /boot/initramfs-hardened&lt;br /&gt;
    append alpine_dev=sda1:ext2 modloop=modloop-hardened modules=loop,cramfs,sd-mod,usb-storage,ext2 quiet&lt;br /&gt;
EOF&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sda&lt;br /&gt;
extlinux -i /boot&lt;br /&gt;
# done&lt;br /&gt;
sync&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
usage: &amp;lt;pre&amp;gt;~:# prepare-jessie-for-alpine&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stage 2 ==&lt;br /&gt;
&lt;br /&gt;
not tested yet in this procedure but used successfully (a small variant) to prepare new AL boxes. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;setup-albox-from-debian&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
BEGIN=$(date +%s)&lt;br /&gt;
name=$1&lt;br /&gt;
D=sda&lt;br /&gt;
echo &amp;quot;Manufacturing box named *${name}*...&amp;quot; &lt;br /&gt;
rc-service modloop stop&lt;br /&gt;
umount /media/${D}* || (echo &amp;quot;Unable to unmount ${D}. Aborting...&amp;quot; ; exit 1)&lt;br /&gt;
### Partition the SSD $D&lt;br /&gt;
# f2fs want partition of type ext2 in parted&lt;br /&gt;
parted -a cylinder -s /dev/${D} -- \&lt;br /&gt;
 mklabel msdos                \&lt;br /&gt;
 mkpart primary fat32 0%  1%  \&lt;br /&gt;
 mkpart primary ext2  1%  2%  \&lt;br /&gt;
 mkpart primary ext2  2%  7%  \&lt;br /&gt;
 mkpart extended      7% 100% \&lt;br /&gt;
 mkpart logical ext2  7%  9%  \&lt;br /&gt;
 mkpart logical ext2  9% 15%  \&lt;br /&gt;
 mkpart logical ext2 15% 20%  \&lt;br /&gt;
 mkpart logical ext2 21% 22%  \&lt;br /&gt;
 mkpart logical ext2 22% 23%  \&lt;br /&gt;
 mkpart logical ext2 23% 24%  \&lt;br /&gt;
 mkpart logical ext2 24% 25%  \&lt;br /&gt;
 mkpart logical ext2 25% 26%  \&lt;br /&gt;
 mkpart logical ext2 26% 27%  \&lt;br /&gt;
 mkpart logical ext2 27% 28%  \&lt;br /&gt;
 mkpart logical ext2 28% 29%  \&lt;br /&gt;
 mkpart logical ext2 29% 30%  \&lt;br /&gt;
 set 1 boot on                \&lt;br /&gt;
 || exit 1&lt;br /&gt;
### prepare boot partition&lt;br /&gt;
mkfs.vfat /dev/${D}1 || exit 1&lt;br /&gt;
mkdir -p /media/${D}1&lt;br /&gt;
setup-bootable /media/${B} /dev/${D}1 || exit 1&lt;br /&gt;
mount -t vfat /dev/${D}1 /media/${D}1 || exit 1&lt;br /&gt;
### format partition to hold apkovl and apk/cache; it must be of ext? type&lt;br /&gt;
mkfs.ext4 -F -q /dev/${D}2 || exit 1&lt;br /&gt;
mkdir -p /media/${D}2&lt;br /&gt;
mount -t ext4 /dev/${D}2 /media/${D}2 || exit 1&lt;br /&gt;
### format remaining partitions with f2fs&lt;br /&gt;
for i in $(seq 3 16);do&lt;br /&gt;
  [ $i -eq 4 ] &amp;amp;&amp;amp; continue&lt;br /&gt;
  mkfs.f2fs -q /dev/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i&lt;br /&gt;
  mount -t f2fs /dev/${D}$i /media/${D}$i || exit 1&lt;br /&gt;
done&lt;br /&gt;
### copy apkovl and apk/cache and stuff&lt;br /&gt;
rsync -azur --numeric-ids root@my.server.home:sda* /media/ || exit 1&lt;br /&gt;
### prepare new apkovl&lt;br /&gt;
rm -fr /tmp/template&lt;br /&gt;
mkdir -p /tmp/template&lt;br /&gt;
tar xzf /media/${S}2/$(hostname).apkovl.tar.gz -C /tmp/template || exit 1&lt;br /&gt;
rm /media/${D}2/$(hostname).apkovl.tar.gz&lt;br /&gt;
cd /tmp/template&lt;br /&gt;
rm -f etc/ssh/ssh_host_*&lt;br /&gt;
for f in $(grep -r $(hostname) etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/$(hostname)/${name}/g $f;done&lt;br /&gt;
for f in $(grep -r ${S} etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/${S}/${D}/g $f;done&lt;br /&gt;
echo &amp;quot;/dev/sdb2 /media/sdb2 ext4 ro,relatime,errors=continue,user_xattr,acl 0 2&amp;quot; &amp;gt; etc/fstab&lt;br /&gt;
# remaining partitions are for own stuff&lt;br /&gt;
# partition 4 is the extended one &lt;br /&gt;
# (we maybe could just skip 3 and directly jump to extended for own stuff to simplify install script)&lt;br /&gt;
echo &amp;quot;/dev/sda3 /media/sda3 f2fs defaults,ro 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab&lt;br /&gt;
for i in $(seq 5 16);do echo &amp;quot;/dev/sda$i /media/sda$i f2fs defaults 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab;done&lt;br /&gt;
# partition 2 will hold apkovl and apk/cache&lt;br /&gt;
rm etc/apk/cache&lt;br /&gt;
ln -s /media/${D}2/cache etc/apk/cache&lt;br /&gt;
ln -s /etc/init.d/local etc/runlevels/default/local&lt;br /&gt;
tar czf /media/${D}2/${name}.apkovl.tar.gz . || exit 1&lt;br /&gt;
### done&lt;br /&gt;
sync&lt;br /&gt;
umount /media/${D}*&lt;br /&gt;
END=$(date +%s)&lt;br /&gt;
DURATION=$(($END-$BEGIN))&lt;br /&gt;
echo &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
logger &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;pre&amp;gt;~:# setup-albox-from-debian mynewbox&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=14134</id>
		<title>User:Jlo/Replacing Debian Jessie with Alpine remotely</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=14134"/>
		<updated>2017-11-08T15:03:50Z</updated>

		<summary type="html">&lt;p&gt;Jlo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I want to &amp;quot;upgrade&amp;quot; 200 remote Debian Jessie embedded boxes to AlpineLinux in &#039;&#039;run-from-ram&#039;&#039; mode.&lt;br /&gt;
I have already successfully and happily validated the second stage as this is a minor variation around the &amp;quot;setup-ownbox&amp;quot; script I have added to a standard PXE apkovl.&lt;br /&gt;
Those box are remotely sshable via openVPN. We need to keep network settings as is because some boxes have ad-hoc network config is restricted zones.&lt;br /&gt;
&lt;br /&gt;
== Stage 0 ==&lt;br /&gt;
&lt;br /&gt;
we need to prepare or a cache with reduced set of package or maybe some local repo with all needed packages needed for first stage and use that repo with no-cache option...&lt;br /&gt;
&lt;br /&gt;
[[How_to_make_a_custom_ISO_image_with_mkimage]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sh mkimage.sh --tag 3.6.2 --outdir ~/iso --arch x86_64 --repository http://my.own.repo/alpine/v3.6/main --profile jessie&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
profile_jessie() {&lt;br /&gt;
	profile_standard&lt;br /&gt;
	title=&amp;quot;AL debian&amp;quot;&lt;br /&gt;
	desc=&amp;quot;Packages included.&lt;br /&gt;
		Suitable for Local install script.&amp;quot;&lt;br /&gt;
	apks=&amp;quot;$apks openvpn wpa_supplicant wireless-tools&amp;quot;&lt;br /&gt;
	#apks=&amp;quot;$apks linux-firmware&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==&amp;gt; &#039;&#039;&#039;alpine-jessie-3.6.2-x86_64.iso&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Stage 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;prepare-jessie-for-alpine&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
# this must be fully automatic&lt;br /&gt;
export DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
apt-get -y install rsync extlinux&lt;br /&gt;
# /boot is a separate partition&lt;br /&gt;
rm -fr /boot/boot&lt;br /&gt;
ln -sf . /boot/boot&lt;br /&gt;
# let&#039;s get system file from our install server&lt;br /&gt;
cd /tmp&lt;br /&gt;
wget http://my.server.home/alpine/alpine-jessie-3.6.2-x86_64.iso&lt;br /&gt;
wget http://my.server.home/alpine/debian.apkovl.tar.gz&lt;br /&gt;
mount -o loop /tmp/alpine-jessie-3.6.2-x86_64.iso /mnt&lt;br /&gt;
rsync -a /mnt/ /boot/&lt;br /&gt;
cp /mnt/.alpine-release /boot/&lt;br /&gt;
sync &lt;br /&gt;
umount /mnt&lt;br /&gt;
# prepare the config overlay&lt;br /&gt;
rm -fr /tmp/apkovl&lt;br /&gt;
mkdir /tmp/apkovl&lt;br /&gt;
tar xzf /tmp/debian.apkovl.tar.gz -C /tmp/apkovl&lt;br /&gt;
# keep current active network connection(s) and identity&lt;br /&gt;
cp /etc/hostname /tmp/apkovl/etc/&lt;br /&gt;
cp /etc/network/interfaces  /tmp/apkovl/etc/network/&lt;br /&gt;
cp -r /etc/openvpn /tmp/apkovl/etc/&lt;br /&gt;
cp -r /etc/ssh /tmp/apkovl/etc/&lt;br /&gt;
cd /tmp/apkovl&lt;br /&gt;
# be sure the install media was not already customized for own apps&lt;br /&gt;
unlink etc/runlevels/default/local&lt;br /&gt;
# be sure active VPN connections are preserved&lt;br /&gt;
mkdir -p /tmp/apkovl/etc/init.d&lt;br /&gt;
for v in /tmp/apkovl/etc/openvpn/*.conf ; do&lt;br /&gt;
  vn=$(basename $v|cut -d. -f1)&lt;br /&gt;
  ln -fs openvpn /tmp/apkovl/etc/init.d/openvpn.$vn&lt;br /&gt;
  ln -fs /etc/init.d/openvpn.$vn /tmp/apkovl/etc/runlevels/default/openvpn.$vn&lt;br /&gt;
done&lt;br /&gt;
# config done ; commit&lt;br /&gt;
tar czf /boot/$(hostname).apkovl.tar.gz .&lt;br /&gt;
# now the booltoader ; this will kill the active grub...&lt;br /&gt;
cat &amp;gt; /boot/extlinux.conf &amp;lt;&amp;lt; EOF&lt;br /&gt;
timeout 20&lt;br /&gt;
prompt 1&lt;br /&gt;
default hardened&lt;br /&gt;
label hardened&lt;br /&gt;
    kernel /boot/vmlinuz-hardened&lt;br /&gt;
    initrd /boot/initramfs-hardened&lt;br /&gt;
    append alpine_dev=sda1:ext2 modloop=modloop-hardened modules=loop,cramfs,sd-mod,usb-storage,ext2 quiet&lt;br /&gt;
EOF&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sda&lt;br /&gt;
extlinux -i /boot&lt;br /&gt;
# done&lt;br /&gt;
sync&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
usage: &amp;lt;pre&amp;gt;~:# prepare-jessie-for-alpine&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stage 2 ==&lt;br /&gt;
&lt;br /&gt;
not tested yet in this procedure but used successfully (a small variant) to prepare new AL boxes. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;setup-albox-from-debian&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
BEGIN=$(date +%s)&lt;br /&gt;
name=$1&lt;br /&gt;
D=sda&lt;br /&gt;
echo &amp;quot;Manufacturing box named *${name}*...&amp;quot; &lt;br /&gt;
rc-service modloop stop&lt;br /&gt;
umount /media/${D}* || (echo &amp;quot;Unable to unmount ${D}. Aborting...&amp;quot; ; exit 1)&lt;br /&gt;
### Partition the SSD $D&lt;br /&gt;
# f2fs want partition of type ext2 in parted&lt;br /&gt;
parted -a cylinder -s /dev/${D} -- \&lt;br /&gt;
 mklabel msdos                \&lt;br /&gt;
 mkpart primary fat32 0%  1%  \&lt;br /&gt;
 mkpart primary ext2  1%  2%  \&lt;br /&gt;
 mkpart primary ext2  2%  7%  \&lt;br /&gt;
 mkpart extended      7% 100% \&lt;br /&gt;
 mkpart logical ext2  7%  9%  \&lt;br /&gt;
 mkpart logical ext2  9% 15%  \&lt;br /&gt;
 mkpart logical ext2 15% 20%  \&lt;br /&gt;
 mkpart logical ext2 21% 22%  \&lt;br /&gt;
 mkpart logical ext2 22% 23%  \&lt;br /&gt;
 mkpart logical ext2 23% 24%  \&lt;br /&gt;
 mkpart logical ext2 24% 25%  \&lt;br /&gt;
 mkpart logical ext2 25% 26%  \&lt;br /&gt;
 mkpart logical ext2 26% 27%  \&lt;br /&gt;
 mkpart logical ext2 27% 28%  \&lt;br /&gt;
 mkpart logical ext2 28% 29%  \&lt;br /&gt;
 mkpart logical ext2 29% 30%  \&lt;br /&gt;
 set 1 boot on                \&lt;br /&gt;
 || exit 1&lt;br /&gt;
### prepare boot partition&lt;br /&gt;
mkfs.vfat /dev/${D}1 || exit 1&lt;br /&gt;
mkdir -p /media/${D}1&lt;br /&gt;
setup-bootable /media/${B} /dev/${D}1 || exit 1&lt;br /&gt;
mount -t vfat /dev/${D}1 /media/${D}1 || exit 1&lt;br /&gt;
### format partition to hold apkovl and apk/cache; it must be of ext? type&lt;br /&gt;
mkfs.ext4 -F -q /dev/${D}2 || exit 1&lt;br /&gt;
mkdir -p /media/${D}2&lt;br /&gt;
mount -t ext4 /dev/${D}2 /media/${D}2 || exit 1&lt;br /&gt;
### format remaining partitions with f2fs&lt;br /&gt;
for i in $(seq 3 16);do&lt;br /&gt;
  [ $i -eq 4 ] &amp;amp;&amp;amp; continue&lt;br /&gt;
  mkfs.f2fs -q /dev/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i&lt;br /&gt;
  mount -t f2fs /dev/${D}$i /media/${D}$i || exit 1&lt;br /&gt;
done&lt;br /&gt;
### copy apkovl and apk/cache and stuff&lt;br /&gt;
rsync -azur --numeric-ids root@my.server.home:sda* /media/ || exit 1&lt;br /&gt;
### prepare new apkovl&lt;br /&gt;
rm -fr /tmp/template&lt;br /&gt;
mkdir -p /tmp/template&lt;br /&gt;
tar xzf /media/${S}2/$(hostname).apkovl.tar.gz -C /tmp/template || exit 1&lt;br /&gt;
rm /media/${D}2/$(hostname).apkovl.tar.gz&lt;br /&gt;
cd /tmp/template&lt;br /&gt;
rm -f etc/ssh/ssh_host_*&lt;br /&gt;
for f in $(grep -r $(hostname) etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/$(hostname)/${name}/g $f;done&lt;br /&gt;
for f in $(grep -r ${S} etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/${S}/${D}/g $f;done&lt;br /&gt;
echo &amp;quot;/dev/sdb2 /media/sdb2 ext4 ro,relatime,errors=continue,user_xattr,acl 0 2&amp;quot; &amp;gt; etc/fstab&lt;br /&gt;
# remaining partitions are for own stuff&lt;br /&gt;
# partition 4 is the extended one &lt;br /&gt;
# (we maybe could just skip 3 and directly jump to extended for own stuff to simplify install script)&lt;br /&gt;
echo &amp;quot;/dev/sda3 /media/sda3 f2fs defaults,ro 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab&lt;br /&gt;
for i in $(seq 5 16);do echo &amp;quot;/dev/sda$i /media/sda$i f2fs defaults 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab;done&lt;br /&gt;
# partition 2 will hold apkovl and apk/cache&lt;br /&gt;
rm etc/apk/cache&lt;br /&gt;
ln -s /media/${D}2/cache etc/apk/cache&lt;br /&gt;
ln -s /etc/init.d/local etc/runlevels/default/local&lt;br /&gt;
tar czf /media/${D}2/${name}.apkovl.tar.gz . || exit 1&lt;br /&gt;
### done&lt;br /&gt;
sync&lt;br /&gt;
umount /media/${D}*&lt;br /&gt;
END=$(date +%s)&lt;br /&gt;
DURATION=$(($END-$BEGIN))&lt;br /&gt;
echo &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
logger &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;pre&amp;gt;~:# setup-albox-from-debian mynewbox&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=14132</id>
		<title>User:Jlo/Replacing Debian Jessie with Alpine remotely</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=14132"/>
		<updated>2017-11-07T13:09:51Z</updated>

		<summary type="html">&lt;p&gt;Jlo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I want to &amp;quot;upgrade&amp;quot; 200 remote Debian Jessie embedded boxes to AlpineLinux in &#039;&#039;run-from-ram&#039;&#039; mode.&lt;br /&gt;
I have already successfully and happily validated the second stage as this is a minor variation around the &amp;quot;setup-ownbox&amp;quot; script I have added to a standard PXE apkovl.&lt;br /&gt;
&lt;br /&gt;
== Stage 0 ==&lt;br /&gt;
&lt;br /&gt;
we need to prepare or a cache with reduced set of package or maybe some local repo with all needed packages needed for first stage and use that repo with no-cache option...&lt;br /&gt;
&lt;br /&gt;
[[How_to_make_a_custom_ISO_image_with_mkimage]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sh mkimage.sh --tag 3.6.2 --outdir ~/iso --arch x86_64 --repository http://my.own.repo/alpine/v3.6/main --profile jessie&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
profile_jessie() {&lt;br /&gt;
	profile_standard&lt;br /&gt;
	title=&amp;quot;AL debian&amp;quot;&lt;br /&gt;
	desc=&amp;quot;Packages included.&lt;br /&gt;
		Suitable for Local install script.&amp;quot;&lt;br /&gt;
	apks=&amp;quot;$apks openvpn wpa_supplicant wireless-tools&amp;quot;&lt;br /&gt;
	#apks=&amp;quot;$apks linux-firmware&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==&amp;gt; &#039;&#039;&#039;alpine-jessie-3.6.2-x86_64.iso&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Stage 1 ==&lt;br /&gt;
&lt;br /&gt;
something is wrong about init at reboot time :(&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;prepare-jessie-for-alpine&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
# this must be fully automatic&lt;br /&gt;
export DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
apt-get -y install rsync extlinux&lt;br /&gt;
# /boot is a separate partition&lt;br /&gt;
rm -fr /boot/boot&lt;br /&gt;
ln -sf . /boot/boot&lt;br /&gt;
# let&#039;s get system file from our install server&lt;br /&gt;
cd /tmp&lt;br /&gt;
wget http://my.server.home/alpine/alpine-jessie-3.6.2-x86_64.iso&lt;br /&gt;
wget http://my.server.home/alpine/debian.apkovl.tar.gz&lt;br /&gt;
mount -o loop /tmp/alpine-jessie-3.6.2-x86_64.iso /mnt&lt;br /&gt;
rsync -a /mnt/ /boot/&lt;br /&gt;
cp /mnt/.alpine-release /boot/&lt;br /&gt;
sync &lt;br /&gt;
umount /mnt&lt;br /&gt;
# prepare the config overlay&lt;br /&gt;
rm -fr /tmp/apkovl&lt;br /&gt;
mkdir /tmp/apkovl&lt;br /&gt;
tar xzf /tmp/debian.apkovl.tar.gz -C /tmp/apkovl&lt;br /&gt;
# keep current active network connection(s) and identity&lt;br /&gt;
cp /etc/hostname /tmp/apkovl/etc/&lt;br /&gt;
cp /etc/network/interfaces  /tmp/apkovl/etc/network/&lt;br /&gt;
cp -r /etc/openvpn /tmp/apkovl/etc/&lt;br /&gt;
cp -r /etc/ssh /tmp/apkovl/etc/&lt;br /&gt;
cd /tmp/apkovl&lt;br /&gt;
# be sure the install media was not already customized for own apps&lt;br /&gt;
unlink etc/runlevels/default/local&lt;br /&gt;
# be sure active VPN connections are preserved&lt;br /&gt;
mkdir -p /tmp/apkovl/etc/init.d&lt;br /&gt;
for v in /tmp/apkovl/etc/openvpn/*.conf ; do&lt;br /&gt;
  vn=$(basename $v|cut -d. -f1)&lt;br /&gt;
  ln -fs openvpn /tmp/apkovl/etc/init.d/openvpn.$vn&lt;br /&gt;
  ln -fs /etc/init.d/openvpn.$vn /tmp/apkovl/etc/runlevels/default/openvpn.$vn&lt;br /&gt;
done&lt;br /&gt;
# config done ; commit&lt;br /&gt;
tar czf /boot/$(hostname).apkovl.tar.gz .&lt;br /&gt;
# now the booltoader ; this will kill the active grub...&lt;br /&gt;
cat &amp;gt; /boot/extlinux.conf &amp;lt;&amp;lt; EOF&lt;br /&gt;
timeout 20&lt;br /&gt;
prompt 1&lt;br /&gt;
default hardened&lt;br /&gt;
label hardened&lt;br /&gt;
    kernel /boot/vmlinuz-hardened&lt;br /&gt;
    initrd /boot/initramfs-hardened&lt;br /&gt;
    append alpine_dev=sda1:ext2 modloop=modloop-hardened modules=loop,cramfs,sd-mod,usb-storage,ext2 quiet&lt;br /&gt;
EOF&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sda&lt;br /&gt;
extlinux -i /boot&lt;br /&gt;
# done&lt;br /&gt;
sync&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
usage: &amp;lt;pre&amp;gt;~:# prepare-jessie-for-alpine&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stage 2 ==&lt;br /&gt;
&lt;br /&gt;
not tested yet in this procedure but used successfully (a small variant) to prepare new AL boxes. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;setup-albox-from-debian&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
BEGIN=$(date +%s)&lt;br /&gt;
name=$1&lt;br /&gt;
D=sda&lt;br /&gt;
echo &amp;quot;Manufacturing box named *${name}*...&amp;quot; &lt;br /&gt;
rc-service modloop stop&lt;br /&gt;
umount /media/${D}* || (echo &amp;quot;Unable to unmount ${D}. Aborting...&amp;quot; ; exit 1)&lt;br /&gt;
### Partition the SSD $D&lt;br /&gt;
# f2fs want partition of type ext2 in parted&lt;br /&gt;
parted -a cylinder -s /dev/${D} -- \&lt;br /&gt;
 mklabel msdos                \&lt;br /&gt;
 mkpart primary fat32 0%  1%  \&lt;br /&gt;
 mkpart primary ext2  1%  2%  \&lt;br /&gt;
 mkpart primary ext2  2%  7%  \&lt;br /&gt;
 mkpart extended      7% 100% \&lt;br /&gt;
 mkpart logical ext2  7%  9%  \&lt;br /&gt;
 mkpart logical ext2  9% 15%  \&lt;br /&gt;
 mkpart logical ext2 15% 20%  \&lt;br /&gt;
 mkpart logical ext2 21% 22%  \&lt;br /&gt;
 mkpart logical ext2 22% 23%  \&lt;br /&gt;
 mkpart logical ext2 23% 24%  \&lt;br /&gt;
 mkpart logical ext2 24% 25%  \&lt;br /&gt;
 mkpart logical ext2 25% 26%  \&lt;br /&gt;
 mkpart logical ext2 26% 27%  \&lt;br /&gt;
 mkpart logical ext2 27% 28%  \&lt;br /&gt;
 mkpart logical ext2 28% 29%  \&lt;br /&gt;
 mkpart logical ext2 29% 30%  \&lt;br /&gt;
 set 1 boot on                \&lt;br /&gt;
 || exit 1&lt;br /&gt;
### prepare boot partition&lt;br /&gt;
mkfs.vfat /dev/${D}1 || exit 1&lt;br /&gt;
mkdir -p /media/${D}1&lt;br /&gt;
setup-bootable /media/${B} /dev/${D}1 || exit 1&lt;br /&gt;
mount -t vfat /dev/${D}1 /media/${D}1 || exit 1&lt;br /&gt;
### format partition to hold apkovl and apk/cache; it must be of ext? type&lt;br /&gt;
mkfs.ext4 -F -q /dev/${D}2 || exit 1&lt;br /&gt;
mkdir -p /media/${D}2&lt;br /&gt;
mount -t ext4 /dev/${D}2 /media/${D}2 || exit 1&lt;br /&gt;
### format remaining partitions with f2fs&lt;br /&gt;
for i in $(seq 3 16);do&lt;br /&gt;
  [ $i -eq 4 ] &amp;amp;&amp;amp; continue&lt;br /&gt;
  mkfs.f2fs -q /dev/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i&lt;br /&gt;
  mount -t f2fs /dev/${D}$i /media/${D}$i || exit 1&lt;br /&gt;
done&lt;br /&gt;
### copy apkovl and apk/cache and stuff&lt;br /&gt;
rsync -azur --numeric-ids root@my.server.home:sda* /media/ || exit 1&lt;br /&gt;
### prepare new apkovl&lt;br /&gt;
rm -fr /tmp/template&lt;br /&gt;
mkdir -p /tmp/template&lt;br /&gt;
tar xzf /media/${S}2/$(hostname).apkovl.tar.gz -C /tmp/template || exit 1&lt;br /&gt;
rm /media/${D}2/$(hostname).apkovl.tar.gz&lt;br /&gt;
cd /tmp/template&lt;br /&gt;
rm -f etc/ssh/ssh_host_*&lt;br /&gt;
for f in $(grep -r $(hostname) etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/$(hostname)/${name}/g $f;done&lt;br /&gt;
for f in $(grep -r ${S} etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/${S}/${D}/g $f;done&lt;br /&gt;
echo &amp;quot;/dev/sdb2 /media/sdb2 ext4 ro,relatime,errors=continue,user_xattr,acl 0 2&amp;quot; &amp;gt; etc/fstab&lt;br /&gt;
# remaining partitions are for own stuff&lt;br /&gt;
# partition 4 is the extended one &lt;br /&gt;
# (we maybe could just skip 3 and directly jump to extended for own stuff to simplify install script)&lt;br /&gt;
echo &amp;quot;/dev/sda3 /media/sda3 f2fs defaults,ro 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab&lt;br /&gt;
for i in $(seq 5 16);do echo &amp;quot;/dev/sda$i /media/sda$i f2fs defaults 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab;done&lt;br /&gt;
# partition 2 will hold apkovl and apk/cache&lt;br /&gt;
rm etc/apk/cache&lt;br /&gt;
ln -s /media/${D}2/cache etc/apk/cache&lt;br /&gt;
ln -s /etc/init.d/local etc/runlevels/default/local&lt;br /&gt;
tar czf /media/${D}2/${name}.apkovl.tar.gz . || exit 1&lt;br /&gt;
### done&lt;br /&gt;
sync&lt;br /&gt;
umount /media/${D}*&lt;br /&gt;
END=$(date +%s)&lt;br /&gt;
DURATION=$(($END-$BEGIN))&lt;br /&gt;
echo &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
logger &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;pre&amp;gt;~:# setup-albox-from-debian mynewbox&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=14131</id>
		<title>User:Jlo/Replacing Debian Jessie with Alpine remotely</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=14131"/>
		<updated>2017-11-07T13:01:42Z</updated>

		<summary type="html">&lt;p&gt;Jlo: /* Stage 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I want to &amp;quot;upgrade&amp;quot; 200 remote Debian Jessie embedded boxes to AlpineLinux in &#039;&#039;run-from-ram&#039;&#039; mode.&lt;br /&gt;
I have already successfully and happily validated the second stage as this is a minor variation around the &amp;quot;setup-ownbox&amp;quot; script I have added to a standard PXE apkovl.&lt;br /&gt;
&lt;br /&gt;
== Stage 0 ==&lt;br /&gt;
&lt;br /&gt;
we need to prepare or a cache with reduced set of package or maybe some local repo with all needed packages needed for first stage and use that repo with no-cache option...&lt;br /&gt;
&lt;br /&gt;
[[How_to_make_a_custom_ISO_image_with_mkimage]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sh mkimage.sh --tag 3.6.2 --outdir ~/iso --arch x86_64 --repository http://my.own.repo/alpine/v3.6/main --profile jessie&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
profile_jessie() {&lt;br /&gt;
	profile_standard&lt;br /&gt;
	title=&amp;quot;AL debian&amp;quot;&lt;br /&gt;
	desc=&amp;quot;Packages included.&lt;br /&gt;
		Suitable for Local install script.&amp;quot;&lt;br /&gt;
	apks=&amp;quot;$apks openvpn wpa_supplicant wireless-tools&amp;quot;&lt;br /&gt;
	#apks=&amp;quot;$apks linux-firmware&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stage 1 ==&lt;br /&gt;
&lt;br /&gt;
something is wrong about init at reboot time :(&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;prepare-jessie-for-alpine&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
# this must be fully automatic&lt;br /&gt;
export DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
apt-get -y install rsync extlinux&lt;br /&gt;
# /boot is a separate partition&lt;br /&gt;
rm -fr /boot/boot&lt;br /&gt;
ln -sf . /boot/boot&lt;br /&gt;
# let&#039;s get system file from our install server&lt;br /&gt;
rsync -avzur my.server.home:debian/boot/* /boot/&lt;br /&gt;
rsync -avzur my.server.home:debian/apks /boot/&lt;br /&gt;
rsync -avzu my.server.home:debian/debian.apkovl.tar.gz /boot/&lt;br /&gt;
rsync -auv my.server.home:debian/.alpine-release /boot/&lt;br /&gt;
# prepare the config overlay&lt;br /&gt;
rm -fr /tmp/apkovl&lt;br /&gt;
mkdir /tmp/apkovl&lt;br /&gt;
tar xzf /boot/debian.apkovl.tar.gz -C /tmp/apkovl&lt;br /&gt;
# keep current active network connection(s) and identity&lt;br /&gt;
cp /etc/hostname /tmp/apkovl/etc/&lt;br /&gt;
cp /etc/network/interfaces  /tmp/apkovl/etc/network/&lt;br /&gt;
cp -r /etc/openvpn /tmp/apkovl/etc/&lt;br /&gt;
cp -r /etc/ssh /tmp/apkovl/etc/&lt;br /&gt;
cd /tmp/apkovl&lt;br /&gt;
# be sure the install media was not already customized for own apps&lt;br /&gt;
unlink etc/runlevels/default/local&lt;br /&gt;
# be sure active VPN connections are preserved&lt;br /&gt;
mkdir -p /tmp/apkovl/etc/init.d&lt;br /&gt;
for v in /tmp/apkovl/etc/openvpn/*.conf ; do&lt;br /&gt;
  vn=$(basename $v|cut -d. -f1)&lt;br /&gt;
  ln -fs openvpn /tmp/apkovl/etc/init.d/openvpn.$vn&lt;br /&gt;
  ln -fs /etc/init.d/openvpn.$vn /tmp/apkovl/etc/runlevels/default/openvpn.$vn&lt;br /&gt;
done&lt;br /&gt;
# config done ; commit&lt;br /&gt;
tar czf /boot/debian.apkovl.tar.gz .&lt;br /&gt;
# now the booltoader ; this will kill the active grub...&lt;br /&gt;
cat &amp;gt; /boot/extlinux.conf &amp;lt;&amp;lt; EOF&lt;br /&gt;
timeout 20&lt;br /&gt;
prompt 1&lt;br /&gt;
default hardened&lt;br /&gt;
label hardened&lt;br /&gt;
    kernel /boot/vmlinuz-hardened&lt;br /&gt;
    initrd /boot/initramfs-hardened&lt;br /&gt;
    append alpine_dev=sda1:ext2 modloop=modloop-hardened modules=loop,cramfs,sd-mod,usb-storage,ext2 quiet&lt;br /&gt;
EOF&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sda&lt;br /&gt;
extlinux -i /boot&lt;br /&gt;
# done&lt;br /&gt;
sync&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
usage: &amp;lt;pre&amp;gt;~:# prepare-jessie-for-alpine&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stage 2 ==&lt;br /&gt;
&lt;br /&gt;
not tested yet in this procedure but used successfully (a small variant) to prepare new AL boxes. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;setup-albox-from-debian&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
BEGIN=$(date +%s)&lt;br /&gt;
name=$1&lt;br /&gt;
D=sda&lt;br /&gt;
echo &amp;quot;Manufacturing box named *${name}*...&amp;quot; &lt;br /&gt;
rc-service modloop stop&lt;br /&gt;
umount /media/${D}* || (echo &amp;quot;Unable to unmount ${D}. Aborting...&amp;quot; ; exit 1)&lt;br /&gt;
### Partition the SSD $D&lt;br /&gt;
# f2fs want partition of type ext2 in parted&lt;br /&gt;
parted -a cylinder -s /dev/${D} -- \&lt;br /&gt;
 mklabel msdos                \&lt;br /&gt;
 mkpart primary fat32 0%  1%  \&lt;br /&gt;
 mkpart primary ext2  1%  2%  \&lt;br /&gt;
 mkpart primary ext2  2%  7%  \&lt;br /&gt;
 mkpart extended      7% 100% \&lt;br /&gt;
 mkpart logical ext2  7%  9%  \&lt;br /&gt;
 mkpart logical ext2  9% 15%  \&lt;br /&gt;
 mkpart logical ext2 15% 20%  \&lt;br /&gt;
 mkpart logical ext2 21% 22%  \&lt;br /&gt;
 mkpart logical ext2 22% 23%  \&lt;br /&gt;
 mkpart logical ext2 23% 24%  \&lt;br /&gt;
 mkpart logical ext2 24% 25%  \&lt;br /&gt;
 mkpart logical ext2 25% 26%  \&lt;br /&gt;
 mkpart logical ext2 26% 27%  \&lt;br /&gt;
 mkpart logical ext2 27% 28%  \&lt;br /&gt;
 mkpart logical ext2 28% 29%  \&lt;br /&gt;
 mkpart logical ext2 29% 30%  \&lt;br /&gt;
 set 1 boot on                \&lt;br /&gt;
 || exit 1&lt;br /&gt;
### prepare boot partition&lt;br /&gt;
mkfs.vfat /dev/${D}1 || exit 1&lt;br /&gt;
mkdir -p /media/${D}1&lt;br /&gt;
setup-bootable /media/${B} /dev/${D}1 || exit 1&lt;br /&gt;
mount -t vfat /dev/${D}1 /media/${D}1 || exit 1&lt;br /&gt;
### format partition to hold apkovl and apk/cache; it must be of ext? type&lt;br /&gt;
mkfs.ext4 -F -q /dev/${D}2 || exit 1&lt;br /&gt;
mkdir -p /media/${D}2&lt;br /&gt;
mount -t ext4 /dev/${D}2 /media/${D}2 || exit 1&lt;br /&gt;
### format remaining partitions with f2fs&lt;br /&gt;
for i in $(seq 3 16);do&lt;br /&gt;
  [ $i -eq 4 ] &amp;amp;&amp;amp; continue&lt;br /&gt;
  mkfs.f2fs -q /dev/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i&lt;br /&gt;
  mount -t f2fs /dev/${D}$i /media/${D}$i || exit 1&lt;br /&gt;
done&lt;br /&gt;
### copy apkovl and apk/cache and stuff&lt;br /&gt;
rsync -azur --numeric-ids root@my.server.home:sda* /media/ || exit 1&lt;br /&gt;
### prepare new apkovl&lt;br /&gt;
rm -fr /tmp/template&lt;br /&gt;
mkdir -p /tmp/template&lt;br /&gt;
tar xzf /media/${S}2/$(hostname).apkovl.tar.gz -C /tmp/template || exit 1&lt;br /&gt;
rm /media/${D}2/$(hostname).apkovl.tar.gz&lt;br /&gt;
cd /tmp/template&lt;br /&gt;
rm -f etc/ssh/ssh_host_*&lt;br /&gt;
for f in $(grep -r $(hostname) etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/$(hostname)/${name}/g $f;done&lt;br /&gt;
for f in $(grep -r ${S} etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/${S}/${D}/g $f;done&lt;br /&gt;
echo &amp;quot;/dev/sdb2 /media/sdb2 ext4 ro,relatime,errors=continue,user_xattr,acl 0 2&amp;quot; &amp;gt; etc/fstab&lt;br /&gt;
# remaining partitions are for own stuff&lt;br /&gt;
# partition 4 is the extended one &lt;br /&gt;
# (we maybe could just skip 3 and directly jump to extended for own stuff to simplify install script)&lt;br /&gt;
echo &amp;quot;/dev/sda3 /media/sda3 f2fs defaults,ro 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab&lt;br /&gt;
for i in $(seq 5 16);do echo &amp;quot;/dev/sda$i /media/sda$i f2fs defaults 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab;done&lt;br /&gt;
# partition 2 will hold apkovl and apk/cache&lt;br /&gt;
rm etc/apk/cache&lt;br /&gt;
ln -s /media/${D}2/cache etc/apk/cache&lt;br /&gt;
ln -s /etc/init.d/local etc/runlevels/default/local&lt;br /&gt;
tar czf /media/${D}2/${name}.apkovl.tar.gz . || exit 1&lt;br /&gt;
### done&lt;br /&gt;
sync&lt;br /&gt;
umount /media/${D}*&lt;br /&gt;
END=$(date +%s)&lt;br /&gt;
DURATION=$(($END-$BEGIN))&lt;br /&gt;
echo &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
logger &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;pre&amp;gt;~:# setup-albox-from-debian mynewbox&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=14130</id>
		<title>User:Jlo/Replacing Debian Jessie with Alpine remotely</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=14130"/>
		<updated>2017-11-07T12:58:58Z</updated>

		<summary type="html">&lt;p&gt;Jlo: /* Stage 0 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I want to &amp;quot;upgrade&amp;quot; 200 remote Debian Jessie embedded boxes to AlpineLinux in &#039;&#039;run-from-ram&#039;&#039; mode.&lt;br /&gt;
I have already successfully and happily validated the second stage as this is a minor variation around the &amp;quot;setup-ownbox&amp;quot; script I have added to a standard PXE apkovl.&lt;br /&gt;
&lt;br /&gt;
== Stage 0 ==&lt;br /&gt;
&lt;br /&gt;
we need to prepare or a cache with reduced set of package or maybe some local repo with all needed packages needed for first stage and use that repo with no-cache option...&lt;br /&gt;
&lt;br /&gt;
[[How_to_make_a_custom_ISO_image_with_mkimage]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sh mkimage.sh --tag 3.6.2 --outdir ~/iso --arch x86_64 --repository http://my.own.repo/alpine/v3.6/main --profile jessie&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
profile_jessie() {&lt;br /&gt;
	profile_standard&lt;br /&gt;
	title=&amp;quot;AL debian&amp;quot;&lt;br /&gt;
	desc=&amp;quot;Packages included.&lt;br /&gt;
		Suitable for Local install script.&amp;quot;&lt;br /&gt;
	apks=&amp;quot;$apks openvpn wpa_supplicant wireless-tools&amp;quot;&lt;br /&gt;
	#apks=&amp;quot;$apks linux-firmware&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stage 1 ==&lt;br /&gt;
&lt;br /&gt;
something is wrong about init at reboot time :(&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;prepare-jessie-for-alpine&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
# this must be fully automatic&lt;br /&gt;
export DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
apt-get -y install rsync extlinux&lt;br /&gt;
# /boot is a separate partition&lt;br /&gt;
rm -fr /boot/boot&lt;br /&gt;
ln -sf . /boot/boot&lt;br /&gt;
# let&#039;s get system file from our install server&lt;br /&gt;
rsync -avzur my.server.home:debian/boot/* /boot/&lt;br /&gt;
rsync -avzur my.server.home:debian/apks /boot/&lt;br /&gt;
rsync -avzu my.server.home:debian/debian.apkovl.tar.gz /boot/&lt;br /&gt;
rsync -auv my.server.home:debian/.alpine-release /boot/&lt;br /&gt;
# prepare the config overlay&lt;br /&gt;
rm -fr /tmp/apkovl&lt;br /&gt;
mkdir /tmp/apkovl&lt;br /&gt;
tar xzf /boot/debian.apkovl.tar.gz -C /tmp/apkovl&lt;br /&gt;
# keep current active network connection(s) and identity&lt;br /&gt;
cp /etc/network/interfaces  /tmp/apkovl/etc/network/&lt;br /&gt;
cp -r /etc/openvpn /tmp/apkovl/etc/&lt;br /&gt;
cp -r /etc/ssh /tmp/apkovl/etc/&lt;br /&gt;
cd /tmp/apkovl&lt;br /&gt;
# be sure the install media was not already customized for own apps&lt;br /&gt;
unlink etc/runlevels/default/local&lt;br /&gt;
# be sure active VPN connections are preserved&lt;br /&gt;
mkdir -p /tmp/apkovl/etc/init.d&lt;br /&gt;
for v in /tmp/apkovl/etc/openvpn/*.conf ; do&lt;br /&gt;
  vn=$(basename $v|cut -d. -f1)&lt;br /&gt;
  ln -fs openvpn /tmp/apkovl/etc/init.d/openvpn.$vn&lt;br /&gt;
  ln -fs /etc/init.d/openvpn.$vn /tmp/apkovl/etc/runlevels/default/openvpn.$vn&lt;br /&gt;
done&lt;br /&gt;
# config done ; commit&lt;br /&gt;
tar czf /boot/debian.apkovl.tar.gz .&lt;br /&gt;
# now the booltoader ; this will kill the active grub...&lt;br /&gt;
cat &amp;gt; /boot/extlinux.conf &amp;lt;&amp;lt; EOF&lt;br /&gt;
timeout 20&lt;br /&gt;
prompt 1&lt;br /&gt;
default hardened&lt;br /&gt;
label hardened&lt;br /&gt;
    kernel /boot/vmlinuz-hardened&lt;br /&gt;
    initrd /boot/initramfs-hardened&lt;br /&gt;
    append alpine_dev=sda1:ext2 modloop=modloop-hardened modules=loop,cramfs,sd-mod,usb-storage,ext2 quiet&lt;br /&gt;
EOF&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sda&lt;br /&gt;
extlinux -i /boot&lt;br /&gt;
# done&lt;br /&gt;
sync&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
usage: &amp;lt;pre&amp;gt;~:# prepare-jessie-for-alpine&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stage 2 ==&lt;br /&gt;
&lt;br /&gt;
not tested yet in this procedure but used successfully (a small variant) to prepare new AL boxes. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;setup-albox-from-debian&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
BEGIN=$(date +%s)&lt;br /&gt;
name=$1&lt;br /&gt;
D=sda&lt;br /&gt;
echo &amp;quot;Manufacturing box named *${name}*...&amp;quot; &lt;br /&gt;
rc-service modloop stop&lt;br /&gt;
umount /media/${D}* || (echo &amp;quot;Unable to unmount ${D}. Aborting...&amp;quot; ; exit 1)&lt;br /&gt;
### Partition the SSD $D&lt;br /&gt;
# f2fs want partition of type ext2 in parted&lt;br /&gt;
parted -a cylinder -s /dev/${D} -- \&lt;br /&gt;
 mklabel msdos                \&lt;br /&gt;
 mkpart primary fat32 0%  1%  \&lt;br /&gt;
 mkpart primary ext2  1%  2%  \&lt;br /&gt;
 mkpart primary ext2  2%  7%  \&lt;br /&gt;
 mkpart extended      7% 100% \&lt;br /&gt;
 mkpart logical ext2  7%  9%  \&lt;br /&gt;
 mkpart logical ext2  9% 15%  \&lt;br /&gt;
 mkpart logical ext2 15% 20%  \&lt;br /&gt;
 mkpart logical ext2 21% 22%  \&lt;br /&gt;
 mkpart logical ext2 22% 23%  \&lt;br /&gt;
 mkpart logical ext2 23% 24%  \&lt;br /&gt;
 mkpart logical ext2 24% 25%  \&lt;br /&gt;
 mkpart logical ext2 25% 26%  \&lt;br /&gt;
 mkpart logical ext2 26% 27%  \&lt;br /&gt;
 mkpart logical ext2 27% 28%  \&lt;br /&gt;
 mkpart logical ext2 28% 29%  \&lt;br /&gt;
 mkpart logical ext2 29% 30%  \&lt;br /&gt;
 set 1 boot on                \&lt;br /&gt;
 || exit 1&lt;br /&gt;
### prepare boot partition&lt;br /&gt;
mkfs.vfat /dev/${D}1 || exit 1&lt;br /&gt;
mkdir -p /media/${D}1&lt;br /&gt;
setup-bootable /media/${B} /dev/${D}1 || exit 1&lt;br /&gt;
mount -t vfat /dev/${D}1 /media/${D}1 || exit 1&lt;br /&gt;
### format partition to hold apkovl and apk/cache; it must be of ext? type&lt;br /&gt;
mkfs.ext4 -F -q /dev/${D}2 || exit 1&lt;br /&gt;
mkdir -p /media/${D}2&lt;br /&gt;
mount -t ext4 /dev/${D}2 /media/${D}2 || exit 1&lt;br /&gt;
### format remaining partitions with f2fs&lt;br /&gt;
for i in $(seq 3 16);do&lt;br /&gt;
  [ $i -eq 4 ] &amp;amp;&amp;amp; continue&lt;br /&gt;
  mkfs.f2fs -q /dev/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i&lt;br /&gt;
  mount -t f2fs /dev/${D}$i /media/${D}$i || exit 1&lt;br /&gt;
done&lt;br /&gt;
### copy apkovl and apk/cache and stuff&lt;br /&gt;
rsync -azur --numeric-ids root@my.server.home:sda* /media/ || exit 1&lt;br /&gt;
### prepare new apkovl&lt;br /&gt;
rm -fr /tmp/template&lt;br /&gt;
mkdir -p /tmp/template&lt;br /&gt;
tar xzf /media/${S}2/$(hostname).apkovl.tar.gz -C /tmp/template || exit 1&lt;br /&gt;
rm /media/${D}2/$(hostname).apkovl.tar.gz&lt;br /&gt;
cd /tmp/template&lt;br /&gt;
rm -f etc/ssh/ssh_host_*&lt;br /&gt;
for f in $(grep -r $(hostname) etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/$(hostname)/${name}/g $f;done&lt;br /&gt;
for f in $(grep -r ${S} etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/${S}/${D}/g $f;done&lt;br /&gt;
echo &amp;quot;/dev/sdb2 /media/sdb2 ext4 ro,relatime,errors=continue,user_xattr,acl 0 2&amp;quot; &amp;gt; etc/fstab&lt;br /&gt;
# remaining partitions are for own stuff&lt;br /&gt;
# partition 4 is the extended one &lt;br /&gt;
# (we maybe could just skip 3 and directly jump to extended for own stuff to simplify install script)&lt;br /&gt;
echo &amp;quot;/dev/sda3 /media/sda3 f2fs defaults,ro 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab&lt;br /&gt;
for i in $(seq 5 16);do echo &amp;quot;/dev/sda$i /media/sda$i f2fs defaults 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab;done&lt;br /&gt;
# partition 2 will hold apkovl and apk/cache&lt;br /&gt;
rm etc/apk/cache&lt;br /&gt;
ln -s /media/${D}2/cache etc/apk/cache&lt;br /&gt;
ln -s /etc/init.d/local etc/runlevels/default/local&lt;br /&gt;
tar czf /media/${D}2/${name}.apkovl.tar.gz . || exit 1&lt;br /&gt;
### done&lt;br /&gt;
sync&lt;br /&gt;
umount /media/${D}*&lt;br /&gt;
END=$(date +%s)&lt;br /&gt;
DURATION=$(($END-$BEGIN))&lt;br /&gt;
echo &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
logger &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;pre&amp;gt;~:# setup-albox-from-debian mynewbox&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=14127</id>
		<title>User:Jlo/Replacing Debian Jessie with Alpine remotely</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=14127"/>
		<updated>2017-11-07T08:18:17Z</updated>

		<summary type="html">&lt;p&gt;Jlo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I want to &amp;quot;upgrade&amp;quot; 200 remote Debian Jessie embedded boxes to AlpineLinux in &#039;&#039;run-from-ram&#039;&#039; mode.&lt;br /&gt;
I have already successfully and happily validated the second stage as this is a minor variation around the &amp;quot;setup-ownbox&amp;quot; script I have added to a standard PXE apkovl.&lt;br /&gt;
&lt;br /&gt;
== Stage 0 ==&lt;br /&gt;
&lt;br /&gt;
we need to prepare or a cache with reduced set of package or maybe some local repo with all needed packages needed for first stage and use that repo with no-cache option...&lt;br /&gt;
&lt;br /&gt;
== Stage 1 ==&lt;br /&gt;
&lt;br /&gt;
something is wrong about init at reboot time :(&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;prepare-jessie-for-alpine&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
# this must be fully automatic&lt;br /&gt;
export DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
apt-get -y install rsync extlinux&lt;br /&gt;
# /boot is a separate partition&lt;br /&gt;
rm -fr /boot/boot&lt;br /&gt;
ln -sf . /boot/boot&lt;br /&gt;
# let&#039;s get system file from our install server&lt;br /&gt;
rsync -avzur my.server.home:debian/boot/* /boot/&lt;br /&gt;
rsync -avzur my.server.home:debian/apks /boot/&lt;br /&gt;
rsync -avzu my.server.home:debian/debian.apkovl.tar.gz /boot/&lt;br /&gt;
rsync -auv my.server.home:debian/.alpine-release /boot/&lt;br /&gt;
# prepare the config overlay&lt;br /&gt;
rm -fr /tmp/apkovl&lt;br /&gt;
mkdir /tmp/apkovl&lt;br /&gt;
tar xzf /boot/debian.apkovl.tar.gz -C /tmp/apkovl&lt;br /&gt;
# keep current active network connection(s) and identity&lt;br /&gt;
cp /etc/network/interfaces  /tmp/apkovl/etc/network/&lt;br /&gt;
cp -r /etc/openvpn /tmp/apkovl/etc/&lt;br /&gt;
cp -r /etc/ssh /tmp/apkovl/etc/&lt;br /&gt;
cd /tmp/apkovl&lt;br /&gt;
# be sure the install media was not already customized for own apps&lt;br /&gt;
unlink etc/runlevels/default/local&lt;br /&gt;
# be sure active VPN connections are preserved&lt;br /&gt;
mkdir -p /tmp/apkovl/etc/init.d&lt;br /&gt;
for v in /tmp/apkovl/etc/openvpn/*.conf ; do&lt;br /&gt;
  vn=$(basename $v|cut -d. -f1)&lt;br /&gt;
  ln -fs openvpn /tmp/apkovl/etc/init.d/openvpn.$vn&lt;br /&gt;
  ln -fs /etc/init.d/openvpn.$vn /tmp/apkovl/etc/runlevels/default/openvpn.$vn&lt;br /&gt;
done&lt;br /&gt;
# config done ; commit&lt;br /&gt;
tar czf /boot/debian.apkovl.tar.gz .&lt;br /&gt;
# now the booltoader ; this will kill the active grub...&lt;br /&gt;
cat &amp;gt; /boot/extlinux.conf &amp;lt;&amp;lt; EOF&lt;br /&gt;
timeout 20&lt;br /&gt;
prompt 1&lt;br /&gt;
default hardened&lt;br /&gt;
label hardened&lt;br /&gt;
    kernel /boot/vmlinuz-hardened&lt;br /&gt;
    initrd /boot/initramfs-hardened&lt;br /&gt;
    append alpine_dev=sda1:ext2 modloop=modloop-hardened modules=loop,cramfs,sd-mod,usb-storage,ext2 quiet&lt;br /&gt;
EOF&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sda&lt;br /&gt;
extlinux -i /boot&lt;br /&gt;
# done&lt;br /&gt;
sync&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
usage: &amp;lt;pre&amp;gt;~:# prepare-jessie-for-alpine&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stage 2 ==&lt;br /&gt;
&lt;br /&gt;
not tested yet in this procedure but used successfully (a small variant) to prepare new AL boxes. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;setup-albox-from-debian&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
BEGIN=$(date +%s)&lt;br /&gt;
name=$1&lt;br /&gt;
D=sda&lt;br /&gt;
echo &amp;quot;Manufacturing box named *${name}*...&amp;quot; &lt;br /&gt;
rc-service modloop stop&lt;br /&gt;
umount /media/${D}* || (echo &amp;quot;Unable to unmount ${D}. Aborting...&amp;quot; ; exit 1)&lt;br /&gt;
### Partition the SSD $D&lt;br /&gt;
# f2fs want partition of type ext2 in parted&lt;br /&gt;
parted -a cylinder -s /dev/${D} -- \&lt;br /&gt;
 mklabel msdos                \&lt;br /&gt;
 mkpart primary fat32 0%  1%  \&lt;br /&gt;
 mkpart primary ext2  1%  2%  \&lt;br /&gt;
 mkpart primary ext2  2%  7%  \&lt;br /&gt;
 mkpart extended      7% 100% \&lt;br /&gt;
 mkpart logical ext2  7%  9%  \&lt;br /&gt;
 mkpart logical ext2  9% 15%  \&lt;br /&gt;
 mkpart logical ext2 15% 20%  \&lt;br /&gt;
 mkpart logical ext2 21% 22%  \&lt;br /&gt;
 mkpart logical ext2 22% 23%  \&lt;br /&gt;
 mkpart logical ext2 23% 24%  \&lt;br /&gt;
 mkpart logical ext2 24% 25%  \&lt;br /&gt;
 mkpart logical ext2 25% 26%  \&lt;br /&gt;
 mkpart logical ext2 26% 27%  \&lt;br /&gt;
 mkpart logical ext2 27% 28%  \&lt;br /&gt;
 mkpart logical ext2 28% 29%  \&lt;br /&gt;
 mkpart logical ext2 29% 30%  \&lt;br /&gt;
 set 1 boot on                \&lt;br /&gt;
 || exit 1&lt;br /&gt;
### prepare boot partition&lt;br /&gt;
mkfs.vfat /dev/${D}1 || exit 1&lt;br /&gt;
mkdir -p /media/${D}1&lt;br /&gt;
setup-bootable /media/${B} /dev/${D}1 || exit 1&lt;br /&gt;
mount -t vfat /dev/${D}1 /media/${D}1 || exit 1&lt;br /&gt;
### format partition to hold apkovl and apk/cache; it must be of ext? type&lt;br /&gt;
mkfs.ext4 -F -q /dev/${D}2 || exit 1&lt;br /&gt;
mkdir -p /media/${D}2&lt;br /&gt;
mount -t ext4 /dev/${D}2 /media/${D}2 || exit 1&lt;br /&gt;
### format remaining partitions with f2fs&lt;br /&gt;
for i in $(seq 3 16);do&lt;br /&gt;
  [ $i -eq 4 ] &amp;amp;&amp;amp; continue&lt;br /&gt;
  mkfs.f2fs -q /dev/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i&lt;br /&gt;
  mount -t f2fs /dev/${D}$i /media/${D}$i || exit 1&lt;br /&gt;
done&lt;br /&gt;
### copy apkovl and apk/cache and stuff&lt;br /&gt;
rsync -azur --numeric-ids root@my.server.home:sda* /media/ || exit 1&lt;br /&gt;
### prepare new apkovl&lt;br /&gt;
rm -fr /tmp/template&lt;br /&gt;
mkdir -p /tmp/template&lt;br /&gt;
tar xzf /media/${S}2/$(hostname).apkovl.tar.gz -C /tmp/template || exit 1&lt;br /&gt;
rm /media/${D}2/$(hostname).apkovl.tar.gz&lt;br /&gt;
cd /tmp/template&lt;br /&gt;
rm -f etc/ssh/ssh_host_*&lt;br /&gt;
for f in $(grep -r $(hostname) etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/$(hostname)/${name}/g $f;done&lt;br /&gt;
for f in $(grep -r ${S} etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/${S}/${D}/g $f;done&lt;br /&gt;
echo &amp;quot;/dev/sdb2 /media/sdb2 ext4 ro,relatime,errors=continue,user_xattr,acl 0 2&amp;quot; &amp;gt; etc/fstab&lt;br /&gt;
# remaining partitions are for own stuff&lt;br /&gt;
# partition 4 is the extended one &lt;br /&gt;
# (we maybe could just skip 3 and directly jump to extended for own stuff to simplify install script)&lt;br /&gt;
echo &amp;quot;/dev/sda3 /media/sda3 f2fs defaults,ro 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab&lt;br /&gt;
for i in $(seq 5 16);do echo &amp;quot;/dev/sda$i /media/sda$i f2fs defaults 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab;done&lt;br /&gt;
# partition 2 will hold apkovl and apk/cache&lt;br /&gt;
rm etc/apk/cache&lt;br /&gt;
ln -s /media/${D}2/cache etc/apk/cache&lt;br /&gt;
ln -s /etc/init.d/local etc/runlevels/default/local&lt;br /&gt;
tar czf /media/${D}2/${name}.apkovl.tar.gz . || exit 1&lt;br /&gt;
### done&lt;br /&gt;
sync&lt;br /&gt;
umount /media/${D}*&lt;br /&gt;
END=$(date +%s)&lt;br /&gt;
DURATION=$(($END-$BEGIN))&lt;br /&gt;
echo &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
logger &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;pre&amp;gt;~:# setup-albox-from-debian mynewbox&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=14124</id>
		<title>User:Jlo/Replacing Debian Jessie with Alpine remotely</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=14124"/>
		<updated>2017-11-07T07:51:41Z</updated>

		<summary type="html">&lt;p&gt;Jlo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I want to &amp;quot;upgrade&amp;quot; 130 remote Debian Jessie embedded boxes to AlpineLinux in &#039;&#039;run-from-ram&#039;&#039; mode.&lt;br /&gt;
I have already successfully and happily validated the second stage as this is a minor variation around the &amp;quot;setup-ownbox&amp;quot; script I have added to a standard USB-KEY apkovl.&lt;br /&gt;
&lt;br /&gt;
== Stage 0 ==&lt;br /&gt;
&lt;br /&gt;
we need to prepare or a cache with reduced set of package or maybe some local repo with all needed packages needed for first stage and use that repo with no-cache option...&lt;br /&gt;
&lt;br /&gt;
== Stage 1 ==&lt;br /&gt;
&lt;br /&gt;
something is wrong about init at reboot time :(&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;prepare-jessie-for-alpine&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
# this must be fully automatic&lt;br /&gt;
export DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
apt-get -y install rsync extlinux&lt;br /&gt;
# /boot is a separate partition&lt;br /&gt;
rm -fr /boot/boot&lt;br /&gt;
ln -sf . /boot/boot&lt;br /&gt;
# let&#039;s get system file from our install server&lt;br /&gt;
rsync -avzur my.server.home:debian/boot/* /boot/&lt;br /&gt;
rsync -avzur my.server.home:debian/apks /boot/&lt;br /&gt;
rsync -avzu my.server.home:debian/debian.apkovl.tar.gz /boot/&lt;br /&gt;
rsync -auv my.server.home:debian/.alpine-release /boot/&lt;br /&gt;
# prepare the config overlay&lt;br /&gt;
rm -fr /tmp/apkovl&lt;br /&gt;
mkdir /tmp/apkovl&lt;br /&gt;
tar xzf /boot/debian.apkovl.tar.gz -C /tmp/apkovl&lt;br /&gt;
# keep current active network connection(s) and identity&lt;br /&gt;
cp /etc/network/interfaces  /tmp/apkovl/etc/network/&lt;br /&gt;
cp -r /etc/openvpn /tmp/apkovl/etc/&lt;br /&gt;
cp -r /etc/ssh /tmp/apkovl/etc/&lt;br /&gt;
cd /tmp/apkovl&lt;br /&gt;
# be sure the install media was not already customized for own apps&lt;br /&gt;
unlink etc/runlevels/default/local&lt;br /&gt;
# be sure active VPN connections are preserved&lt;br /&gt;
mkdir -p /tmp/apkovl/etc/init.d&lt;br /&gt;
for v in /tmp/apkovl/etc/openvpn/*.conf ; do&lt;br /&gt;
  vn=$(basename $v|cut -d. -f1)&lt;br /&gt;
  ln -fs openvpn /tmp/apkovl/etc/init.d/openvpn.$vn&lt;br /&gt;
  ln -fs /etc/init.d/openvpn.$vn /tmp/apkovl/etc/runlevels/default/openvpn.$vn&lt;br /&gt;
done&lt;br /&gt;
# config done ; commit&lt;br /&gt;
tar czf /boot/debian.apkovl.tar.gz .&lt;br /&gt;
# now the booltoader ; this will kill the active grub...&lt;br /&gt;
cat &amp;gt; /boot/extlinux.conf &amp;lt;&amp;lt; EOF&lt;br /&gt;
timeout 20&lt;br /&gt;
prompt 1&lt;br /&gt;
default hardened&lt;br /&gt;
label hardened&lt;br /&gt;
    kernel /boot/vmlinuz-hardened&lt;br /&gt;
    initrd /boot/initramfs-hardened&lt;br /&gt;
    append alpine_dev=sda1:ext2 modloop=modloop-hardened modules=loop,cramfs,sd-mod,usb-storage,ext2 quiet&lt;br /&gt;
EOF&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sda&lt;br /&gt;
extlinux -i /boot&lt;br /&gt;
# done&lt;br /&gt;
sync&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
usage: &amp;lt;pre&amp;gt;~:# prepare-jessie-for-alpine&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stage 2 ==&lt;br /&gt;
&lt;br /&gt;
not tested yet in this procedure but used successfully (a small variant) to prepare new AL boxes. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;setup-albox-from-debian&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
BEGIN=$(date +%s)&lt;br /&gt;
name=$1&lt;br /&gt;
D=sda&lt;br /&gt;
echo &amp;quot;Manufacturing box named *${name}*...&amp;quot; &lt;br /&gt;
rc-service modloop stop&lt;br /&gt;
umount /media/${D}* || (echo &amp;quot;Unable to unmount ${D}. Aborting...&amp;quot; ; exit 1)&lt;br /&gt;
### Partition the SSD $D&lt;br /&gt;
# f2fs want partition of type ext2 in parted&lt;br /&gt;
parted -a cylinder -s /dev/${D} -- \&lt;br /&gt;
 mklabel msdos                \&lt;br /&gt;
 mkpart primary fat32 0%  1%  \&lt;br /&gt;
 mkpart primary ext2  1%  2%  \&lt;br /&gt;
 mkpart primary ext2  2%  7%  \&lt;br /&gt;
 mkpart extended      7% 100% \&lt;br /&gt;
 mkpart logical ext2  7%  9%  \&lt;br /&gt;
 mkpart logical ext2  9% 15%  \&lt;br /&gt;
 mkpart logical ext2 15% 20%  \&lt;br /&gt;
 mkpart logical ext2 21% 22%  \&lt;br /&gt;
 mkpart logical ext2 22% 23%  \&lt;br /&gt;
 mkpart logical ext2 23% 24%  \&lt;br /&gt;
 mkpart logical ext2 24% 25%  \&lt;br /&gt;
 mkpart logical ext2 25% 26%  \&lt;br /&gt;
 mkpart logical ext2 26% 27%  \&lt;br /&gt;
 mkpart logical ext2 27% 28%  \&lt;br /&gt;
 mkpart logical ext2 28% 29%  \&lt;br /&gt;
 mkpart logical ext2 29% 30%  \&lt;br /&gt;
 set 1 boot on                \&lt;br /&gt;
 || exit 1&lt;br /&gt;
### prepare boot partition&lt;br /&gt;
mkfs.vfat /dev/${D}1 || exit 1&lt;br /&gt;
mkdir -p /media/${D}1&lt;br /&gt;
setup-bootable /media/${B} /dev/${D}1 || exit 1&lt;br /&gt;
mount -t vfat /dev/${D}1 /media/${D}1 || exit 1&lt;br /&gt;
### format partition to hold apkovl and apk/cache; it must be of ext? type&lt;br /&gt;
mkfs.ext4 -F -q /dev/${D}2 || exit 1&lt;br /&gt;
mkdir -p /media/${D}2&lt;br /&gt;
mount -t ext4 /dev/${D}2 /media/${D}2 || exit 1&lt;br /&gt;
### format remaining partitions with f2fs&lt;br /&gt;
for i in $(seq 3 16);do&lt;br /&gt;
  [ $i -eq 4 ] &amp;amp;&amp;amp; continue&lt;br /&gt;
  mkfs.f2fs -q /dev/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i&lt;br /&gt;
  mount -t f2fs /dev/${D}$i /media/${D}$i || exit 1&lt;br /&gt;
done&lt;br /&gt;
### copy apkovl and apk/cache and stuff&lt;br /&gt;
rsync -azur --numeric-ids root@my.server.home:sda* /media/ || exit 1&lt;br /&gt;
### prepare new apkovl&lt;br /&gt;
rm -fr /tmp/template&lt;br /&gt;
mkdir -p /tmp/template&lt;br /&gt;
tar xzf /media/${S}2/$(hostname).apkovl.tar.gz -C /tmp/template || exit 1&lt;br /&gt;
rm /media/${D}2/$(hostname).apkovl.tar.gz&lt;br /&gt;
cd /tmp/template&lt;br /&gt;
rm -f etc/ssh/ssh_host_*&lt;br /&gt;
for f in $(grep -r $(hostname) etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/$(hostname)/${name}/g $f;done&lt;br /&gt;
for f in $(grep -r ${S} etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/${S}/${D}/g $f;done&lt;br /&gt;
echo &amp;quot;/dev/sdb2 /media/sdb2 ext4 ro,relatime,errors=continue,user_xattr,acl 0 2&amp;quot; &amp;gt; etc/fstab&lt;br /&gt;
# remaining partitions are for own stuff&lt;br /&gt;
# partition 4 is the extended one &lt;br /&gt;
# (we maybe could just skip 3 and directly jump to extended for own stuff to simplify install script)&lt;br /&gt;
echo &amp;quot;/dev/sda3 /media/sda3 f2fs defaults,ro 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab&lt;br /&gt;
for i in $(seq 5 16);do echo &amp;quot;/dev/sda$i /media/sda$i f2fs defaults 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab;done&lt;br /&gt;
# partition 2 will hold apkovl and apk/cache&lt;br /&gt;
rm etc/apk/cache&lt;br /&gt;
ln -s /media/${D}2/cache etc/apk/cache&lt;br /&gt;
ln -s /etc/init.d/local etc/runlevels/default/local&lt;br /&gt;
tar czf /media/${D}2/${name}.apkovl.tar.gz . || exit 1&lt;br /&gt;
### done&lt;br /&gt;
sync&lt;br /&gt;
umount /media/${D}*&lt;br /&gt;
END=$(date +%s)&lt;br /&gt;
DURATION=$(($END-$BEGIN))&lt;br /&gt;
echo &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
logger &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;pre&amp;gt;~:# setup-albox-from-debian mynewbox&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=How_to_make_a_custom_ISO_image_with_mkimage&amp;diff=13949</id>
		<title>How to make a custom ISO image with mkimage</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=How_to_make_a_custom_ISO_image_with_mkimage&amp;diff=13949"/>
		<updated>2017-09-21T12:42:45Z</updated>

		<summary type="html">&lt;p&gt;Jlo: /* Create the ISO */  add usage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document explains how to build a custom ISO image using the new mkimage scripts located in aports directory.&lt;br /&gt;
&lt;br /&gt;
== Prerequisite ==&lt;br /&gt;
&lt;br /&gt;
First make sure we have the needed tools&lt;br /&gt;
{{Cmd|apk add alpine-sdk build-base apk-tools alpine-conf busybox fakeroot syslinux xorriso}}&lt;br /&gt;
For efi you shoud add&lt;br /&gt;
{{Cmd|mtools dosfstools grub-efi}}&lt;br /&gt;
&lt;br /&gt;
Create a user (e.g. build) and add it to abuild group:&lt;br /&gt;
{{Cmd|adduser build -G abuild}}&lt;br /&gt;
&lt;br /&gt;
Then create signing keys (-i installs them in /etc/apk/keys which is required for later)&lt;br /&gt;
{{Cmd|abuild-keygen -i -a}}&lt;br /&gt;
&lt;br /&gt;
{{Tip| Make sure your public keys are placed in /etc/apk/keys/ (example: build-xxxxxxxx.rsa.pub):&lt;br /&gt;
{{Cmd|ls /etc/apk/keys/}}&lt;br /&gt;
&lt;br /&gt;
Clone (or update) the [http://git.alpinelinux.org/cgit/aports/ git repository].&lt;br /&gt;
{{Cmd|git clone git://git.alpinelinux.org/aports}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make sure the apk index is up to date (so apk finds the packages):&lt;br /&gt;
{{Cmd|apk update}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The mkimg scripts are shipped with pre-configured profiles.&lt;br /&gt;
&lt;br /&gt;
The format is &#039;&#039;&#039;mkimg.$PROFILENAME.sh&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
So, in order to have a custom ISO, you should create your own &#039;&#039;&#039;mkimg.$PROFILENAME.sh&#039;&#039;&#039; script.&lt;br /&gt;
&lt;br /&gt;
This is an example used to have ZFS module, overlayfs (which allows to have /lib/modules in r/w), a serial console output and some other useful apks to build a simple NAS:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;export PROFILENAME=nas&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; ~/aports/scripts/mkimg.$PROFILENAME.sh&lt;br /&gt;
profile_$PROFILENAME() {&lt;br /&gt;
        profile_standard&lt;br /&gt;
        kernel_cmdline=&amp;quot;unionfs_size=512M console=tty0 console=ttyS0,115200&amp;quot;&lt;br /&gt;
        syslinux_serial=&amp;quot;0 115200&amp;quot;&lt;br /&gt;
        kernel_addons=&amp;quot;zfs spl&amp;quot;&lt;br /&gt;
        apks=&amp;quot;\$apks iscsi-scst zfs-scripts zfs zfs-utils-py&lt;br /&gt;
                cciss_vol_status lvm2 mdadm mkinitfs mtools nfs-utils&lt;br /&gt;
                parted rsync sfdisk syslinux unrar util-linux xfsprogs&lt;br /&gt;
                dosfstools ntfs-3g&lt;br /&gt;
                &amp;quot;&lt;br /&gt;
        local _k _a&lt;br /&gt;
        for _k in \$kernel_flavors; do&lt;br /&gt;
                apks=&amp;quot;\$apks linux-\$_k&amp;quot;&lt;br /&gt;
                for _a in \$kernel_addons; do&lt;br /&gt;
                        apks=&amp;quot;\$apks \$_a-\$_k&amp;quot;&lt;br /&gt;
                done&lt;br /&gt;
        done&lt;br /&gt;
        apks=&amp;quot;\$apks linux-firmware&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Set the script as executable:&lt;br /&gt;
{{Cmd|chmod +x mkimg.$PROFILENAME.sh}}&lt;br /&gt;
&lt;br /&gt;
== Create the ISO ==&lt;br /&gt;
&lt;br /&gt;
{{Cmd|mkimage.sh	[--tag RELEASE] [--outdir OUTDIR] [--workdir WORKDIR]&lt;br /&gt;
		[--arch ARCH] [--profile PROFILE] [--hostkeys] [--simulate]&lt;br /&gt;
		[--repository REPO] [--extra-repository REPO] [--yaml FILE]&lt;br /&gt;
mkimage.sh	--help&lt;br /&gt;
&lt;br /&gt;
options:&lt;br /&gt;
--arch			Specify which architecture images to build&lt;br /&gt;
			(default: x86_64)&lt;br /&gt;
--hostkeys		Copy system apk signing keys to created images&lt;br /&gt;
--outdir		Specify directory for the created images&lt;br /&gt;
--profile		Specify which profiles to build&lt;br /&gt;
--repository		Package repository to use for the image create&lt;br /&gt;
--extra-repository	Add repository to search packages from&lt;br /&gt;
--simulate		Don&#039;t execute commands&lt;br /&gt;
--tag			Build images for tag RELEASE&lt;br /&gt;
--workdir		Specify temporary working directory (cache)&lt;br /&gt;
--yaml&lt;br /&gt;
&lt;br /&gt;
known profiles: ali rpi uboot base minirootfs standard vanilla extended virt xen}}&lt;br /&gt;
&lt;br /&gt;
Create a iso directory in your home dir:&lt;br /&gt;
&lt;br /&gt;
{{Cmd|mkdir -p ~/iso}}&lt;br /&gt;
&lt;br /&gt;
Then create the actual ISO.&lt;br /&gt;
In this example we will use the edge version x86_64:&lt;br /&gt;
{{Cmd|sh mkimage.sh --tag edge \&lt;br /&gt;
	--outdir ~/iso \&lt;br /&gt;
	--arch x86_64 \&lt;br /&gt;
	--repository http://dl-cdn.alpinelinux.org/alpine/edge/main \&lt;br /&gt;
	--profile $PROFILENAME&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notes:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Of course, several passages of this doc can be automated with a script, like the repository/arch/outdir settings.&lt;br /&gt;
This steps are left to you and to your imagination :)&lt;br /&gt;
&lt;br /&gt;
== Testing your ISO image ==&lt;br /&gt;
&lt;br /&gt;
[[Qemu#Live_mode| Qemu]] is useful for a quick test of your created ISO image.&lt;br /&gt;
&lt;br /&gt;
[[Category:Package Manager]]&lt;br /&gt;
[[Category:ISO]]&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo&amp;diff=13889</id>
		<title>User:Jlo</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo&amp;diff=13889"/>
		<updated>2017-09-20T07:00:54Z</updated>

		<summary type="html">&lt;p&gt;Jlo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I was [[User:Jch]] but I forgot my passwd and the email used to suscribe is not valid anymore...&lt;br /&gt;
&lt;br /&gt;
I&#039;m today senior system architect at some startup.&amp;lt;br/&amp;gt;&lt;br /&gt;
We are building a network of embedded devices controlling hardware stuff.&amp;lt;br/&amp;gt;&lt;br /&gt;
I&#039;m stepping it as the product is transitioning from prototype phase to industrial phase.&lt;br /&gt;
&lt;br /&gt;
The main app is written for Oracle Java8 and running in Apache/Karaf environment.&lt;br /&gt;
&lt;br /&gt;
The proto was done with Debian Jessie boxes managed with salt stack (about 100).&lt;br /&gt;
&lt;br /&gt;
I would like to see the boxes running AL in &#039;&#039;run-from-ram&#039;&#039; mode pulling the apkovl tarball (or at least some tarball to be applied in the /etc/local.d sequence) from a remote server somewhere in the cloud.&amp;lt;br/&amp;gt;&lt;br /&gt;
To upgrade would just to rsync the normally read-only SSD and reboot.&lt;br /&gt;
&lt;br /&gt;
To achieve this with AlpineLinux, one has to:&lt;br /&gt;
&lt;br /&gt;
*    deploy [[User:Jlo/java8|Oracle Java 7 with glibc]]&lt;br /&gt;
*    deploy [[User:Jlo/java8|Oracle Java 8 with glibc]]&lt;br /&gt;
*    deploy [[User:Jlo/python27|python2.7 with needed libs]]&lt;br /&gt;
*    deploy [[User:Jlo/python3|python3 with needed libs]]&lt;br /&gt;
*    deploy [[User:Jlo/watchdog|hardware watchdog]]&lt;br /&gt;
*    deploy [[User:Jlo/network|network drivers]] (eth, usb-eth, wlan, 3g, lte)&lt;br /&gt;
*    deploy [[User:Jlo/usb|USB drivers]]&lt;br /&gt;
*    rewrite [[User:Jlo/init|init scripts]]&lt;br /&gt;
*    prepare a [[User:Jlo/image|custom image]] with every needed packages locally present in disk repo&lt;br /&gt;
*    adapt [[User:Jlo/packages|custom packages]] from deb to apk ones&lt;br /&gt;
&lt;br /&gt;
To configure a box is done in two parts:&lt;br /&gt;
&lt;br /&gt;
*    the network. done locally&lt;br /&gt;
*    the app layer. done via a webinterface; commited to a server and download by the box at each boot.&lt;br /&gt;
&lt;br /&gt;
The advantages of such architecture are:&lt;br /&gt;
&lt;br /&gt;
* power failure resilient as the system runs from ram&amp;lt;br/&amp;gt;The only PoF here is when an upgrade of the read-only medium is done&lt;br /&gt;
* boxes use a pull mechanism to stay up-to-date ensuring the right version at any next reboot&amp;lt;br/&amp;gt;This protect us against out-of-sync boxes arraising often with push architecture (salt, ansible, ...)&lt;br /&gt;
* the two steps boot sequence allows us to temporary take control over a box for maintenance with a totally different setup&amp;lt;br/&amp;gt;and as we always keep an ssh access via the VPN, we can force that anytime we want (hardware watchdog being our friend here)&lt;br /&gt;
* easy to reproduce in VM for testing (including load tests)&lt;br /&gt;
&lt;br /&gt;
Disadvantages are:&lt;br /&gt;
&lt;br /&gt;
* need own repo with access control to distribute Oracle Java internally without breach of license&amp;lt;br/&amp;gt;(but it is the same situation for any distro)&lt;br /&gt;
* some used packages are distributed as deb only (from artifactory between others)&amp;lt;br/&amp;gt;will need to script part of the CI towards apk generation...&amp;lt;br/&amp;gt;will need to check every deb to see if sources are available...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
See also [[User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely|Replacing Debian Jessie with Alpine remotely]]&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Talk:PXE_boot&amp;diff=13838</id>
		<title>Talk:PXE boot</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Talk:PXE_boot&amp;diff=13838"/>
		<updated>2017-09-18T16:16:06Z</updated>

		<summary type="html">&lt;p&gt;Jlo: /* Running Alpine PXE server in sys mode */ new section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Details for generating pxerd ==&lt;br /&gt;
&lt;br /&gt;
This is how I do it to prepare a PXEboot for qemu machines from a &#039;&#039;run-from-ram-from-cdrom&#039;&#039; &amp;lt;pre&amp;gt;&lt;br /&gt;
setup-interfaces&lt;br /&gt;
/etc/init.d/networking start&lt;br /&gt;
setup-proxy &lt;br /&gt;
. /etc/profile.d/proxy.sh&lt;br /&gt;
setup-apkrepos&lt;br /&gt;
apk update&lt;br /&gt;
apk add mkinitfs openssh-client&lt;br /&gt;
cd /etc/mkinitfs/features.d/&lt;br /&gt;
echo &amp;quot;kernel/drivers/net/virtio_net.ko&amp;quot; &amp;gt;&amp;gt; network.modules&lt;br /&gt;
echo &amp;quot;/usr/share/udhcpc/default.script&amp;quot; &amp;gt; dhcp.files&lt;br /&gt;
echo &amp;quot;kernel/net/packet/af_packet.ko&amp;quot; &amp;gt; dhcp.modules&lt;br /&gt;
echo &amp;quot;kernel/fs/nfs/*&amp;quot; &amp;gt; nfs.modules&lt;br /&gt;
cd /etc/mkinitfs/&lt;br /&gt;
echo &#039;features=&amp;quot;ata base bootchart cdrom cramfs ext2 ext3 ext4 xfs floppy keymap kms raid scsi usb virtio squashfs network dhcp nfs&amp;quot;&#039; &amp;gt; mkinitfs.conf&lt;br /&gt;
mkinitfs -o /root/pxerd&lt;br /&gt;
scp /root/pxerd $TFTPSERVER:$TFTPPATH&lt;br /&gt;
scp /media/cdrom/boot/vmlinuz-grsec $TFTPSERVER:$TFTPPATH&lt;br /&gt;
scp -r /media/cdrom/* $NFSSERVER:$NFSPATH&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For your specific setup, adjust the network.modules with needed kernel drivers.&lt;br /&gt;
&lt;br /&gt;
--[[User:Jch|Jch]] ([[User talk:Jch|talk]]) 09:00, 16 March 2015 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Packages not in the initial ISO ==&lt;br /&gt;
&lt;br /&gt;
Be sure to have a local repo on the LAN with all needed package and to specify (alpine_repo=http://...) it the APPEND line of the pxelinux.cfg/config_file!&lt;br /&gt;
&lt;br /&gt;
== Running Alpine PXE server in sys mode ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pxeal:~# cat /etc/apk/world &lt;br /&gt;
acct&lt;br /&gt;
alpine-base&lt;br /&gt;
dnsmasq&lt;br /&gt;
e2fsprogs&lt;br /&gt;
iptables&lt;br /&gt;
lighttpd&lt;br /&gt;
linux-hardened&lt;br /&gt;
nfs-utils&lt;br /&gt;
openssh&lt;br /&gt;
syslinux&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pxeal:~# lbu ls&lt;br /&gt;
etc/fstab&lt;br /&gt;
etc/conf.d/keymaps&lt;br /&gt;
etc/mkinitfs/mkinitfs.conf&lt;br /&gt;
etc/mkinitfs/features.d/dhcp.files&lt;br /&gt;
etc/mkinitfs/features.d/dhcp.modules&lt;br /&gt;
etc/mkinitfs/features.d/network.modules&lt;br /&gt;
etc/mkinitfs/features.d/nfs.modules&lt;br /&gt;
etc/runlevels/shutdown/savecache&lt;br /&gt;
etc/runlevels/shutdown/killprocs&lt;br /&gt;
etc/runlevels/shutdown/mount-ro&lt;br /&gt;
etc/runlevels/sysinit/hwdrivers&lt;br /&gt;
etc/runlevels/sysinit/mdev&lt;br /&gt;
etc/runlevels/sysinit/dmesg&lt;br /&gt;
etc/runlevels/sysinit/devfs&lt;br /&gt;
etc/runlevels/default/lighttpd&lt;br /&gt;
etc/runlevels/default/sshd&lt;br /&gt;
etc/runlevels/default/iptables&lt;br /&gt;
etc/runlevels/default/nfs&lt;br /&gt;
etc/runlevels/default/crond&lt;br /&gt;
etc/runlevels/default/dnsmasq&lt;br /&gt;
etc/runlevels/default/acpid&lt;br /&gt;
etc/runlevels/boot/keymaps&lt;br /&gt;
etc/runlevels/boot/sysctl&lt;br /&gt;
etc/runlevels/boot/bootmisc&lt;br /&gt;
etc/runlevels/boot/syslog&lt;br /&gt;
etc/runlevels/boot/modules&lt;br /&gt;
etc/runlevels/boot/swap&lt;br /&gt;
etc/runlevels/boot/networking&lt;br /&gt;
etc/runlevels/boot/urandom&lt;br /&gt;
etc/runlevels/boot/hostname&lt;br /&gt;
etc/runlevels/boot/hwclock&lt;br /&gt;
etc/resolv.conf&lt;br /&gt;
etc/update-extlinux.conf&lt;br /&gt;
etc/iptables/rules-save&lt;br /&gt;
etc/shadow&lt;br /&gt;
etc/network/interfaces&lt;br /&gt;
etc/keymap/&lt;br /&gt;
etc/keymap/be.bmap.gz&lt;br /&gt;
etc/dnsmasq.d/pxeboot.conf&lt;br /&gt;
etc/passwd-&lt;br /&gt;
etc/group-&lt;br /&gt;
etc/hosts&lt;br /&gt;
etc/sysctl.d/01-manufacture.conf&lt;br /&gt;
etc/shadow-&lt;br /&gt;
etc/group&lt;br /&gt;
etc/passwd&lt;br /&gt;
etc/ssh/ssh_host_ed25519_key&lt;br /&gt;
etc/ssh/ssh_host_rsa_key.pub&lt;br /&gt;
etc/ssh/ssh_host_ecdsa_key.pub&lt;br /&gt;
etc/ssh/ssh_host_dsa_key.pub&lt;br /&gt;
etc/ssh/ssh_host_rsa_key&lt;br /&gt;
etc/ssh/ssh_host_ed25519_key.pub&lt;br /&gt;
etc/ssh/ssh_host_dsa_key&lt;br /&gt;
etc/ssh/ssh_host_ecdsa_key&lt;br /&gt;
etc/fstab.old&lt;br /&gt;
etc/apk/arch&lt;br /&gt;
etc/apk/protected_paths.d/lbu.list&lt;br /&gt;
etc/apk/keys/alpine-devel@lists.alpinelinux.org-5243ef4b.rsa.pub&lt;br /&gt;
etc/apk/keys/alpine-devel@lists.alpinelinux.org-4a6a0840.rsa.pub&lt;br /&gt;
etc/apk/keys/alpine-devel@lists.alpinelinux.org-5261cecb.rsa.pub&lt;br /&gt;
etc/apk/repositories&lt;br /&gt;
etc/apk/world&lt;br /&gt;
etc/zoneinfo/&lt;br /&gt;
etc/zoneinfo/Europe/&lt;br /&gt;
etc/zoneinfo/Europe/Zurich&lt;br /&gt;
etc/localtime&lt;br /&gt;
etc/hostname&lt;br /&gt;
etc/exports&lt;br /&gt;
var/www/localhost/htdocs/pxe-default.apkovl.tar.gz&lt;br /&gt;
var/www/localhost/htdocs/modloop-hardened&lt;br /&gt;
var/lib/tftpboot/pxelinux/pxelinux.cfg/default&lt;br /&gt;
var/lib/tftpboot/pxelinux/pxelinux.0&lt;br /&gt;
var/lib/tftpboot/pxelinux/initramfs-hardened&lt;br /&gt;
var/lib/tftpboot/pxelinux/ldlinux.c32&lt;br /&gt;
var/lib/tftpboot/pxelinux/vmlinuz-hardened&lt;br /&gt;
root/.ssh/authorized_keys&lt;br /&gt;
&amp;lt;/pre &amp;gt; 114.8M &#039;&#039;&#039;pxeal.apkovl.tar.gz&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
with custom made initramfs along first note.&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Dualbooting&amp;diff=13756</id>
		<title>Dualbooting</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Dualbooting&amp;diff=13756"/>
		<updated>2017-09-07T11:19:25Z</updated>

		<summary type="html">&lt;p&gt;Jlo: /* Installing bootloader manually */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Assume you have a box where you run Ubuntu or your favourite distro. Now you would like to be able to boot either your already installed system or Alpine.&lt;br /&gt;
&lt;br /&gt;
= Prepare your hardware =&lt;br /&gt;
You will need a partition for your Alpine installation. If you don&#039;t already have one free, you need to create a primary partition with enough space for your Alpine installation. The tools you use for managing your partitions might differ, so you need to figure out your self how to use them. &amp;lt;tt&amp;gt;fdisk&amp;lt;/tt&amp;gt; can help.&lt;br /&gt;
&lt;br /&gt;
Make notes of what partition you will use for your Alpine installation. In this example we are going to install Alpine on &#039;&#039;&#039;/dev/sda3&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Installing Alpine on HDD =&lt;br /&gt;
&lt;br /&gt;
Now it&#039;s time to install Alpine. Boot your system with a CD containing the latest Alpine Standard from [http://alpinelinux.org/downloads Downloads].&lt;br /&gt;
&lt;br /&gt;
== Format and mount HDD partition ==&lt;br /&gt;
&lt;br /&gt;
First format your partition. We will need some tools for doing the formatting. After you are done those tools can be removed.&lt;br /&gt;
&lt;br /&gt;
{{Cmd|apk add e2fsprogs&lt;br /&gt;
mkfs.ext3 /dev/sda3&lt;br /&gt;
apk del e2fsprogs}}&lt;br /&gt;
&lt;br /&gt;
{{Warning|Make sure you format the right partition! The {{Path|/dev/sda3}} is only a example. If you choose the wrong partition your data will be gone. Make a backup first when you are unsure.}}&lt;br /&gt;
&lt;br /&gt;
Mount the newly formatted partition. After the mounting the partition will be available at {{Path|/mnt}}.&lt;br /&gt;
{{Cmd|mount -t ext3 /dev/sda3 /mnt}}&lt;br /&gt;
&lt;br /&gt;
== Basic setup ==&lt;br /&gt;
&lt;br /&gt;
Next, do some basic setup for your Alpine system.&lt;br /&gt;
&lt;br /&gt;
In Alpine 2.2.3 or newer, type:&lt;br /&gt;
{{Cmd|setup-timezone&lt;br /&gt;
setup-alpine -q&lt;br /&gt;
setup-sshd&lt;br /&gt;
setup-ntp}}&lt;br /&gt;
&lt;br /&gt;
See [[setup-alpine]] for more details. (If you omit the &amp;lt;code&amp;gt;-q&amp;lt;/code&amp;gt; flag to &amp;lt;code&amp;gt;setup-alpine&amp;lt;/code&amp;gt;, you&#039;ll be prompted &amp;quot;Which disks yous you like to use?&amp;quot; Answer &amp;quot;none&amp;quot;, and also answer &amp;quot;none&amp;quot; to the remaining prompts, about storing configs and an apk cache directory.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- If the &amp;quot;answerfile&amp;quot; functionality of setup-alpine is changed to permit specifying &amp;quot;-m none&amp;quot; for setup-disk, this sequence could be expressed more concisely.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Install Alpine ==&lt;br /&gt;
&lt;br /&gt;
Now it&#039;s time to put our files on the partition.&lt;br /&gt;
&lt;br /&gt;
If using Alpine Linux 2.2.3 or higher, just type:&lt;br /&gt;
{{Cmd|setup-disk -m sys /mnt}}&lt;br /&gt;
&lt;br /&gt;
{{Tip|If you use extlinux and you didn&#039;t create a separate boot partition ({{Path|/boot}} is on the root partition {{Path|/}}), you might need to update the path to vmlinuz in {{Path|/boot/extlinux.conf}}, eg.:&lt;br /&gt;
&amp;lt;pre&amp;gt;[...]&lt;br /&gt;
LABEL grsec&lt;br /&gt;
  MENU DEFAULT&lt;br /&gt;
  MENU LABEL Linux grsec&lt;br /&gt;
  LINUX /boot/vmlinuz-grsec&lt;br /&gt;
[...]&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
If using an earlier version of Alpine Linux, you&#039;ll need to install the files and bootloader manually, as described below.&lt;br /&gt;
&lt;br /&gt;
=== Installing files manually ===&lt;br /&gt;
&lt;br /&gt;
{{Tip|If using a version of Alpine Linux older than 2.2.0, replace {{Path|/etc/apk/world}} in the last line with {{Path|/var/lib/apk/world}}}}&lt;br /&gt;
&lt;br /&gt;
{{Cmd|lbu package - {{!}} tar -C /mnt -xzf -&lt;br /&gt;
apk add --root /mnt --initdb --repositories-file /etc/apk/repositores --keys-dir \&lt;br /&gt;
  /etc/apk/keys $(cat /etc/apk/world) acct linux-grsec alpine-base}}&lt;br /&gt;
&lt;br /&gt;
Your system is now on {{Path|/dev/sda3}}. Next thing is to be able to boot on it.&lt;br /&gt;
&lt;br /&gt;
=== Installing bootloader manually ===&lt;br /&gt;
&lt;br /&gt;
On your system you already have a bootloader of some kind. The bootloaders vary, so you need to figure out how to make it boot your Alpine distro. Hopefully you get some ideas by looking at the following example below.&lt;br /&gt;
&lt;br /&gt;
In my case I have Grub2 so I will describe what I did to boot Alpine.&lt;br /&gt;
&lt;br /&gt;
Reboot your system &#039;&#039;(start Ubuntu)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Start a &#039;terminal&#039; &#039;&#039;(ALT-F2 + &amp;quot;terminal&amp;quot; + [Run])&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Take notes of the UUID of the partition you are planning to use:&lt;br /&gt;
{{Cmd|sudo blkid /dev/sda3}}&lt;br /&gt;
&lt;br /&gt;
Start editing grub2 configuration &lt;br /&gt;
{{Cmd|gksudo gedit /etc/grub.d/40_custom}}&lt;br /&gt;
&lt;br /&gt;
I edited the file so it looks something like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;#!/bin/sh&lt;br /&gt;
echo &amp;quot;Adding Alpine&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF&lt;br /&gt;
menuentry &amp;quot;Alpine Linux&amp;quot; {&lt;br /&gt;
 set root=(hd0,3)&lt;br /&gt;
 linux /boot/vmlinuz-grsec root=UUID=8de6973a-4a8c-40ed-b710-c4e2b42d6b7a modules=sd-mod,usb-storage,ext3 quiet&lt;br /&gt;
 initrd /boot/initramfs-grsec&lt;br /&gt;
}&lt;br /&gt;
EOF&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Note|The UUID-value mentioned above &#039;8de6973a-4a8c-40ed-b710-c4e2b42d6b7a&#039; should be replaced with the UUID you got when running your &#039;blkid&#039; command.}}&lt;br /&gt;
We need to tell grub2 that the config has changed&lt;br /&gt;
{{Cmd|update-grub2}}&lt;br /&gt;
&lt;br /&gt;
Now it&#039;s time to test. Reboot your box.&lt;br /&gt;
{{Note|You might need to press SHIFT when booting up your box in order to see the grub-menu.}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Installation]]&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=13743</id>
		<title>User:Jlo/Replacing Debian Jessie with Alpine remotely</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=13743"/>
		<updated>2017-08-18T14:50:12Z</updated>

		<summary type="html">&lt;p&gt;Jlo: /* Stage 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I want to &amp;quot;upgrade&amp;quot; 130 remote Debian Jessie embedded boxes to AlpineLinux in &#039;&#039;run-from-ram&#039;&#039; mode.&lt;br /&gt;
I have already successfully and happily validated the second stage as this is a minor variation around the &amp;quot;setup-ownbox&amp;quot; script I have added to a standard USB-KEY apkovl.&lt;br /&gt;
&lt;br /&gt;
== Stage 1 ==&lt;br /&gt;
&lt;br /&gt;
something is wrong about init at reboot time :(&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;prepare-jessie-for-alpine&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
# this must be fully automatic&lt;br /&gt;
export DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
apt-get -y install rsync extlinux&lt;br /&gt;
# /boot is a separate partition&lt;br /&gt;
rm -fr /boot/boot&lt;br /&gt;
ln -sf . /boot/boot&lt;br /&gt;
# let&#039;s get system file from our install server&lt;br /&gt;
rsync -avzur my.server.home:debian/boot/* /boot/&lt;br /&gt;
rsync -avzur my.server.home:debian/apks /boot/&lt;br /&gt;
rsync -avzu my.server.home:debian/debian.apkovl.tar.gz /boot/&lt;br /&gt;
rsync -auv my.server.home:debian/.alpine-release /boot/&lt;br /&gt;
# prepare the config overlay&lt;br /&gt;
rm -fr /tmp/apkovl&lt;br /&gt;
mkdir /tmp/apkovl&lt;br /&gt;
tar xzf /boot/debian.apkovl.tar.gz -C /tmp/apkovl&lt;br /&gt;
# keep current active network connection(s) and identity&lt;br /&gt;
cp /etc/network/interfaces  /tmp/apkovl/etc/network/&lt;br /&gt;
cp -r /etc/openvpn /tmp/apkovl/etc/&lt;br /&gt;
cp -r /etc/ssh /tmp/apkovl/etc/&lt;br /&gt;
cd /tmp/apkovl&lt;br /&gt;
# be sure the install media was not already customized for own apps&lt;br /&gt;
unlink etc/runlevels/default/local&lt;br /&gt;
# be sure active VPN connections are preserved&lt;br /&gt;
mkdir -p /tmp/apkovl/etc/init.d&lt;br /&gt;
for v in /tmp/apkovl/etc/openvpn/*.conf ; do&lt;br /&gt;
  vn=$(basename $v|cut -d. -f1)&lt;br /&gt;
  ln -fs openvpn /tmp/apkovl/etc/init.d/openvpn.$vn&lt;br /&gt;
  ln -fs /etc/init.d/openvpn.$vn /tmp/apkovl/etc/runlevels/default/openvpn.$vn&lt;br /&gt;
done&lt;br /&gt;
# config done ; commit&lt;br /&gt;
tar czf /boot/debian.apkovl.tar.gz .&lt;br /&gt;
# now the booltoader ; this will kill the active grub...&lt;br /&gt;
cat &amp;gt; /boot/extlinux.conf &amp;lt;&amp;lt; EOF&lt;br /&gt;
timeout 20&lt;br /&gt;
prompt 1&lt;br /&gt;
default hardened&lt;br /&gt;
label hardened&lt;br /&gt;
    kernel /boot/vmlinuz-hardened&lt;br /&gt;
    initrd /boot/initramfs-hardened&lt;br /&gt;
    append alpine_dev=sda1:ext2 modloop=modloop-hardened modules=loop,cramfs,sd-mod,usb-storage,ext2 quiet&lt;br /&gt;
EOF&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sda&lt;br /&gt;
extlinux -i /boot&lt;br /&gt;
# done&lt;br /&gt;
sync&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
usage: &amp;lt;pre&amp;gt;~:# prepare-jessie-for-alpine&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stage 2 ==&lt;br /&gt;
&lt;br /&gt;
not tested yet in this procedure but used successfully (a small variant) to prepare new AL boxes. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;setup-albox-from-debian&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
BEGIN=$(date +%s)&lt;br /&gt;
name=$1&lt;br /&gt;
D=sda&lt;br /&gt;
echo &amp;quot;Manufacturing box named *${name}*...&amp;quot; &lt;br /&gt;
rc-service modloop stop&lt;br /&gt;
umount /media/${D}* || (echo &amp;quot;Unable to unmount ${D}. Aborting...&amp;quot; ; exit 1)&lt;br /&gt;
### Partition the SSD $D&lt;br /&gt;
# f2fs want partition of type ext2 in parted&lt;br /&gt;
parted -a cylinder -s /dev/${D} -- \&lt;br /&gt;
 mklabel msdos                \&lt;br /&gt;
 mkpart primary fat32 0%  1%  \&lt;br /&gt;
 mkpart primary ext2  1%  2%  \&lt;br /&gt;
 mkpart primary ext2  2%  7%  \&lt;br /&gt;
 mkpart extended      7% 100% \&lt;br /&gt;
 mkpart logical ext2  7%  9%  \&lt;br /&gt;
 mkpart logical ext2  9% 15%  \&lt;br /&gt;
 mkpart logical ext2 15% 20%  \&lt;br /&gt;
 mkpart logical ext2 21% 22%  \&lt;br /&gt;
 mkpart logical ext2 22% 23%  \&lt;br /&gt;
 mkpart logical ext2 23% 24%  \&lt;br /&gt;
 mkpart logical ext2 24% 25%  \&lt;br /&gt;
 mkpart logical ext2 25% 26%  \&lt;br /&gt;
 mkpart logical ext2 26% 27%  \&lt;br /&gt;
 mkpart logical ext2 27% 28%  \&lt;br /&gt;
 mkpart logical ext2 28% 29%  \&lt;br /&gt;
 mkpart logical ext2 29% 30%  \&lt;br /&gt;
 set 1 boot on                \&lt;br /&gt;
 || exit 1&lt;br /&gt;
### prepare boot partition&lt;br /&gt;
mkfs.vfat /dev/${D}1 || exit 1&lt;br /&gt;
mkdir -p /media/${D}1&lt;br /&gt;
setup-bootable /media/${B} /dev/${D}1 || exit 1&lt;br /&gt;
mount -t vfat /dev/${D}1 /media/${D}1 || exit 1&lt;br /&gt;
### format partition to hold apkovl and apk/cache; it must be of ext? type&lt;br /&gt;
mkfs.ext4 -F -q /dev/${D}2 || exit 1&lt;br /&gt;
mkdir -p /media/${D}2&lt;br /&gt;
mount -t ext4 /dev/${D}2 /media/${D}2 || exit 1&lt;br /&gt;
### format remaining partitions with f2fs&lt;br /&gt;
for i in $(seq 3 16);do&lt;br /&gt;
  [ $i -eq 4 ] &amp;amp;&amp;amp; continue&lt;br /&gt;
  mkfs.f2fs -q /dev/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i&lt;br /&gt;
  mount -t f2fs /dev/${D}$i /media/${D}$i || exit 1&lt;br /&gt;
done&lt;br /&gt;
### copy apkovl and apk/cache and stuff&lt;br /&gt;
rsync -azur --numeric-ids root@my.server.home:sda* /media/ || exit 1&lt;br /&gt;
### prepare new apkovl&lt;br /&gt;
rm -fr /tmp/template&lt;br /&gt;
mkdir -p /tmp/template&lt;br /&gt;
tar xzf /media/${S}2/$(hostname).apkovl.tar.gz -C /tmp/template || exit 1&lt;br /&gt;
rm /media/${D}2/$(hostname).apkovl.tar.gz&lt;br /&gt;
cd /tmp/template&lt;br /&gt;
rm -f etc/ssh/ssh_host_*&lt;br /&gt;
for f in $(grep -r $(hostname) etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/$(hostname)/${name}/g $f;done&lt;br /&gt;
for f in $(grep -r ${S} etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/${S}/${D}/g $f;done&lt;br /&gt;
echo &amp;quot;/dev/sdb2 /media/sdb2 ext4 ro,relatime,errors=continue,user_xattr,acl 0 2&amp;quot; &amp;gt; etc/fstab&lt;br /&gt;
# remaining partitions are for own stuff&lt;br /&gt;
# partition 4 is the extended one &lt;br /&gt;
# (we maybe could just skip 3 and directly jump to extended for own stuff to simplify install script)&lt;br /&gt;
echo &amp;quot;/dev/sda3 /media/sda3 f2fs defaults,ro 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab&lt;br /&gt;
for i in $(seq 5 16);do echo &amp;quot;/dev/sda$i /media/sda$i f2fs defaults 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab;done&lt;br /&gt;
# partition 2 will hold apkovl and apk/cache&lt;br /&gt;
rm etc/apk/cache&lt;br /&gt;
ln -s /media/${D}2/cache etc/apk/cache&lt;br /&gt;
ln -s /etc/init.d/local etc/runlevels/default/local&lt;br /&gt;
tar czf /media/${D}2/${name}.apkovl.tar.gz . || exit 1&lt;br /&gt;
### done&lt;br /&gt;
sync&lt;br /&gt;
umount /media/${D}*&lt;br /&gt;
END=$(date +%s)&lt;br /&gt;
DURATION=$(($END-$BEGIN))&lt;br /&gt;
echo &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
logger &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;pre&amp;gt;~:# setup-albox-from-debian mynewbox&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=13742</id>
		<title>User:Jlo/Replacing Debian Jessie with Alpine remotely</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=13742"/>
		<updated>2017-08-18T14:42:37Z</updated>

		<summary type="html">&lt;p&gt;Jlo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I want to &amp;quot;upgrade&amp;quot; 130 remote Debian Jessie embedded boxes to AlpineLinux in &#039;&#039;run-from-ram&#039;&#039; mode.&lt;br /&gt;
I have already successfully and happily validated the second stage as this is a minor variation around the &amp;quot;setup-ownbox&amp;quot; script I have added to a standard USB-KEY apkovl.&lt;br /&gt;
&lt;br /&gt;
== Stage 1 ==&lt;br /&gt;
&lt;br /&gt;
something is wrong about init at reboot time :(&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;prepare-jessie-for-alpine&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
# this must be fully automatic&lt;br /&gt;
export DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
apt-get -y install rsync extlinux&lt;br /&gt;
# /boot is a separate partition&lt;br /&gt;
rm -fr /boot/boot&lt;br /&gt;
ln -sf . /boot/boot&lt;br /&gt;
# let&#039;s get system file from our install server&lt;br /&gt;
rsync -avzur my.server.home:debian/boot/* /boot/&lt;br /&gt;
rsync -avzur my.server.home:debian/apks /boot/&lt;br /&gt;
rsync -avzu my.server.home:debian/debian.apkovl.tar.gz /boot/&lt;br /&gt;
rsync -auv my.server.home:debian/.alpine-release /boot/&lt;br /&gt;
# prepare the config overlay&lt;br /&gt;
rm -fr /tmp/apkovl&lt;br /&gt;
mkdir /tmp/apkovl&lt;br /&gt;
tar xzf /boot/debian.apkovl.tar.gz -C /tmp/apkovl&lt;br /&gt;
# keep current active network connection(s) and identity&lt;br /&gt;
cp /etc/network/interfaces  /tmp/apkovl/etc/network/&lt;br /&gt;
cp -r /etc/openvpn /tmp/apkovl/etc/&lt;br /&gt;
cp -r /etc/ssh /tmp/apkovl/etc/&lt;br /&gt;
cd /tmp/apkovl&lt;br /&gt;
# be sure the install media was not already customized for own apps&lt;br /&gt;
unlink etc/runlevels/default/local&lt;br /&gt;
# be sure active VPN connections are preserved&lt;br /&gt;
mkdir -p /tmp/apkovl/etc/init.d&lt;br /&gt;
for v in /tmp/apkovl/etc/openvpn/*.conf ; do&lt;br /&gt;
  vn=$(basename $v|cut -d. -f1)&lt;br /&gt;
  ln -fs openvpn /tmp/apkovl/etc/init.d/openvpn.$vn&lt;br /&gt;
  ln -fs /etc/init.d/openvpn.$vn /tmp/apkovl/etc/runlevels/default/openvpn.$vn&lt;br /&gt;
done&lt;br /&gt;
# config done ; commit&lt;br /&gt;
tar czf /boot/debian.apkovl.tar.gz .&lt;br /&gt;
# now the booltoader ; this will kill the active grub...&lt;br /&gt;
cat &amp;gt; /boot/extlinux.conf &amp;lt;&amp;lt; EOF&lt;br /&gt;
timeout 20&lt;br /&gt;
prompt 1&lt;br /&gt;
default hardened&lt;br /&gt;
label hardened&lt;br /&gt;
    kernel /boot/vmlinuz-hardened&lt;br /&gt;
    initrd /boot/initramfs-hardened&lt;br /&gt;
    append alpine_dev=sda1:ext2 modloop=modloop-hardened modules=loop,cramfs,sd-mod,usb-storage,ext2 quiet&lt;br /&gt;
EOF&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sda&lt;br /&gt;
extlinux -i /boot&lt;br /&gt;
# done&lt;br /&gt;
sync&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
usage: &amp;lt;pre&amp;gt;~:# prepare-jessie-for-alpine&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stage 2 ==&lt;br /&gt;
&lt;br /&gt;
not tested yet in this procedure but used successfully (a small variant) to prepare new AL boxes. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;setup-albox-from-debian&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
BEGIN=$(date +%s)&lt;br /&gt;
name=$1&lt;br /&gt;
D=sda&lt;br /&gt;
echo &amp;quot;Manufacturing box named *${name}*...&amp;quot; &lt;br /&gt;
rc-service modloop stop&lt;br /&gt;
umount /media/${D}* || (echo &amp;quot;Unable to unmount ${D}. Aborting...&amp;quot; ; exit 1)&lt;br /&gt;
### Partition the SSD $D&lt;br /&gt;
# f2fs want partition of type ext2 in parted&lt;br /&gt;
parted -a cylinder -s /dev/${D} -- \&lt;br /&gt;
 mklabel msdos                \&lt;br /&gt;
 mkpart primary fat32 0%  1%  \&lt;br /&gt;
 mkpart primary ext2  1%  2%  \&lt;br /&gt;
 mkpart primary ext2  2%  7%  \&lt;br /&gt;
 mkpart extended      7% 100% \&lt;br /&gt;
 mkpart logical ext2  7%  9%  \&lt;br /&gt;
 mkpart logical ext2  9% 15%  \&lt;br /&gt;
 mkpart logical ext2 15% 20%  \&lt;br /&gt;
 mkpart logical ext2 21% 22%  \&lt;br /&gt;
 mkpart logical ext2 22% 23%  \&lt;br /&gt;
 mkpart logical ext2 23% 24%  \&lt;br /&gt;
 mkpart logical ext2 24% 25%  \&lt;br /&gt;
 mkpart logical ext2 25% 26%  \&lt;br /&gt;
 mkpart logical ext2 26% 27%  \&lt;br /&gt;
 mkpart logical ext2 27% 28%  \&lt;br /&gt;
 mkpart logical ext2 28% 29%  \&lt;br /&gt;
 mkpart logical ext2 29% 30%  \&lt;br /&gt;
 set 1 boot on                \&lt;br /&gt;
 || exit 1&lt;br /&gt;
### prepare boot partition&lt;br /&gt;
mkfs.vfat /dev/${D}1 || exit 1&lt;br /&gt;
mkdir -p /media/${D}1&lt;br /&gt;
setup-bootable /media/${B} /dev/${D}1 || exit 1&lt;br /&gt;
mount -t vfat /dev/${D}1 /media/${D}1 || exit 1&lt;br /&gt;
### format partition to hold apkovl and apk/cache; it must be of ext? type&lt;br /&gt;
mkfs.ext4 -F -q /dev/${D}2 || exit 1&lt;br /&gt;
mkdir -p /media/${D}2&lt;br /&gt;
mount -t ext4 /dev/${D}2 /media/${D}2 || exit 1&lt;br /&gt;
### format remaining partitions with f2fs&lt;br /&gt;
for i in $(seq 3 16);do&lt;br /&gt;
  [ $i -eq 4 ] &amp;amp;&amp;amp; continue&lt;br /&gt;
  mkfs.f2fs -q /dev/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i&lt;br /&gt;
  mount -t f2fs /dev/${D}$i /media/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i/.wd&lt;br /&gt;
  chmod 777 /media/${D}$i/.wd&lt;br /&gt;
  chmod +t /media/${D}$i/.wd&lt;br /&gt;
done&lt;br /&gt;
### copy apkovl and apk/cache and stuff&lt;br /&gt;
rsync -azur --numeric-ids root@my.server.home:sda* /media/ || exit 1&lt;br /&gt;
### prepare new apkovl&lt;br /&gt;
rm -fr /tmp/template&lt;br /&gt;
mkdir -p /tmp/template&lt;br /&gt;
tar xzf /media/${S}2/$(hostname).apkovl.tar.gz -C /tmp/template || exit 1&lt;br /&gt;
rm /media/${D}2/$(hostname).apkovl.tar.gz&lt;br /&gt;
cd /tmp/template&lt;br /&gt;
rm -f etc/ssh/ssh_host_*&lt;br /&gt;
for f in $(grep -r $(hostname) etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/$(hostname)/${name}/g $f;done&lt;br /&gt;
for f in $(grep -r ${S} etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/${S}/${D}/g $f;done&lt;br /&gt;
echo &amp;quot;/dev/sdb2 /media/sdb2 ext4 ro,relatime,errors=continue,user_xattr,acl 0 2&amp;quot; &amp;gt; etc/fstab&lt;br /&gt;
echo &amp;quot;/dev/sda3 /media/sda3 f2fs defaults,ro 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab&lt;br /&gt;
for i in $(seq 5 16);do echo &amp;quot;/dev/sda$i /media/sda$i f2fs defaults 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab;done&lt;br /&gt;
echo &amp;quot;With great power comes great responsibility!&amp;quot; &amp;gt; etc/motd&lt;br /&gt;
mkdir -p etc/manufacture&lt;br /&gt;
date +%s &amp;gt; etc/manufacture/manufactured&lt;br /&gt;
date &amp;gt;&amp;gt; etc/manufacture/manufactured&lt;br /&gt;
rm etc/apk/cache&lt;br /&gt;
ln -s /media/${D}2/cache etc/apk/cache&lt;br /&gt;
ln -s /etc/init.d/local etc/runlevels/default/local&lt;br /&gt;
tar czf /media/${D}2/${name}.apkovl.tar.gz . || exit 1&lt;br /&gt;
### copy installed system to proxy partition&lt;br /&gt;
rsync -aur --numeric-ids /media/${D}1 /media/${D}5/ || exit 1&lt;br /&gt;
### done&lt;br /&gt;
sync&lt;br /&gt;
umount /media/${D}*&lt;br /&gt;
END=$(date +%s)&lt;br /&gt;
DURATION=$(($END-$BEGIN))&lt;br /&gt;
echo &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
logger &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;pre&amp;gt;~:# setup-albox-from-debian mynewbox&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=13741</id>
		<title>User:Jlo/Replacing Debian Jessie with Alpine remotely</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=13741"/>
		<updated>2017-08-18T14:41:23Z</updated>

		<summary type="html">&lt;p&gt;Jlo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I want to &amp;quot;upgrade&amp;quot; 130 remote Debian Jessie embedded boxes with AlpineLinux in &#039;&#039;run-from-ram&#039;&#039; mode.&lt;br /&gt;
I have already successfully and happily validated the second stage as this is a minor variation around the &amp;quot;setup-ownbox&amp;quot; script I have added to a standard USB-KEY apkovl.&lt;br /&gt;
&lt;br /&gt;
== Stage 1 ==&lt;br /&gt;
&lt;br /&gt;
something is wrong about init at reboot time :(&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;prepare-jessie-for-alpine&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
# this must be fully automatic&lt;br /&gt;
export DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
apt-get -y install rsync extlinux&lt;br /&gt;
# /boot is a separate partition&lt;br /&gt;
rm -fr /boot/boot&lt;br /&gt;
ln -sf . /boot/boot&lt;br /&gt;
# let&#039;s get system file from our install server&lt;br /&gt;
rsync -avzur my.server.home:debian/boot/* /boot/&lt;br /&gt;
rsync -avzur my.server.home:debian/apks /boot/&lt;br /&gt;
rsync -avzu my.server.home:debian/debian.apkovl.tar.gz /boot/&lt;br /&gt;
rsync -auv my.server.home:debian/.alpine-release /boot/&lt;br /&gt;
# prepare the config overlay&lt;br /&gt;
rm -fr /tmp/apkovl&lt;br /&gt;
mkdir /tmp/apkovl&lt;br /&gt;
tar xzf /boot/debian.apkovl.tar.gz -C /tmp/apkovl&lt;br /&gt;
# keep current active network connection(s) and identity&lt;br /&gt;
cp /etc/network/interfaces  /tmp/apkovl/etc/network/&lt;br /&gt;
cp -r /etc/openvpn /tmp/apkovl/etc/&lt;br /&gt;
cp -r /etc/ssh /tmp/apkovl/etc/&lt;br /&gt;
cd /tmp/apkovl&lt;br /&gt;
# be sure the install media was not already customized for own apps&lt;br /&gt;
unlink etc/runlevels/default/local&lt;br /&gt;
# be sure active VPN connections are preserved&lt;br /&gt;
mkdir -p /tmp/apkovl/etc/init.d&lt;br /&gt;
for v in /tmp/apkovl/etc/openvpn/*.conf ; do&lt;br /&gt;
  vn=$(basename $v|cut -d. -f1)&lt;br /&gt;
  ln -fs openvpn /tmp/apkovl/etc/init.d/openvpn.$vn&lt;br /&gt;
  ln -fs /etc/init.d/openvpn.$vn /tmp/apkovl/etc/runlevels/default/openvpn.$vn&lt;br /&gt;
done&lt;br /&gt;
# config done ; commit&lt;br /&gt;
tar czf /boot/debian.apkovl.tar.gz .&lt;br /&gt;
# now the booltoader ; this will kill the active grub...&lt;br /&gt;
cat &amp;gt; /boot/extlinux.conf &amp;lt;&amp;lt; EOF&lt;br /&gt;
timeout 20&lt;br /&gt;
prompt 1&lt;br /&gt;
default hardened&lt;br /&gt;
label hardened&lt;br /&gt;
    kernel /boot/vmlinuz-hardened&lt;br /&gt;
    initrd /boot/initramfs-hardened&lt;br /&gt;
    append alpine_dev=sda1:ext2 modloop=modloop-hardened modules=loop,cramfs,sd-mod,usb-storage,ext2 quiet&lt;br /&gt;
EOF&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sda&lt;br /&gt;
extlinux -i /boot&lt;br /&gt;
# done&lt;br /&gt;
sync&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
usage: &amp;lt;pre&amp;gt;~:# prepare-jessie-for-alpine&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stage 2 ==&lt;br /&gt;
&lt;br /&gt;
not tested yet in this procedure but used successfully (a small variant) to prepare new AL boxes. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;setup-albox-from-debian&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
BEGIN=$(date +%s)&lt;br /&gt;
name=$1&lt;br /&gt;
D=sda&lt;br /&gt;
echo &amp;quot;Manufacturing box named *${name}*...&amp;quot; &lt;br /&gt;
rc-service modloop stop&lt;br /&gt;
umount /media/${D}* || (echo &amp;quot;Unable to unmount ${D}. Aborting...&amp;quot; ; exit 1)&lt;br /&gt;
### Partition the SSD $D&lt;br /&gt;
# f2fs want partition of type ext2 in parted&lt;br /&gt;
parted -a cylinder -s /dev/${D} -- \&lt;br /&gt;
 mklabel msdos                \&lt;br /&gt;
 mkpart primary fat32 0%  1%  \&lt;br /&gt;
 mkpart primary ext2  1%  2%  \&lt;br /&gt;
 mkpart primary ext2  2%  7%  \&lt;br /&gt;
 mkpart extended      7% 100% \&lt;br /&gt;
 mkpart logical ext2  7%  9%  \&lt;br /&gt;
 mkpart logical ext2  9% 15%  \&lt;br /&gt;
 mkpart logical ext2 15% 20%  \&lt;br /&gt;
 mkpart logical ext2 21% 22%  \&lt;br /&gt;
 mkpart logical ext2 22% 23%  \&lt;br /&gt;
 mkpart logical ext2 23% 24%  \&lt;br /&gt;
 mkpart logical ext2 24% 25%  \&lt;br /&gt;
 mkpart logical ext2 25% 26%  \&lt;br /&gt;
 mkpart logical ext2 26% 27%  \&lt;br /&gt;
 mkpart logical ext2 27% 28%  \&lt;br /&gt;
 mkpart logical ext2 28% 29%  \&lt;br /&gt;
 mkpart logical ext2 29% 30%  \&lt;br /&gt;
 set 1 boot on                \&lt;br /&gt;
 || exit 1&lt;br /&gt;
### prepare boot partition&lt;br /&gt;
mkfs.vfat /dev/${D}1 || exit 1&lt;br /&gt;
mkdir -p /media/${D}1&lt;br /&gt;
setup-bootable /media/${B} /dev/${D}1 || exit 1&lt;br /&gt;
mount -t vfat /dev/${D}1 /media/${D}1 || exit 1&lt;br /&gt;
### format partition to hold apkovl and apk/cache; it must be of ext? type&lt;br /&gt;
mkfs.ext4 -F -q /dev/${D}2 || exit 1&lt;br /&gt;
mkdir -p /media/${D}2&lt;br /&gt;
mount -t ext4 /dev/${D}2 /media/${D}2 || exit 1&lt;br /&gt;
### format remaining partitions with f2fs&lt;br /&gt;
for i in $(seq 3 16);do&lt;br /&gt;
  [ $i -eq 4 ] &amp;amp;&amp;amp; continue&lt;br /&gt;
  mkfs.f2fs -q /dev/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i&lt;br /&gt;
  mount -t f2fs /dev/${D}$i /media/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i/.wd&lt;br /&gt;
  chmod 777 /media/${D}$i/.wd&lt;br /&gt;
  chmod +t /media/${D}$i/.wd&lt;br /&gt;
done&lt;br /&gt;
### copy apkovl and apk/cache and stuff&lt;br /&gt;
rsync -azur --numeric-ids root@my.server.home:sda* /media/ || exit 1&lt;br /&gt;
### prepare new apkovl&lt;br /&gt;
rm -fr /tmp/template&lt;br /&gt;
mkdir -p /tmp/template&lt;br /&gt;
tar xzf /media/${S}2/$(hostname).apkovl.tar.gz -C /tmp/template || exit 1&lt;br /&gt;
rm /media/${D}2/$(hostname).apkovl.tar.gz&lt;br /&gt;
cd /tmp/template&lt;br /&gt;
rm -f etc/ssh/ssh_host_*&lt;br /&gt;
for f in $(grep -r $(hostname) etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/$(hostname)/${name}/g $f;done&lt;br /&gt;
for f in $(grep -r ${S} etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/${S}/${D}/g $f;done&lt;br /&gt;
echo &amp;quot;/dev/sdb2 /media/sdb2 ext4 ro,relatime,errors=continue,user_xattr,acl 0 2&amp;quot; &amp;gt; etc/fstab&lt;br /&gt;
echo &amp;quot;/dev/sda3 /media/sda3 f2fs defaults,ro 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab&lt;br /&gt;
for i in $(seq 5 16);do echo &amp;quot;/dev/sda$i /media/sda$i f2fs defaults 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab;done&lt;br /&gt;
echo &amp;quot;With great power comes great responsibility!&amp;quot; &amp;gt; etc/motd&lt;br /&gt;
mkdir -p etc/manufacture&lt;br /&gt;
date +%s &amp;gt; etc/manufacture/manufactured&lt;br /&gt;
date &amp;gt;&amp;gt; etc/manufacture/manufactured&lt;br /&gt;
rm etc/apk/cache&lt;br /&gt;
ln -s /media/${D}2/cache etc/apk/cache&lt;br /&gt;
ln -s /etc/init.d/local etc/runlevels/default/local&lt;br /&gt;
tar czf /media/${D}2/${name}.apkovl.tar.gz . || exit 1&lt;br /&gt;
### copy installed system to proxy partition&lt;br /&gt;
rsync -aur --numeric-ids /media/${D}1 /media/${D}5/ || exit 1&lt;br /&gt;
### done&lt;br /&gt;
sync&lt;br /&gt;
umount /media/${D}*&lt;br /&gt;
END=$(date +%s)&lt;br /&gt;
DURATION=$(($END-$BEGIN))&lt;br /&gt;
echo &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
logger &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;pre&amp;gt;~:# setup-albox-from-debian mynewbox&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=13740</id>
		<title>User:Jlo/Replacing Debian Jessie with Alpine remotely</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=13740"/>
		<updated>2017-08-18T14:36:23Z</updated>

		<summary type="html">&lt;p&gt;Jlo: /* Stage 1 */ typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Stage 1 ==&lt;br /&gt;
&lt;br /&gt;
something is wrong about init at reboot time :(&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;prepare-jessie-for-alpine&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
# this must be fully automatic&lt;br /&gt;
export DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
apt-get -y install rsync extlinux&lt;br /&gt;
# /boot is a separate partition&lt;br /&gt;
rm -fr /boot/boot&lt;br /&gt;
ln -sf . /boot/boot&lt;br /&gt;
# let&#039;s get system file from our install server&lt;br /&gt;
rsync -avzur my.server.home:debian/boot/* /boot/&lt;br /&gt;
rsync -avzur my.server.home:debian/apks /boot/&lt;br /&gt;
rsync -avzu my.server.home:debian/debian.apkovl.tar.gz /boot/&lt;br /&gt;
rsync -auv my.server.home:debian/.alpine-release /boot/&lt;br /&gt;
# prepare the config overlay&lt;br /&gt;
rm -fr /tmp/apkovl&lt;br /&gt;
mkdir /tmp/apkovl&lt;br /&gt;
tar xzf /boot/debian.apkovl.tar.gz -C /tmp/apkovl&lt;br /&gt;
# keep current active network connection(s) and identity&lt;br /&gt;
cp /etc/network/interfaces  /tmp/apkovl/etc/network/&lt;br /&gt;
cp -r /etc/openvpn /tmp/apkovl/etc/&lt;br /&gt;
cp -r /etc/ssh /tmp/apkovl/etc/&lt;br /&gt;
cd /tmp/apkovl&lt;br /&gt;
# be sure the install media was not already customized for own apps&lt;br /&gt;
unlink etc/runlevels/default/local&lt;br /&gt;
# be sure active VPN connections are preserved&lt;br /&gt;
mkdir -p /tmp/apkovl/etc/init.d&lt;br /&gt;
for v in /tmp/apkovl/etc/openvpn/*.conf ; do&lt;br /&gt;
  vn=$(basename $v|cut -d. -f1)&lt;br /&gt;
  ln -fs openvpn /tmp/apkovl/etc/init.d/openvpn.$vn&lt;br /&gt;
  ln -fs /etc/init.d/openvpn.$vn /tmp/apkovl/etc/runlevels/default/openvpn.$vn&lt;br /&gt;
done&lt;br /&gt;
# config done ; commit&lt;br /&gt;
tar czf /boot/debian.apkovl.tar.gz .&lt;br /&gt;
# now the booltoader ; this will kill the active grub...&lt;br /&gt;
cat &amp;gt; /boot/extlinux.conf &amp;lt;&amp;lt; EOF&lt;br /&gt;
timeout 20&lt;br /&gt;
prompt 1&lt;br /&gt;
default hardened&lt;br /&gt;
label hardened&lt;br /&gt;
    kernel /boot/vmlinuz-hardened&lt;br /&gt;
    initrd /boot/initramfs-hardened&lt;br /&gt;
    append alpine_dev=sda1:ext2 modloop=modloop-hardened modules=loop,cramfs,sd-mod,usb-storage,ext2 quiet&lt;br /&gt;
EOF&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sda&lt;br /&gt;
extlinux -i /boot&lt;br /&gt;
# done&lt;br /&gt;
sync&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
usage: &amp;lt;pre&amp;gt;~:# prepare-jessie-for-alpine&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stage 2 ==&lt;br /&gt;
&lt;br /&gt;
not tested yet in this procedure but used successfully (a small variant) to prepare new AL boxes. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;setup-albox-from-debian&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
BEGIN=$(date +%s)&lt;br /&gt;
name=$1&lt;br /&gt;
D=sda&lt;br /&gt;
echo &amp;quot;Manufacturing box named *${name}*...&amp;quot; &lt;br /&gt;
rc-service modloop stop&lt;br /&gt;
umount /media/${D}* || (echo &amp;quot;Unable to unmount ${D}. Aborting...&amp;quot; ; exit 1)&lt;br /&gt;
### Partition the SSD $D&lt;br /&gt;
# f2fs want partition of type ext2 in parted&lt;br /&gt;
parted -a cylinder -s /dev/${D} -- \&lt;br /&gt;
 mklabel msdos                \&lt;br /&gt;
 mkpart primary fat32 0%  1%  \&lt;br /&gt;
 mkpart primary ext2  1%  2%  \&lt;br /&gt;
 mkpart primary ext2  2%  7%  \&lt;br /&gt;
 mkpart extended      7% 100% \&lt;br /&gt;
 mkpart logical ext2  7%  9%  \&lt;br /&gt;
 mkpart logical ext2  9% 15%  \&lt;br /&gt;
 mkpart logical ext2 15% 20%  \&lt;br /&gt;
 mkpart logical ext2 21% 22%  \&lt;br /&gt;
 mkpart logical ext2 22% 23%  \&lt;br /&gt;
 mkpart logical ext2 23% 24%  \&lt;br /&gt;
 mkpart logical ext2 24% 25%  \&lt;br /&gt;
 mkpart logical ext2 25% 26%  \&lt;br /&gt;
 mkpart logical ext2 26% 27%  \&lt;br /&gt;
 mkpart logical ext2 27% 28%  \&lt;br /&gt;
 mkpart logical ext2 28% 29%  \&lt;br /&gt;
 mkpart logical ext2 29% 30%  \&lt;br /&gt;
 set 1 boot on                \&lt;br /&gt;
 || exit 1&lt;br /&gt;
### prepare boot partition&lt;br /&gt;
mkfs.vfat /dev/${D}1 || exit 1&lt;br /&gt;
mkdir -p /media/${D}1&lt;br /&gt;
setup-bootable /media/${B} /dev/${D}1 || exit 1&lt;br /&gt;
mount -t vfat /dev/${D}1 /media/${D}1 || exit 1&lt;br /&gt;
### format partition to hold apkovl and apk/cache; it must be of ext? type&lt;br /&gt;
mkfs.ext4 -F -q /dev/${D}2 || exit 1&lt;br /&gt;
mkdir -p /media/${D}2&lt;br /&gt;
mount -t ext4 /dev/${D}2 /media/${D}2 || exit 1&lt;br /&gt;
### format remaining partitions with f2fs&lt;br /&gt;
for i in $(seq 3 16);do&lt;br /&gt;
  [ $i -eq 4 ] &amp;amp;&amp;amp; continue&lt;br /&gt;
  mkfs.f2fs -q /dev/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i&lt;br /&gt;
  mount -t f2fs /dev/${D}$i /media/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i/.wd&lt;br /&gt;
  chmod 777 /media/${D}$i/.wd&lt;br /&gt;
  chmod +t /media/${D}$i/.wd&lt;br /&gt;
done&lt;br /&gt;
### copy apkovl and apk/cache and stuff&lt;br /&gt;
rsync -azur --numeric-ids root@my.server.home:sda* /media/ || exit 1&lt;br /&gt;
### prepare new apkovl&lt;br /&gt;
rm -fr /tmp/template&lt;br /&gt;
mkdir -p /tmp/template&lt;br /&gt;
tar xzf /media/${S}2/$(hostname).apkovl.tar.gz -C /tmp/template || exit 1&lt;br /&gt;
rm /media/${D}2/$(hostname).apkovl.tar.gz&lt;br /&gt;
cd /tmp/template&lt;br /&gt;
rm -f etc/ssh/ssh_host_*&lt;br /&gt;
for f in $(grep -r $(hostname) etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/$(hostname)/${name}/g $f;done&lt;br /&gt;
for f in $(grep -r ${S} etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/${S}/${D}/g $f;done&lt;br /&gt;
echo &amp;quot;/dev/sdb2 /media/sdb2 ext4 ro,relatime,errors=continue,user_xattr,acl 0 2&amp;quot; &amp;gt; etc/fstab&lt;br /&gt;
echo &amp;quot;/dev/sda3 /media/sda3 f2fs defaults,ro 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab&lt;br /&gt;
for i in $(seq 5 16);do echo &amp;quot;/dev/sda$i /media/sda$i f2fs defaults 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab;done&lt;br /&gt;
echo &amp;quot;With great power comes great responsibility!&amp;quot; &amp;gt; etc/motd&lt;br /&gt;
mkdir -p etc/manufacture&lt;br /&gt;
date +%s &amp;gt; etc/manufacture/manufactured&lt;br /&gt;
date &amp;gt;&amp;gt; etc/manufacture/manufactured&lt;br /&gt;
rm etc/apk/cache&lt;br /&gt;
ln -s /media/${D}2/cache etc/apk/cache&lt;br /&gt;
ln -s /etc/init.d/local etc/runlevels/default/local&lt;br /&gt;
tar czf /media/${D}2/${name}.apkovl.tar.gz . || exit 1&lt;br /&gt;
### copy installed system to proxy partition&lt;br /&gt;
rsync -aur --numeric-ids /media/${D}1 /media/${D}5/ || exit 1&lt;br /&gt;
### done&lt;br /&gt;
sync&lt;br /&gt;
umount /media/${D}*&lt;br /&gt;
END=$(date +%s)&lt;br /&gt;
DURATION=$(($END-$BEGIN))&lt;br /&gt;
echo &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
logger &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;pre&amp;gt;~:# setup-albox-from-debian mynewbox&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=13739</id>
		<title>User:Jlo/Replacing Debian Jessie with Alpine remotely</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=13739"/>
		<updated>2017-08-18T14:35:23Z</updated>

		<summary type="html">&lt;p&gt;Jlo: /* Stage 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Stage 1 ==&lt;br /&gt;
&lt;br /&gt;
something is wrong about init at reboot time :(&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;prepare-jessie-for-alpine&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
# this must be fully automatic&lt;br /&gt;
export DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
apt-get -y install rsync extlinux&lt;br /&gt;
# /boot is a separate partition&lt;br /&gt;
rm -fr /boot/boot&lt;br /&gt;
ln -sf . /boot/boot&lt;br /&gt;
# let&#039;s get system file out of our install server&lt;br /&gt;
rsync -avzur my.server.home:debian/boot/* /boot/&lt;br /&gt;
rsync -avzur my.server.home:debian/apks /boot/&lt;br /&gt;
rsync -avzu my.server.home:debian/debian.apkovl.tar.gz /boot/&lt;br /&gt;
rsync -auv my.server.home:debian/.alpine-release /boot/&lt;br /&gt;
# prepare the config overlay&lt;br /&gt;
rm -fr /tmp/apkovl&lt;br /&gt;
mkdir /tmp/apkovl&lt;br /&gt;
tar xzf /boot/debian.apkovl.tar.gz -C /tmp/apkovl&lt;br /&gt;
# keep current active network connection(s) and identity&lt;br /&gt;
cp /etc/network/interfaces  /tmp/apkovl/etc/network/&lt;br /&gt;
cp -r /etc/openvpn /tmp/apkovl/etc/&lt;br /&gt;
cp -r /etc/ssh /tmp/apkovl/etc/&lt;br /&gt;
cd /tmp/apkovl&lt;br /&gt;
# be sure the install media was not already customized for own apps&lt;br /&gt;
unlink etc/runlevels/default/local&lt;br /&gt;
# be sure ctive VPN connection are preserved&lt;br /&gt;
mkdir -p /tmp/apkovl/etc/init.d&lt;br /&gt;
for v in /tmp/apkovl/etc/openvpn/*.conf ; do&lt;br /&gt;
  vn=$(basename $v|cut -d. -f1)&lt;br /&gt;
  ln -fs openvpn /tmp/apkovl/etc/init.d/openvpn.$vn&lt;br /&gt;
  ln -fs /etc/init.d/openvpn.$vn /tmp/apkovl/etc/runlevels/default/openvpn.$vn&lt;br /&gt;
done&lt;br /&gt;
# config done&lt;br /&gt;
tar czf /boot/debian.apkovl.tar.gz .&lt;br /&gt;
# now the booltoader ; this will kill the active grub...&lt;br /&gt;
cat &amp;gt; /boot/extlinux.conf &amp;lt;&amp;lt; EOF&lt;br /&gt;
timeout 20&lt;br /&gt;
prompt 1&lt;br /&gt;
default hardened&lt;br /&gt;
label hardened&lt;br /&gt;
    kernel /boot/vmlinuz-hardened&lt;br /&gt;
    initrd /boot/initramfs-hardened&lt;br /&gt;
    append alpine_dev=sda1:ext2 modloop=modloop-hardened modules=loop,cramfs,sd-mod,usb-storage,ext2 quiet&lt;br /&gt;
EOF&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sda&lt;br /&gt;
extlinux -i /boot&lt;br /&gt;
# done&lt;br /&gt;
sync&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
usage: &amp;lt;pre&amp;gt;~:# prepare-jessie-for-alpine&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stage 2 ==&lt;br /&gt;
&lt;br /&gt;
not tested yet in this procedure but used successfully (a small variant) to prepare new AL boxes. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;setup-albox-from-debian&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
BEGIN=$(date +%s)&lt;br /&gt;
name=$1&lt;br /&gt;
D=sda&lt;br /&gt;
echo &amp;quot;Manufacturing box named *${name}*...&amp;quot; &lt;br /&gt;
rc-service modloop stop&lt;br /&gt;
umount /media/${D}* || (echo &amp;quot;Unable to unmount ${D}. Aborting...&amp;quot; ; exit 1)&lt;br /&gt;
### Partition the SSD $D&lt;br /&gt;
# f2fs want partition of type ext2 in parted&lt;br /&gt;
parted -a cylinder -s /dev/${D} -- \&lt;br /&gt;
 mklabel msdos                \&lt;br /&gt;
 mkpart primary fat32 0%  1%  \&lt;br /&gt;
 mkpart primary ext2  1%  2%  \&lt;br /&gt;
 mkpart primary ext2  2%  7%  \&lt;br /&gt;
 mkpart extended      7% 100% \&lt;br /&gt;
 mkpart logical ext2  7%  9%  \&lt;br /&gt;
 mkpart logical ext2  9% 15%  \&lt;br /&gt;
 mkpart logical ext2 15% 20%  \&lt;br /&gt;
 mkpart logical ext2 21% 22%  \&lt;br /&gt;
 mkpart logical ext2 22% 23%  \&lt;br /&gt;
 mkpart logical ext2 23% 24%  \&lt;br /&gt;
 mkpart logical ext2 24% 25%  \&lt;br /&gt;
 mkpart logical ext2 25% 26%  \&lt;br /&gt;
 mkpart logical ext2 26% 27%  \&lt;br /&gt;
 mkpart logical ext2 27% 28%  \&lt;br /&gt;
 mkpart logical ext2 28% 29%  \&lt;br /&gt;
 mkpart logical ext2 29% 30%  \&lt;br /&gt;
 set 1 boot on                \&lt;br /&gt;
 || exit 1&lt;br /&gt;
### prepare boot partition&lt;br /&gt;
mkfs.vfat /dev/${D}1 || exit 1&lt;br /&gt;
mkdir -p /media/${D}1&lt;br /&gt;
setup-bootable /media/${B} /dev/${D}1 || exit 1&lt;br /&gt;
mount -t vfat /dev/${D}1 /media/${D}1 || exit 1&lt;br /&gt;
### format partition to hold apkovl and apk/cache; it must be of ext? type&lt;br /&gt;
mkfs.ext4 -F -q /dev/${D}2 || exit 1&lt;br /&gt;
mkdir -p /media/${D}2&lt;br /&gt;
mount -t ext4 /dev/${D}2 /media/${D}2 || exit 1&lt;br /&gt;
### format remaining partitions with f2fs&lt;br /&gt;
for i in $(seq 3 16);do&lt;br /&gt;
  [ $i -eq 4 ] &amp;amp;&amp;amp; continue&lt;br /&gt;
  mkfs.f2fs -q /dev/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i&lt;br /&gt;
  mount -t f2fs /dev/${D}$i /media/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i/.wd&lt;br /&gt;
  chmod 777 /media/${D}$i/.wd&lt;br /&gt;
  chmod +t /media/${D}$i/.wd&lt;br /&gt;
done&lt;br /&gt;
### copy apkovl and apk/cache and stuff&lt;br /&gt;
rsync -azur --numeric-ids root@my.server.home:sda* /media/ || exit 1&lt;br /&gt;
### prepare new apkovl&lt;br /&gt;
rm -fr /tmp/template&lt;br /&gt;
mkdir -p /tmp/template&lt;br /&gt;
tar xzf /media/${S}2/$(hostname).apkovl.tar.gz -C /tmp/template || exit 1&lt;br /&gt;
rm /media/${D}2/$(hostname).apkovl.tar.gz&lt;br /&gt;
cd /tmp/template&lt;br /&gt;
rm -f etc/ssh/ssh_host_*&lt;br /&gt;
for f in $(grep -r $(hostname) etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/$(hostname)/${name}/g $f;done&lt;br /&gt;
for f in $(grep -r ${S} etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/${S}/${D}/g $f;done&lt;br /&gt;
echo &amp;quot;/dev/sdb2 /media/sdb2 ext4 ro,relatime,errors=continue,user_xattr,acl 0 2&amp;quot; &amp;gt; etc/fstab&lt;br /&gt;
echo &amp;quot;/dev/sda3 /media/sda3 f2fs defaults,ro 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab&lt;br /&gt;
for i in $(seq 5 16);do echo &amp;quot;/dev/sda$i /media/sda$i f2fs defaults 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab;done&lt;br /&gt;
echo &amp;quot;With great power comes great responsibility!&amp;quot; &amp;gt; etc/motd&lt;br /&gt;
mkdir -p etc/manufacture&lt;br /&gt;
date +%s &amp;gt; etc/manufacture/manufactured&lt;br /&gt;
date &amp;gt;&amp;gt; etc/manufacture/manufactured&lt;br /&gt;
rm etc/apk/cache&lt;br /&gt;
ln -s /media/${D}2/cache etc/apk/cache&lt;br /&gt;
ln -s /etc/init.d/local etc/runlevels/default/local&lt;br /&gt;
tar czf /media/${D}2/${name}.apkovl.tar.gz . || exit 1&lt;br /&gt;
### copy installed system to proxy partition&lt;br /&gt;
rsync -aur --numeric-ids /media/${D}1 /media/${D}5/ || exit 1&lt;br /&gt;
### done&lt;br /&gt;
sync&lt;br /&gt;
umount /media/${D}*&lt;br /&gt;
END=$(date +%s)&lt;br /&gt;
DURATION=$(($END-$BEGIN))&lt;br /&gt;
echo &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
logger &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;pre&amp;gt;~:# setup-albox-from-debian mynewbox&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=13738</id>
		<title>User:Jlo/Replacing Debian Jessie with Alpine remotely</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=13738"/>
		<updated>2017-08-18T14:31:19Z</updated>

		<summary type="html">&lt;p&gt;Jlo: /* Stage 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Stage 1 ==&lt;br /&gt;
&lt;br /&gt;
something is wrong about init at reboot time :(&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;prepare-jessie-for-alpine&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
export DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
apt-get -y install rsync extlinux&lt;br /&gt;
rm -fr /boot/boot&lt;br /&gt;
ln -sf . /boot/boot&lt;br /&gt;
rsync -avzur my.server.home:debian/boot/* /boot/&lt;br /&gt;
rsync -avzur my.server.home:debian/apks /boot/&lt;br /&gt;
rsync -avzu my.server.home:debian/debian.apkovl.tar.gz /boot/&lt;br /&gt;
rsync -auv my.server.home:debian/.alpine-release /boot/&lt;br /&gt;
rm -fr /tmp/apkovl&lt;br /&gt;
mkdir /tmp/apkovl&lt;br /&gt;
tar xzf /boot/debian.apkovl.tar.gz -C /tmp/apkovl&lt;br /&gt;
cp /etc/network/interfaces  /tmp/apkovl/etc/network/&lt;br /&gt;
cp -r /etc/openvpn /tmp/apkovl/etc/&lt;br /&gt;
cp -r /etc/ssh /tmp/apkovl/etc/&lt;br /&gt;
cd /tmp/apkovl&lt;br /&gt;
unlink etc/runlevels/default/local&lt;br /&gt;
mkdir -p /tmp/apkovl/etc/init.d&lt;br /&gt;
for v in /tmp/apkovl/etc/openvpn/*.conf ; do&lt;br /&gt;
  vn=$(basename $v|cut -d. -f1)&lt;br /&gt;
  ln -fs openvpn /tmp/apkovl/etc/init.d/openvpn.$vn&lt;br /&gt;
  ln -fs /etc/init.d/openvpn.$vn /tmp/apkovl/etc/runlevels/default/openvpn.$vn&lt;br /&gt;
done&lt;br /&gt;
tar czf /boot/debian.apkovl.tar.gz .&lt;br /&gt;
cat &amp;gt; /boot/extlinux.conf &amp;lt;&amp;lt; EOF&lt;br /&gt;
timeout 20&lt;br /&gt;
prompt 1&lt;br /&gt;
default hardened&lt;br /&gt;
label hardened&lt;br /&gt;
    kernel /boot/vmlinuz-hardened&lt;br /&gt;
    initrd /boot/initramfs-hardened&lt;br /&gt;
    append alpine_dev=sda1:ext2 modloop=modloop-hardened modules=loop,cramfs,sd-mod,usb-storage,ext2 quiet&lt;br /&gt;
EOF&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sda&lt;br /&gt;
extlinux -i /boot&lt;br /&gt;
sync&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
usage: &amp;lt;pre&amp;gt;prepare-jessie-for-alpine&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stage 2 ==&lt;br /&gt;
&lt;br /&gt;
not tested yet in this procedure but used successfully (a small variant) to prepare new AL boxes. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;setup-albox-from-debian&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
BEGIN=$(date +%s)&lt;br /&gt;
name=$1&lt;br /&gt;
D=sda&lt;br /&gt;
echo &amp;quot;Manufacturing box named *${name}*...&amp;quot; &lt;br /&gt;
rc-service modloop stop&lt;br /&gt;
umount /media/${D}* || (echo &amp;quot;Unable to unmount ${D}. Aborting...&amp;quot; ; exit 1)&lt;br /&gt;
### Partition the SSD $D&lt;br /&gt;
# f2fs want partition of type ext2 in parted&lt;br /&gt;
parted -a cylinder -s /dev/${D} -- \&lt;br /&gt;
 mklabel msdos                \&lt;br /&gt;
 mkpart primary fat32 0%  1%  \&lt;br /&gt;
 mkpart primary ext2  1%  2%  \&lt;br /&gt;
 mkpart primary ext2  2%  7%  \&lt;br /&gt;
 mkpart extended      7% 100% \&lt;br /&gt;
 mkpart logical ext2  7%  9%  \&lt;br /&gt;
 mkpart logical ext2  9% 15%  \&lt;br /&gt;
 mkpart logical ext2 15% 20%  \&lt;br /&gt;
 mkpart logical ext2 21% 22%  \&lt;br /&gt;
 mkpart logical ext2 22% 23%  \&lt;br /&gt;
 mkpart logical ext2 23% 24%  \&lt;br /&gt;
 mkpart logical ext2 24% 25%  \&lt;br /&gt;
 mkpart logical ext2 25% 26%  \&lt;br /&gt;
 mkpart logical ext2 26% 27%  \&lt;br /&gt;
 mkpart logical ext2 27% 28%  \&lt;br /&gt;
 mkpart logical ext2 28% 29%  \&lt;br /&gt;
 mkpart logical ext2 29% 30%  \&lt;br /&gt;
 set 1 boot on                \&lt;br /&gt;
 || exit 1&lt;br /&gt;
### prepare boot partition&lt;br /&gt;
mkfs.vfat /dev/${D}1 || exit 1&lt;br /&gt;
mkdir -p /media/${D}1&lt;br /&gt;
setup-bootable /media/${B} /dev/${D}1 || exit 1&lt;br /&gt;
mount -t vfat /dev/${D}1 /media/${D}1 || exit 1&lt;br /&gt;
### format partition to hold apkovl and apk/cache; it must be of ext? type&lt;br /&gt;
mkfs.ext4 -F -q /dev/${D}2 || exit 1&lt;br /&gt;
mkdir -p /media/${D}2&lt;br /&gt;
mount -t ext4 /dev/${D}2 /media/${D}2 || exit 1&lt;br /&gt;
### format remaining partitions with f2fs&lt;br /&gt;
for i in $(seq 3 16);do&lt;br /&gt;
  [ $i -eq 4 ] &amp;amp;&amp;amp; continue&lt;br /&gt;
  mkfs.f2fs -q /dev/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i&lt;br /&gt;
  mount -t f2fs /dev/${D}$i /media/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i/.wd&lt;br /&gt;
  chmod 777 /media/${D}$i/.wd&lt;br /&gt;
  chmod +t /media/${D}$i/.wd&lt;br /&gt;
done&lt;br /&gt;
### copy apkovl and apk/cache and stuff&lt;br /&gt;
rsync -azur --numeric-ids root@my.server.home:sda* /media/ || exit 1&lt;br /&gt;
### prepare new apkovl&lt;br /&gt;
rm -fr /tmp/template&lt;br /&gt;
mkdir -p /tmp/template&lt;br /&gt;
tar xzf /media/${S}2/$(hostname).apkovl.tar.gz -C /tmp/template || exit 1&lt;br /&gt;
rm /media/${D}2/$(hostname).apkovl.tar.gz&lt;br /&gt;
cd /tmp/template&lt;br /&gt;
rm -f etc/ssh/ssh_host_*&lt;br /&gt;
for f in $(grep -r $(hostname) etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/$(hostname)/${name}/g $f;done&lt;br /&gt;
for f in $(grep -r ${S} etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/${S}/${D}/g $f;done&lt;br /&gt;
echo &amp;quot;/dev/sdb2 /media/sdb2 ext4 ro,relatime,errors=continue,user_xattr,acl 0 2&amp;quot; &amp;gt; etc/fstab&lt;br /&gt;
echo &amp;quot;/dev/sda3 /media/sda3 f2fs defaults,ro 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab&lt;br /&gt;
for i in $(seq 5 16);do echo &amp;quot;/dev/sda$i /media/sda$i f2fs defaults 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab;done&lt;br /&gt;
echo &amp;quot;With great power comes great responsibility!&amp;quot; &amp;gt; etc/motd&lt;br /&gt;
mkdir -p etc/manufacture&lt;br /&gt;
date +%s &amp;gt; etc/manufacture/manufactured&lt;br /&gt;
date &amp;gt;&amp;gt; etc/manufacture/manufactured&lt;br /&gt;
rm etc/apk/cache&lt;br /&gt;
ln -s /media/${D}2/cache etc/apk/cache&lt;br /&gt;
ln -s /etc/init.d/local etc/runlevels/default/local&lt;br /&gt;
tar czf /media/${D}2/${name}.apkovl.tar.gz . || exit 1&lt;br /&gt;
### copy installed system to proxy partition&lt;br /&gt;
rsync -aur --numeric-ids /media/${D}1 /media/${D}5/ || exit 1&lt;br /&gt;
### done&lt;br /&gt;
sync&lt;br /&gt;
umount /media/${D}*&lt;br /&gt;
END=$(date +%s)&lt;br /&gt;
DURATION=$(($END-$BEGIN))&lt;br /&gt;
echo &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
logger &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;pre&amp;gt;~:# setup-albox-from-debian mynewbox&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=13737</id>
		<title>User:Jlo/Replacing Debian Jessie with Alpine remotely</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=13737"/>
		<updated>2017-08-18T14:30:19Z</updated>

		<summary type="html">&lt;p&gt;Jlo: /* Stage 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Stage 1 ==&lt;br /&gt;
&lt;br /&gt;
something is wrong about init at reboot time :(&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
export DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
apt-get -y install rsync extlinux&lt;br /&gt;
rm -fr /boot/boot&lt;br /&gt;
ln -sf . /boot/boot&lt;br /&gt;
rsync -avzur my.server.home:debian/boot/* /boot/&lt;br /&gt;
rsync -avzur my.server.home:debian/apks /boot/&lt;br /&gt;
rsync -avzu my.server.home:debian/debian.apkovl.tar.gz /boot/&lt;br /&gt;
rsync -auv my.server.home:debian/.alpine-release /boot/&lt;br /&gt;
rm -fr /tmp/apkovl&lt;br /&gt;
mkdir /tmp/apkovl&lt;br /&gt;
tar xzf /boot/debian.apkovl.tar.gz -C /tmp/apkovl&lt;br /&gt;
cp /etc/network/interfaces  /tmp/apkovl/etc/network/&lt;br /&gt;
cp -r /etc/openvpn /tmp/apkovl/etc/&lt;br /&gt;
cp -r /etc/ssh /tmp/apkovl/etc/&lt;br /&gt;
cd /tmp/apkovl&lt;br /&gt;
unlink etc/runlevels/default/local&lt;br /&gt;
mkdir -p /tmp/apkovl/etc/init.d&lt;br /&gt;
for v in /tmp/apkovl/etc/openvpn/*.conf ; do&lt;br /&gt;
  vn=$(basename $v|cut -d. -f1)&lt;br /&gt;
  ln -fs openvpn /tmp/apkovl/etc/init.d/openvpn.$vn&lt;br /&gt;
  ln -fs /etc/init.d/openvpn.$vn /tmp/apkovl/etc/runlevels/default/openvpn.$vn&lt;br /&gt;
done&lt;br /&gt;
tar czf /boot/debian.apkovl.tar.gz .&lt;br /&gt;
cat &amp;gt; /boot/extlinux.conf &amp;lt;&amp;lt; EOF&lt;br /&gt;
timeout 20&lt;br /&gt;
prompt 1&lt;br /&gt;
default hardened&lt;br /&gt;
label hardened&lt;br /&gt;
    kernel /boot/vmlinuz-hardened&lt;br /&gt;
    initrd /boot/initramfs-hardened&lt;br /&gt;
    append alpine_dev=sda1:ext2 modloop=modloop-hardened modules=loop,cramfs,sd-mod,usb-storage,ext2 quiet&lt;br /&gt;
EOF&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sda&lt;br /&gt;
extlinux -i /boot&lt;br /&gt;
sync&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stage 2 ==&lt;br /&gt;
&lt;br /&gt;
not tested yet in this procedure but used successfully (a small variant) to prepare new AL boxes. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;setup-albox-from-debian&amp;lt;/u&amp;gt; &amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
BEGIN=$(date +%s)&lt;br /&gt;
name=$1&lt;br /&gt;
D=sda&lt;br /&gt;
echo &amp;quot;Manufacturing box named *${name}*...&amp;quot; &lt;br /&gt;
rc-service modloop stop&lt;br /&gt;
umount /media/${D}* || (echo &amp;quot;Unable to unmount ${D}. Aborting...&amp;quot; ; exit 1)&lt;br /&gt;
### Partition the SSD $D&lt;br /&gt;
# f2fs want partition of type ext2 in parted&lt;br /&gt;
parted -a cylinder -s /dev/${D} -- \&lt;br /&gt;
 mklabel msdos                \&lt;br /&gt;
 mkpart primary fat32 0%  1%  \&lt;br /&gt;
 mkpart primary ext2  1%  2%  \&lt;br /&gt;
 mkpart primary ext2  2%  7%  \&lt;br /&gt;
 mkpart extended      7% 100% \&lt;br /&gt;
 mkpart logical ext2  7%  9%  \&lt;br /&gt;
 mkpart logical ext2  9% 15%  \&lt;br /&gt;
 mkpart logical ext2 15% 20%  \&lt;br /&gt;
 mkpart logical ext2 21% 22%  \&lt;br /&gt;
 mkpart logical ext2 22% 23%  \&lt;br /&gt;
 mkpart logical ext2 23% 24%  \&lt;br /&gt;
 mkpart logical ext2 24% 25%  \&lt;br /&gt;
 mkpart logical ext2 25% 26%  \&lt;br /&gt;
 mkpart logical ext2 26% 27%  \&lt;br /&gt;
 mkpart logical ext2 27% 28%  \&lt;br /&gt;
 mkpart logical ext2 28% 29%  \&lt;br /&gt;
 mkpart logical ext2 29% 30%  \&lt;br /&gt;
 set 1 boot on                \&lt;br /&gt;
 || exit 1&lt;br /&gt;
### prepare boot partition&lt;br /&gt;
mkfs.vfat /dev/${D}1 || exit 1&lt;br /&gt;
mkdir -p /media/${D}1&lt;br /&gt;
setup-bootable /media/${B} /dev/${D}1 || exit 1&lt;br /&gt;
mount -t vfat /dev/${D}1 /media/${D}1 || exit 1&lt;br /&gt;
### format partition to hold apkovl and apk/cache; it must be of ext? type&lt;br /&gt;
mkfs.ext4 -F -q /dev/${D}2 || exit 1&lt;br /&gt;
mkdir -p /media/${D}2&lt;br /&gt;
mount -t ext4 /dev/${D}2 /media/${D}2 || exit 1&lt;br /&gt;
### format remaining partitions with f2fs&lt;br /&gt;
for i in $(seq 3 16);do&lt;br /&gt;
  [ $i -eq 4 ] &amp;amp;&amp;amp; continue&lt;br /&gt;
  mkfs.f2fs -q /dev/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i&lt;br /&gt;
  mount -t f2fs /dev/${D}$i /media/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i/.wd&lt;br /&gt;
  chmod 777 /media/${D}$i/.wd&lt;br /&gt;
  chmod +t /media/${D}$i/.wd&lt;br /&gt;
done&lt;br /&gt;
### copy apkovl and apk/cache and stuff&lt;br /&gt;
rsync -azur --numeric-ids root@my.server.home:sda* /media/ || exit 1&lt;br /&gt;
### prepare new apkovl&lt;br /&gt;
rm -fr /tmp/template&lt;br /&gt;
mkdir -p /tmp/template&lt;br /&gt;
tar xzf /media/${S}2/$(hostname).apkovl.tar.gz -C /tmp/template || exit 1&lt;br /&gt;
rm /media/${D}2/$(hostname).apkovl.tar.gz&lt;br /&gt;
cd /tmp/template&lt;br /&gt;
rm -f etc/ssh/ssh_host_*&lt;br /&gt;
for f in $(grep -r $(hostname) etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/$(hostname)/${name}/g $f;done&lt;br /&gt;
for f in $(grep -r ${S} etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/${S}/${D}/g $f;done&lt;br /&gt;
echo &amp;quot;/dev/sdb2 /media/sdb2 ext4 ro,relatime,errors=continue,user_xattr,acl 0 2&amp;quot; &amp;gt; etc/fstab&lt;br /&gt;
echo &amp;quot;/dev/sda3 /media/sda3 f2fs defaults,ro 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab&lt;br /&gt;
for i in $(seq 5 16);do echo &amp;quot;/dev/sda$i /media/sda$i f2fs defaults 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab;done&lt;br /&gt;
echo &amp;quot;With great power comes great responsibility!&amp;quot; &amp;gt; etc/motd&lt;br /&gt;
mkdir -p etc/manufacture&lt;br /&gt;
date +%s &amp;gt; etc/manufacture/manufactured&lt;br /&gt;
date &amp;gt;&amp;gt; etc/manufacture/manufactured&lt;br /&gt;
rm etc/apk/cache&lt;br /&gt;
ln -s /media/${D}2/cache etc/apk/cache&lt;br /&gt;
ln -s /etc/init.d/local etc/runlevels/default/local&lt;br /&gt;
tar czf /media/${D}2/${name}.apkovl.tar.gz . || exit 1&lt;br /&gt;
### copy installed system to proxy partition&lt;br /&gt;
rsync -aur --numeric-ids /media/${D}1 /media/${D}5/ || exit 1&lt;br /&gt;
### done&lt;br /&gt;
sync&lt;br /&gt;
umount /media/${D}*&lt;br /&gt;
END=$(date +%s)&lt;br /&gt;
DURATION=$(($END-$BEGIN))&lt;br /&gt;
echo &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
logger &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;pre&amp;gt;~:# setup-albox-from-debian mynewbox&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=13736</id>
		<title>User:Jlo/Replacing Debian Jessie with Alpine remotely</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=13736"/>
		<updated>2017-08-18T14:24:12Z</updated>

		<summary type="html">&lt;p&gt;Jlo: /* Stage 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Stage 1 ==&lt;br /&gt;
&lt;br /&gt;
something is wrong about init at reboot time :(&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
export DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
apt-get -y install rsync extlinux&lt;br /&gt;
rm -fr /boot/boot&lt;br /&gt;
ln -sf . /boot/boot&lt;br /&gt;
rsync -avzur my.server.home:debian/boot/* /boot/&lt;br /&gt;
rsync -avzur my.server.home:debian/apks /boot/&lt;br /&gt;
rsync -avzu my.server.home:debian/debian.apkovl.tar.gz /boot/&lt;br /&gt;
rsync -auv my.server.home:debian/.alpine-release /boot/&lt;br /&gt;
rm -fr /tmp/apkovl&lt;br /&gt;
mkdir /tmp/apkovl&lt;br /&gt;
tar xzf /boot/debian.apkovl.tar.gz -C /tmp/apkovl&lt;br /&gt;
cp /etc/network/interfaces  /tmp/apkovl/etc/network/&lt;br /&gt;
cp -r /etc/openvpn /tmp/apkovl/etc/&lt;br /&gt;
cp -r /etc/ssh /tmp/apkovl/etc/&lt;br /&gt;
cd /tmp/apkovl&lt;br /&gt;
unlink etc/runlevels/default/local&lt;br /&gt;
mkdir -p /tmp/apkovl/etc/init.d&lt;br /&gt;
for v in /tmp/apkovl/etc/openvpn/*.conf ; do&lt;br /&gt;
  vn=$(basename $v|cut -d. -f1)&lt;br /&gt;
  ln -fs openvpn /tmp/apkovl/etc/init.d/openvpn.$vn&lt;br /&gt;
  ln -fs /etc/init.d/openvpn.$vn /tmp/apkovl/etc/runlevels/default/openvpn.$vn&lt;br /&gt;
done&lt;br /&gt;
tar czf /boot/debian.apkovl.tar.gz .&lt;br /&gt;
cat &amp;gt; /boot/extlinux.conf &amp;lt;&amp;lt; EOF&lt;br /&gt;
timeout 20&lt;br /&gt;
prompt 1&lt;br /&gt;
default hardened&lt;br /&gt;
label hardened&lt;br /&gt;
    kernel /boot/vmlinuz-hardened&lt;br /&gt;
    initrd /boot/initramfs-hardened&lt;br /&gt;
    append alpine_dev=sda1:ext2 modloop=modloop-hardened modules=loop,cramfs,sd-mod,usb-storage,ext2 quiet&lt;br /&gt;
EOF&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sda&lt;br /&gt;
extlinux -i /boot&lt;br /&gt;
sync&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stage 2 ==&lt;br /&gt;
&lt;br /&gt;
not tested yet in this procedure but used successfully (a small variant) to prepare new AL boxes. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
BEGIN=$(date +%s)&lt;br /&gt;
name=$1&lt;br /&gt;
D=sda&lt;br /&gt;
echo &amp;quot;Manufacturing box named *${name}*...&amp;quot; &lt;br /&gt;
rc-service modloop stop&lt;br /&gt;
umount /media/sda* || (echo &amp;quot;Unable to umount sda. Aborting...&amp;quot; ; exit 1)&lt;br /&gt;
### Partition the SSD $D&lt;br /&gt;
parted -a cylinder -s /dev/${D} -- \&lt;br /&gt;
 mklabel msdos                \&lt;br /&gt;
 mkpart primary fat32 0%  1%  \&lt;br /&gt;
 mkpart primary ext2  1%  2%  \&lt;br /&gt;
 mkpart primary ext2  2%  7%  \&lt;br /&gt;
 mkpart extended      7% 100% \&lt;br /&gt;
 mkpart logical ext2  7%  9%  \&lt;br /&gt;
 mkpart logical ext2  9% 15%  \&lt;br /&gt;
 mkpart logical ext2 15% 20%  \&lt;br /&gt;
 mkpart logical ext2 21% 22%  \&lt;br /&gt;
 mkpart logical ext2 22% 23%  \&lt;br /&gt;
 mkpart logical ext2 23% 24%  \&lt;br /&gt;
 mkpart logical ext2 24% 25%  \&lt;br /&gt;
 mkpart logical ext2 25% 26%  \&lt;br /&gt;
 mkpart logical ext2 26% 27%  \&lt;br /&gt;
 mkpart logical ext2 27% 28%  \&lt;br /&gt;
 mkpart logical ext2 28% 29%  \&lt;br /&gt;
 mkpart logical ext2 29% 30%  \&lt;br /&gt;
 set 1 boot on                \&lt;br /&gt;
 || exit 1&lt;br /&gt;
### prepare boot partition&lt;br /&gt;
mkfs.vfat /dev/${D}1 || exit 1&lt;br /&gt;
mkdir -p /media/${D}1&lt;br /&gt;
setup-bootable /media/${B} /dev/${D}1 || exit 1&lt;br /&gt;
mount -t vfat /dev/${D}1 /media/${D}1 || exit 1&lt;br /&gt;
### format partition to hold apkovl and apk/cache; it must be of ext? type&lt;br /&gt;
mkfs.ext4 -F -q /dev/${D}2 || exit 1&lt;br /&gt;
mkdir -p /media/${D}2&lt;br /&gt;
mount -t ext4 /dev/${D}2 /media/${D}2 || exit 1&lt;br /&gt;
### format remaining partitions with f2fs&lt;br /&gt;
for i in $(seq 3 16);do&lt;br /&gt;
  [ $i -eq 4 ] &amp;amp;&amp;amp; continue&lt;br /&gt;
  mkfs.f2fs -q /dev/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i&lt;br /&gt;
  mount -t f2fs /dev/${D}$i /media/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i/.wd&lt;br /&gt;
  chmod 777 /media/${D}$i/.wd&lt;br /&gt;
  chmod +t /media/${D}$i/.wd&lt;br /&gt;
done&lt;br /&gt;
### copy apkovl and apk/cache and stuff&lt;br /&gt;
rsync -azur --numeric-ids root@my.server.home:sda* /media/ || exit 1&lt;br /&gt;
### prepare new apkovl&lt;br /&gt;
rm -fr /tmp/template&lt;br /&gt;
mkdir -p /tmp/template&lt;br /&gt;
tar xzf /media/${S}2/$(hostname).apkovl.tar.gz -C /tmp/template || exit 1&lt;br /&gt;
rm /media/${D}2/$(hostname).apkovl.tar.gz&lt;br /&gt;
cd /tmp/template&lt;br /&gt;
rm -f etc/ssh/ssh_host_*&lt;br /&gt;
for f in $(grep -r $(hostname) etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/$(hostname)/${name}/g $f;done&lt;br /&gt;
for f in $(grep -r ${S} etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/${S}/${D}/g $f;done&lt;br /&gt;
echo &amp;quot;/dev/sdb2 /media/sdb2 ext4 ro,relatime,errors=continue,user_xattr,acl 0 2&amp;quot; &amp;gt; etc/fstab&lt;br /&gt;
echo &amp;quot;/dev/sda3 /media/sda3 f2fs defaults,ro 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab&lt;br /&gt;
for i in $(seq 5 16);do echo &amp;quot;/dev/sda$i /media/sda$i f2fs defaults 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab;done&lt;br /&gt;
echo &amp;quot;With great power comes great responsibility!&amp;quot; &amp;gt; etc/motd&lt;br /&gt;
mkdir -p etc/manufacture&lt;br /&gt;
date +%s &amp;gt; etc/manufacture/manufactured&lt;br /&gt;
date &amp;gt;&amp;gt; etc/manufacture/manufactured&lt;br /&gt;
rm etc/apk/cache&lt;br /&gt;
ln -s /media/${D}2/cache etc/apk/cache&lt;br /&gt;
ln -s /etc/init.d/local etc/runlevels/default/local&lt;br /&gt;
tar czf /media/${D}2/${name}.apkovl.tar.gz . || exit 1&lt;br /&gt;
### copy installed system to proxy partition&lt;br /&gt;
rsync -aur --numeric-ids /media/${D}1 /media/${D}5/ || exit 1&lt;br /&gt;
### done&lt;br /&gt;
sync&lt;br /&gt;
umount /media/${D}*&lt;br /&gt;
END=$(date +%s)&lt;br /&gt;
DURATION=$(($END-$BEGIN))&lt;br /&gt;
echo &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
logger &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=13735</id>
		<title>User:Jlo/Replacing Debian Jessie with Alpine remotely</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=13735"/>
		<updated>2017-08-18T14:20:39Z</updated>

		<summary type="html">&lt;p&gt;Jlo: /* Stage 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Stage 1 ==&lt;br /&gt;
&lt;br /&gt;
something is wrong about init at reboot time :(&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
export DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
apt-get -y install rsync extlinux&lt;br /&gt;
rm -fr /boot/boot&lt;br /&gt;
ln -sf . /boot/boot&lt;br /&gt;
rsync -avzur my.server.home:debian/boot/* /boot/&lt;br /&gt;
rsync -avzur my.server.home:debian/apks /boot/&lt;br /&gt;
rsync -avzu my.server.home:debian/debian.apkovl.tar.gz /boot/&lt;br /&gt;
rsync -auv my.server.home:debian/.alpine-release /boot/&lt;br /&gt;
rm -fr /tmp/apkovl&lt;br /&gt;
mkdir /tmp/apkovl&lt;br /&gt;
tar xzf /boot/debian.apkovl.tar.gz -C /tmp/apkovl&lt;br /&gt;
cp /etc/network/interfaces  /tmp/apkovl/etc/network/&lt;br /&gt;
cp -r /etc/openvpn /tmp/apkovl/etc/&lt;br /&gt;
cp -r /etc/ssh /tmp/apkovl/etc/&lt;br /&gt;
cd /tmp/apkovl&lt;br /&gt;
unlink etc/runlevels/default/local&lt;br /&gt;
mkdir -p /tmp/apkovl/etc/init.d&lt;br /&gt;
for v in /tmp/apkovl/etc/openvpn/*.conf ; do&lt;br /&gt;
  vn=$(basename $v|cut -d. -f1)&lt;br /&gt;
  ln -fs openvpn /tmp/apkovl/etc/init.d/openvpn.$vn&lt;br /&gt;
  ln -fs /etc/init.d/openvpn.$vn /tmp/apkovl/etc/runlevels/default/openvpn.$vn&lt;br /&gt;
done&lt;br /&gt;
tar czf /boot/debian.apkovl.tar.gz .&lt;br /&gt;
cat &amp;gt; /boot/extlinux.conf &amp;lt;&amp;lt; EOF&lt;br /&gt;
timeout 20&lt;br /&gt;
prompt 1&lt;br /&gt;
default hardened&lt;br /&gt;
label hardened&lt;br /&gt;
    kernel /boot/vmlinuz-hardened&lt;br /&gt;
    initrd /boot/initramfs-hardened&lt;br /&gt;
    append alpine_dev=sda1:ext2 modloop=modloop-hardened modules=loop,cramfs,sd-mod,usb-storage,ext2 quiet&lt;br /&gt;
EOF&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sda&lt;br /&gt;
extlinux -i /boot&lt;br /&gt;
sync&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stage 2 ==&lt;br /&gt;
&lt;br /&gt;
not tested yet&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
BEGIN=$(date +%s)&lt;br /&gt;
name=$1&lt;br /&gt;
D=sda&lt;br /&gt;
echo &amp;quot;Manufacturing box named *${name}*...&amp;quot; &lt;br /&gt;
rc-service modloop stop&lt;br /&gt;
umount /media/sda* || (echo &amp;quot;Unable to umount sda. Aborting...&amp;quot; ; exit 1)&lt;br /&gt;
### Partition the SSD $D&lt;br /&gt;
parted -a cylinder -s /dev/${D} -- \&lt;br /&gt;
 mklabel msdos                \&lt;br /&gt;
 mkpart primary fat32 0%  1%  \&lt;br /&gt;
 mkpart primary ext2  1%  2%  \&lt;br /&gt;
 mkpart primary ext2  2%  7%  \&lt;br /&gt;
 mkpart extended      7% 100% \&lt;br /&gt;
 mkpart logical ext2  7%  9%  \&lt;br /&gt;
 mkpart logical ext2  9% 15%  \&lt;br /&gt;
 mkpart logical ext2 15% 20%  \&lt;br /&gt;
 mkpart logical ext2 21% 22%  \&lt;br /&gt;
 mkpart logical ext2 22% 23%  \&lt;br /&gt;
 mkpart logical ext2 23% 24%  \&lt;br /&gt;
 mkpart logical ext2 24% 25%  \&lt;br /&gt;
 mkpart logical ext2 25% 26%  \&lt;br /&gt;
 mkpart logical ext2 26% 27%  \&lt;br /&gt;
 mkpart logical ext2 27% 28%  \&lt;br /&gt;
 mkpart logical ext2 28% 29%  \&lt;br /&gt;
 mkpart logical ext2 29% 30%  \&lt;br /&gt;
 set 1 boot on                \&lt;br /&gt;
 || exit 1&lt;br /&gt;
### prepare boot partition&lt;br /&gt;
mkfs.vfat /dev/${D}1 || exit 1&lt;br /&gt;
mkdir -p /media/${D}1&lt;br /&gt;
setup-bootable /media/${B} /dev/${D}1 || exit 1&lt;br /&gt;
mount -t vfat /dev/${D}1 /media/${D}1 || exit 1&lt;br /&gt;
### format partition to hold apkovl and apk/cache; it must be of ext? type&lt;br /&gt;
mkfs.ext4 -F -q /dev/${D}2 || exit 1&lt;br /&gt;
mkdir -p /media/${D}2&lt;br /&gt;
mount -t ext4 /dev/${D}2 /media/${D}2 || exit 1&lt;br /&gt;
### format remaining partitions with f2fs&lt;br /&gt;
for i in $(seq 3 16);do&lt;br /&gt;
  [ $i -eq 4 ] &amp;amp;&amp;amp; continue&lt;br /&gt;
  mkfs.f2fs -q /dev/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i&lt;br /&gt;
  mount -t f2fs /dev/${D}$i /media/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i/.wd&lt;br /&gt;
  chmod 777 /media/${D}$i/.wd&lt;br /&gt;
  chmod +t /media/${D}$i/.wd&lt;br /&gt;
done&lt;br /&gt;
### copy apkovl and apk/cache and stuff&lt;br /&gt;
rsync -azur --numeric-ids root@my.server.home:sda* /media/ || exit 1&lt;br /&gt;
### prepare new apkovl&lt;br /&gt;
rm -fr /tmp/template&lt;br /&gt;
mkdir -p /tmp/template&lt;br /&gt;
tar xzf /media/${S}2/$(hostname).apkovl.tar.gz -C /tmp/template || exit 1&lt;br /&gt;
rm /media/${D}2/$(hostname).apkovl.tar.gz&lt;br /&gt;
cd /tmp/template&lt;br /&gt;
rm -f etc/ssh/ssh_host_*&lt;br /&gt;
for f in $(grep -r $(hostname) etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/$(hostname)/${name}/g $f;done&lt;br /&gt;
for f in $(grep -r ${S} etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/${S}/${D}/g $f;done&lt;br /&gt;
echo &amp;quot;/dev/sdb2 /media/sdb2 ext4 ro,relatime,errors=continue,user_xattr,acl 0 2&amp;quot; &amp;gt; etc/fstab&lt;br /&gt;
echo &amp;quot;/dev/sda3 /media/sda3 f2fs defaults,ro 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab&lt;br /&gt;
for i in $(seq 5 16);do echo &amp;quot;/dev/sda$i /media/sda$i f2fs defaults 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab;done&lt;br /&gt;
echo &amp;quot;With great power comes great responsibility!&amp;quot; &amp;gt; etc/motd&lt;br /&gt;
mkdir -p etc/manufacture&lt;br /&gt;
date +%s &amp;gt; etc/manufacture/manufactured&lt;br /&gt;
date &amp;gt;&amp;gt; etc/manufacture/manufactured&lt;br /&gt;
rm etc/apk/cache&lt;br /&gt;
ln -s /media/${D}2/cache etc/apk/cache&lt;br /&gt;
ln -s /etc/init.d/local etc/runlevels/default/local&lt;br /&gt;
tar czf /media/${D}2/${name}.apkovl.tar.gz . || exit 1&lt;br /&gt;
### copy installed system to proxy partition&lt;br /&gt;
rsync -aur --numeric-ids /media/${D}1 /media/${D}5/ || exit 1&lt;br /&gt;
### done&lt;br /&gt;
sync&lt;br /&gt;
umount /media/${D}*&lt;br /&gt;
END=$(date +%s)&lt;br /&gt;
DURATION=$(($END-$BEGIN))&lt;br /&gt;
echo &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
logger &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=13734</id>
		<title>User:Jlo/Replacing Debian Jessie with Alpine remotely</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely&amp;diff=13734"/>
		<updated>2017-08-18T14:07:07Z</updated>

		<summary type="html">&lt;p&gt;Jlo: Created page with &amp;quot;== Stage 1 ==  something is wrong about init at reboot time :(  &amp;lt;pre&amp;gt; #!/bin/sh export DEBIAN_FRONTEND=noninteractive apt-get -y install rsync extlinux rm -fr /boot/boot ln -s...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Stage 1 ==&lt;br /&gt;
&lt;br /&gt;
something is wrong about init at reboot time :(&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
export DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
apt-get -y install rsync extlinux&lt;br /&gt;
rm -fr /boot/boot&lt;br /&gt;
ln -sf . /boot/boot&lt;br /&gt;
rsync -avzur my.server.home:debian/boot/* /boot/&lt;br /&gt;
rsync -avzur my.server.home:debian/apks /boot/&lt;br /&gt;
rsync -avzu my.server.home:debian/debian.apkovl.tar.gz /boot/&lt;br /&gt;
rsync -auv my.server.home:debian/.alpine-release /boot/&lt;br /&gt;
rm -fr /tmp/apkovl&lt;br /&gt;
mkdir /tmp/apkovl&lt;br /&gt;
tar xzf /boot/debian.apkovl.tar.gz -C /tmp/apkovl&lt;br /&gt;
cp /etc/network/interfaces  /tmp/apkovl/etc/network/&lt;br /&gt;
cp -r /etc/openvpn /tmp/apkovl/etc/&lt;br /&gt;
cp -r /etc/ssh /tmp/apkovl/etc/&lt;br /&gt;
cd /tmp/apkovl&lt;br /&gt;
unlink etc/runlevels/default/local&lt;br /&gt;
mkdir -p /tmp/apkovl/etc/init.d&lt;br /&gt;
for v in /tmp/apkovl/etc/openvpn/*.conf ; do&lt;br /&gt;
  vn=$(basename $v|cut -d. -f1)&lt;br /&gt;
  ln -fs openvpn /tmp/apkovl/etc/init.d/openvpn.$vn&lt;br /&gt;
  ln -fs /etc/init.d/openvpn.$vn /tmp/apkovl/etc/runlevels/default/openvpn.$vn&lt;br /&gt;
done&lt;br /&gt;
tar czf /boot/debian.apkovl.tar.gz .&lt;br /&gt;
cat &amp;gt; /boot/extlinux.conf &amp;lt;&amp;lt; EOF&lt;br /&gt;
timeout 20&lt;br /&gt;
prompt 1&lt;br /&gt;
default hardened&lt;br /&gt;
label hardened&lt;br /&gt;
    kernel /boot/vmlinuz-hardened&lt;br /&gt;
    initrd /boot/initramfs-hardened&lt;br /&gt;
    append alpine_dev=sda1:ext2 modloop=modloop-hardened modules=loop,cramfs,sd-mod,usb-storage,ext2 quiet&lt;br /&gt;
EOF&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sda&lt;br /&gt;
extlinux -i /boot&lt;br /&gt;
sync&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stage 2 ==&lt;br /&gt;
&lt;br /&gt;
not tested yet&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
BEGIN=$(date +%s)&lt;br /&gt;
name=$1&lt;br /&gt;
D=sda&lt;br /&gt;
echo &amp;quot;Manufacturing box named *${name}*...&amp;quot; &lt;br /&gt;
rc-service modloop stop&lt;br /&gt;
umount /media/sda* || (echo &amp;quot;Unable to umount sda. Aborting...&amp;quot; ; exit 1)&lt;br /&gt;
### Partition the SSD $D&lt;br /&gt;
parted -a cylinder -s /dev/${D} -- \&lt;br /&gt;
 mklabel msdos                \&lt;br /&gt;
 mkpart primary fat32 0%  1%  \&lt;br /&gt;
 mkpart primary ext2  1%  2%  \&lt;br /&gt;
 mkpart primary ext2  2%  7%  \&lt;br /&gt;
 mkpart extended      7% 100% \&lt;br /&gt;
 mkpart logical ext2  7%  9%  \&lt;br /&gt;
 mkpart logical ext2  9% 15%  \&lt;br /&gt;
 mkpart logical ext2 15% 20%  \&lt;br /&gt;
 mkpart logical ext2 21% 22%  \&lt;br /&gt;
 mkpart logical ext2 22% 23%  \&lt;br /&gt;
 mkpart logical ext2 23% 24%  \&lt;br /&gt;
 mkpart logical ext2 24% 25%  \&lt;br /&gt;
 mkpart logical ext2 25% 26%  \&lt;br /&gt;
 mkpart logical ext2 26% 27%  \&lt;br /&gt;
 mkpart logical ext2 27% 28%  \&lt;br /&gt;
 mkpart logical ext2 28% 29%  \&lt;br /&gt;
 mkpart logical ext2 29% 30%  \&lt;br /&gt;
 set 1 boot on                \&lt;br /&gt;
 || exit 1&lt;br /&gt;
### prepare boot partition&lt;br /&gt;
mkfs.vfat /dev/${D}1 || exit 1&lt;br /&gt;
mkdir -p /media/${D}1&lt;br /&gt;
setup-bootable /media/${B} /dev/${D}1 || exit 1&lt;br /&gt;
mount -t vfat /dev/${D}1 /media/${D}1 || exit 1&lt;br /&gt;
### format partition to hold apkovl and apk/cache; it must be of ext? type&lt;br /&gt;
mkfs.ext4 -F -q /dev/${D}2 || exit 1&lt;br /&gt;
mkdir -p /media/${D}2&lt;br /&gt;
mount -t ext4 /dev/${D}2 /media/${D}2 || exit 1&lt;br /&gt;
### format remaining partitions with f2fs&lt;br /&gt;
for i in $(seq 3 16);do&lt;br /&gt;
  [ $i -eq 4 ] &amp;amp;&amp;amp; continue&lt;br /&gt;
  mkfs.f2fs -q /dev/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i&lt;br /&gt;
  mount -t f2fs /dev/${D}$i /media/${D}$i || exit 1&lt;br /&gt;
  mkdir -p /media/${D}$i/.wd&lt;br /&gt;
  chmod 777 /media/${D}$i/.wd&lt;br /&gt;
  chmod +t /media/${D}$i/.wd&lt;br /&gt;
done&lt;br /&gt;
### copy apkovl and apk/cache and stuff&lt;br /&gt;
rsync -azur --numeric-ids root@my.server.home:sda* /media/ || exit 1&lt;br /&gt;
### prepare new apkovl&lt;br /&gt;
rm -fr /tmp/template&lt;br /&gt;
mkdir -p /tmp/template&lt;br /&gt;
tar xzf /media/${S}2/$(hostname).apkovl.tar.gz -C /tmp/template || exit 1&lt;br /&gt;
rm /media/${D}2/$(hostname).apkovl.tar.gz&lt;br /&gt;
cd /tmp/template&lt;br /&gt;
rm -f etc/ssh/ssh_host_*&lt;br /&gt;
for f in $(grep -r $(hostname) etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/$(hostname)/${name}/g&lt;br /&gt;
 $f;done&lt;br /&gt;
for f in $(grep -r ${S} etc 2&amp;gt; /dev/null | cut -d: -f1|sort -u);do sed -i -e s/${S}/${D}/g $f;done&lt;br /&gt;
echo &amp;quot;/dev/sdb2 /media/sdb2 ext4 ro,relatime,errors=continue,user_xattr,acl 0 2&amp;quot; &amp;gt; etc/fstab&lt;br /&gt;
echo &amp;quot;/dev/sda3 /media/sda3 f2fs defaults,ro 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab&lt;br /&gt;
for i in $(seq 5 16);do echo &amp;quot;/dev/sda$i /media/sda$i f2fs defaults 0 2&amp;quot; &amp;gt;&amp;gt; etc/fstab;done&lt;br /&gt;
echo &amp;quot;With great power comes great responsibility!&amp;quot; &amp;gt; etc/motd&lt;br /&gt;
date +%s &amp;gt; etc/manufacture/manufactured&lt;br /&gt;
date &amp;gt;&amp;gt; etc/manufacture/manufactured&lt;br /&gt;
rm etc/apk/cache&lt;br /&gt;
ln -s /media/${D}2/cache etc/apk/cache&lt;br /&gt;
ln -s /etc/init.d/local etc/runlevels/default/local&lt;br /&gt;
tar czf /media/${D}2/${name}.apkovl.tar.gz . || exit 1&lt;br /&gt;
### copy installed system to proxy partition&lt;br /&gt;
rsync -aur --numeric-ids /media/${D}1 /media/${D}5/ || exit 1&lt;br /&gt;
### done&lt;br /&gt;
sync&lt;br /&gt;
umount /media/${D}*&lt;br /&gt;
END=$(date +%s)&lt;br /&gt;
DURATION=$(($END-$BEGIN))&lt;br /&gt;
echo &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
logger &amp;quot;Manufacture process took $DURATION seconds to complete.&amp;quot; &lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo&amp;diff=13733</id>
		<title>User:Jlo</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo&amp;diff=13733"/>
		<updated>2017-08-18T14:00:23Z</updated>

		<summary type="html">&lt;p&gt;Jlo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I was [[User:Jch]] but I forgot my passwd and the email used to suscribe is not valid anymore...&lt;br /&gt;
&lt;br /&gt;
I&#039;m today senior system architect at some startup.&amp;lt;br/&amp;gt;&lt;br /&gt;
We are building a network of embedded devices controlling hardware stuff.&amp;lt;br/&amp;gt;&lt;br /&gt;
I&#039;m stepping it as the product is transitioning from prototype phase to industrial phase.&lt;br /&gt;
&lt;br /&gt;
The main app is written for Oracle Java8 and running in Apache/Karaf environment.&lt;br /&gt;
&lt;br /&gt;
The proto was done with Debian boxes managed with salt stack (about 100 of those with a mix of Wheezy and Jessie).&lt;br /&gt;
&lt;br /&gt;
I would like to see the boxes running AL in &#039;&#039;run-from-ram&#039;&#039; mode pulling the apkovl tarball (or at least some tarball to be applied in the /etc/local.d sequence) from a remote server somewhere in the cloud.&amp;lt;br/&amp;gt;&lt;br /&gt;
To upgrade would just to rsync the normally read-only SSD and reboot.&lt;br /&gt;
&lt;br /&gt;
To achieve this with AlpineLinux, one has to:&lt;br /&gt;
&lt;br /&gt;
*    deploy [[User:Jlo/java8|Oracle Java 7 with glibc]]&lt;br /&gt;
*    deploy [[User:Jlo/java8|Oracle Java 8 with glibc]]&lt;br /&gt;
*    deploy [[User:Jlo/python27|python2.7 with needed libs]]&lt;br /&gt;
*    deploy [[User:Jlo/watchdog|hardware watchdog]]&lt;br /&gt;
*    deploy [[User:Jlo/network|network drivers]] (eth, usb-eth, wlan, 3g, lte)&lt;br /&gt;
*    deploy [[User:Jlo/usb|USB drivers]]&lt;br /&gt;
*    rewrite [[User:Jlo/init|init scripts]]&lt;br /&gt;
*    prepare a [[User:Jlo/image|custom image]] with every needed packages locally present in disk repo&lt;br /&gt;
*    adapt [[User:Jlo/packages|custom packages]] from deb to apk ones&lt;br /&gt;
&lt;br /&gt;
To configure a box is done in two parts:&lt;br /&gt;
&lt;br /&gt;
*    the network. done locally&lt;br /&gt;
*    the app layer. done via a webinterface; commited to a server and download by the box at each boot.&lt;br /&gt;
&lt;br /&gt;
The advantages of such architecture are:&lt;br /&gt;
&lt;br /&gt;
* power failure resilient as the system runs from ram&amp;lt;br/&amp;gt;The only PoF here is when an upgrade of the read-only medium is done&lt;br /&gt;
* boxes use a pull mechanism to stay up-to-date ensuring the right version at any next reboot&amp;lt;br/&amp;gt;This protect us against out-of-sync boxes arraising often with push architecture (salt, ansible, ...)&lt;br /&gt;
* the two steps boot sequence allows us to temporary take control over a box for maintenance with a totally different setup&amp;lt;br/&amp;gt;and as we always keep an ssh access via the VPN, we can force that anytime we want (hardware watchdog being our friend here)&lt;br /&gt;
* easy to reproduce in VM for testing (including load tests)&lt;br /&gt;
&lt;br /&gt;
Disadvantages are:&lt;br /&gt;
&lt;br /&gt;
* need own repo with access control to distribute Oracle Java internally without breach of license&amp;lt;br/&amp;gt;(but it is the same situation for any distro)&lt;br /&gt;
* some used packages are distributed as deb only (from artifactory between others)&amp;lt;br/&amp;gt;will need to script part of the CI towards apk generation...&amp;lt;br/&amp;gt;will need to check every deb to see if sources are available...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
See also [[User:Jlo/Replacing_Debian_Jessie_with_Alpine_remotely|Replacing Debian Jessie with Alpine remotely]]&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/watchdog&amp;diff=13718</id>
		<title>User:Jlo/watchdog</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/watchdog&amp;diff=13718"/>
		<updated>2017-08-02T14:32:06Z</updated>

		<summary type="html">&lt;p&gt;Jlo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;need to find the right source for the needed kernel module then to compile it and expose it as a custom APK...&amp;lt;br/&amp;gt;&lt;br /&gt;
all I now yet is that it is a hardware watchdog called something like &#039;&#039;&#039;it8772&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
maybe this is the right source code: https://code.woboq.org/linux/linux/drivers/watchdog/it87_wdt.c.html ?&amp;lt;br/&amp;gt;&lt;br /&gt;
no lusk, it supports chips: IT8620, IT8702, IT8712, IT8716, IT8718, IT8720, IT8721, IT8726, IT8728 and IT8783&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;~# modprobe it87_wdt&lt;br /&gt;
it87_wdt: Unknown Chip found, Chip 8772 Revision 0001&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To monitor the CPU we have&lt;br /&gt;
&amp;lt;pre&amp;gt;~# modprobe it87&lt;br /&gt;
it87: Found IT8772E chip at 0xa40, revision 1&lt;br /&gt;
it87: Beeping is supported&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/watchdog&amp;diff=13717</id>
		<title>User:Jlo/watchdog</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/watchdog&amp;diff=13717"/>
		<updated>2017-08-02T14:04:54Z</updated>

		<summary type="html">&lt;p&gt;Jlo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;need to find the right source for the needed kernel module then to compile it and expose it as a custom APK...&amp;lt;br/&amp;gt;&lt;br /&gt;
all I now yet is that it is a hardware watchdog called something like &#039;&#039;&#039;it8772&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
maybe this is the right source code: https://code.woboq.org/linux/linux/drivers/watchdog/it87_wdt.c.html ?&amp;lt;br/&amp;gt;&lt;br /&gt;
no lusk, it supports chips: IT8620, IT8702, IT8712, IT8716, IT8718, IT8720, IT8721, IT8726, IT8728 and IT8783&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/watchdog&amp;diff=13716</id>
		<title>User:Jlo/watchdog</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/watchdog&amp;diff=13716"/>
		<updated>2017-08-02T14:03:01Z</updated>

		<summary type="html">&lt;p&gt;Jlo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;need to find the right source for the needed kernel module then to compile it and expose it as a custom APK...&amp;lt;br/&amp;gt;&lt;br /&gt;
all I now yet is that it is a hardware watchdog called something like &#039;&#039;&#039;it8772&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
maybe this is the right source code: https://code.woboq.org/linux/linux/drivers/watchdog/it87_wdt.c.html&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/watchdog&amp;diff=13715</id>
		<title>User:Jlo/watchdog</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/watchdog&amp;diff=13715"/>
		<updated>2017-08-02T14:00:19Z</updated>

		<summary type="html">&lt;p&gt;Jlo: correct a typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;need to find the right source for the needed kernel module then to compile it and expose it as a custom APK...&amp;lt;br/&amp;gt;&lt;br /&gt;
all I now yet is that it is a hardware watchdog called something like &#039;&#039;&#039;it8772&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/watchdog&amp;diff=13714</id>
		<title>User:Jlo/watchdog</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/watchdog&amp;diff=13714"/>
		<updated>2017-08-02T13:59:51Z</updated>

		<summary type="html">&lt;p&gt;Jlo: Created page with &amp;quot;need to find the right source for the needed kernel module then to compile it and expose it as a custom APK... all I now yet is that it is a hardware watchdog called someting...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;need to find the right source for the needed kernel module then to compile it and expose it as a custom APK...&lt;br /&gt;
all I now yet is that it is a hardware watchdog called someting like &#039;&#039;&#039;it8772&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/usb&amp;diff=13713</id>
		<title>User:Jlo/usb</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/usb&amp;diff=13713"/>
		<updated>2017-08-02T13:32:10Z</updated>

		<summary type="html">&lt;p&gt;Jlo: Created page with &amp;quot;all needed ones are present out-of-the-box&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;all needed ones are present out-of-the-box&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/network&amp;diff=13712</id>
		<title>User:Jlo/network</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/network&amp;diff=13712"/>
		<updated>2017-08-02T13:31:48Z</updated>

		<summary type="html">&lt;p&gt;Jlo: Created page with &amp;quot;all needed ones are present out-of-the box ;)&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;all needed ones are present out-of-the box ;)&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo&amp;diff=13711</id>
		<title>User:Jlo</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo&amp;diff=13711"/>
		<updated>2017-08-02T13:31:10Z</updated>

		<summary type="html">&lt;p&gt;Jlo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I was [[User:Jch]] but I forgot my passwd and the email used to suscribe is not valid anymore...&lt;br /&gt;
&lt;br /&gt;
I&#039;m today senior system architect at some startup.&amp;lt;br/&amp;gt;&lt;br /&gt;
We are building a network of embedded devices controlling hardware stuff.&amp;lt;br/&amp;gt;&lt;br /&gt;
I&#039;m stepping it as the product is transitioning from prototype phase to industrial phase.&lt;br /&gt;
&lt;br /&gt;
The main app is written for Oracle Java8 and running in Apache/Karaf environment.&lt;br /&gt;
&lt;br /&gt;
The proto was done with Debian boxes managed with salt stack (about 100 of those with a mix of Wheezy and Jessie).&lt;br /&gt;
&lt;br /&gt;
I would like to see the boxes running AL in &#039;&#039;run-from-ram&#039;&#039; mode pulling the apkovl tarball (or at least some tarball to be applied in the /etc/local.d sequence) from a remote server somewhere in the cloud.&amp;lt;br/&amp;gt;&lt;br /&gt;
To upgrade would just to rsync the normally read-only SSD and reboot.&lt;br /&gt;
&lt;br /&gt;
To achieve this with AlpineLinux, one has to:&lt;br /&gt;
&lt;br /&gt;
*    deploy [[User:Jlo/java8|Oracle Java 7 with glibc]]&lt;br /&gt;
*    deploy [[User:Jlo/java8|Oracle Java 8 with glibc]]&lt;br /&gt;
*    deploy [[User:Jlo/python27|python2.7 with needed libs]]&lt;br /&gt;
*    deploy [[User:Jlo/watchdog|hardware watchdog]]&lt;br /&gt;
*    deploy [[User:Jlo/network|network drivers]] (eth, usb-eth, wlan, 3g, lte)&lt;br /&gt;
*    deploy [[User:Jlo/usb|USB drivers]]&lt;br /&gt;
*    rewrite [[User:Jlo/init|init scripts]]&lt;br /&gt;
*    prepare a [[User:Jlo/image|custom image]] with every needed packages locally present in disk repo&lt;br /&gt;
*    adapt [[User:Jlo/packages|custom packages]] from deb to apk ones&lt;br /&gt;
&lt;br /&gt;
To configure a box is done in two parts:&lt;br /&gt;
&lt;br /&gt;
*    the network. done locally&lt;br /&gt;
*    the app layer. done via a webinterface; commited to a server and download by the box at each boot.&lt;br /&gt;
&lt;br /&gt;
The advantages of such architecture are:&lt;br /&gt;
&lt;br /&gt;
* power failure resilient as the system runs from ram&amp;lt;br/&amp;gt;The only PoF here is when an upgrade of the read-only medium is done&lt;br /&gt;
* boxes use a pull mechanism to stay up-to-date ensuring the right version at any next reboot&amp;lt;br/&amp;gt;This protect us against out-of-sync boxes arraising often with push architecture (salt, ansible, ...)&lt;br /&gt;
* the two steps boot sequence allows us to temporary take control over a box for maintenance with a totally different setup&amp;lt;br/&amp;gt;and as we always keep an ssh access via the VPN, we can force that anytime we want (hardware watchdog being our friend here)&lt;br /&gt;
* easy to reproduce in VM for testing (including load tests)&lt;br /&gt;
&lt;br /&gt;
Disadvantages are:&lt;br /&gt;
&lt;br /&gt;
* need own repo with access control to distribute Oracle Java internally without breach of license&amp;lt;br/&amp;gt;(but it is the same situation for any distro)&lt;br /&gt;
* some used packages are distributed as deb only (from artifactory between others)&amp;lt;br/&amp;gt;will need to script part of the CI towards apk generation...&amp;lt;br/&amp;gt;will need to check every deb to see if sources are available...&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Udhcpc&amp;diff=13710</id>
		<title>Udhcpc</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Udhcpc&amp;diff=13710"/>
		<updated>2017-08-02T13:23:51Z</updated>

		<summary type="html">&lt;p&gt;Jlo: correct a typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You may want to customize behavior of default dhcp client (udhcpc from busybox).&lt;br /&gt;
&lt;br /&gt;
The default behavior is drived by the script /usr/share/udhcpc/default.script&lt;br /&gt;
&lt;br /&gt;
It&#039;s default configuration may be overwritten by a /etc/udhcpc/udhcpc.conf file.&lt;br /&gt;
&lt;br /&gt;
Authorized key:value pair are available:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;15&amp;quot; border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! key&lt;br /&gt;
| default value&lt;br /&gt;
| possible values&lt;br /&gt;
|-&lt;br /&gt;
| NO_GATEWAY&lt;br /&gt;
| -&lt;br /&gt;
| &amp;lt;list of iface names&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| IF_METRIC&lt;br /&gt;
| -&lt;br /&gt;
| &amp;lt;metric value&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| IF_PEER_DNS&lt;br /&gt;
| yes&lt;br /&gt;
| &amp;lt;anything but yes&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| RESOLV_CONF&lt;br /&gt;
| /etc/resolv.conf&lt;br /&gt;
| no ; NO ; -&lt;br /&gt;
|-&lt;br /&gt;
| NO_DNS&lt;br /&gt;
| -&lt;br /&gt;
| &amp;lt;list of iface names&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
You may also add custom scripts /etc/udhcpc/pre-* and /etc/udhcpc/post-* to be run before and after deconfig|renew|bound dhcp events.&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Udhcpc&amp;diff=13709</id>
		<title>Udhcpc</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Udhcpc&amp;diff=13709"/>
		<updated>2017-08-02T13:23:07Z</updated>

		<summary type="html">&lt;p&gt;Jlo: Created page with &amp;quot;You may want to customize behavior of default dhcp client (udhcpc from busybox).  The default behavior is drived by the script /usr/share/udhcpc/default.script  It&amp;#039;s default c...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You may want to customize behavior of default dhcp client (udhcpc from busybox).&lt;br /&gt;
&lt;br /&gt;
The default behavior is drived by the script /usr/share/udhcpc/default.script&lt;br /&gt;
&lt;br /&gt;
It&#039;s default configuration may be overwritten by a /etc/udhcpc/udhcpc.conf file.&lt;br /&gt;
&lt;br /&gt;
Authorized key:value pair are available:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;15&amp;quot; border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! key&lt;br /&gt;
| default value&lt;br /&gt;
| possible values&lt;br /&gt;
|-&lt;br /&gt;
| NO_GATEWAY&lt;br /&gt;
| -&lt;br /&gt;
| &amp;lt;list of iface names&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| IF_METRIC&lt;br /&gt;
| -&lt;br /&gt;
| &amp;lt;metric value&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| IF_PEER_DNS&lt;br /&gt;
| yes&lt;br /&gt;
| &amp;lt;anything but yes&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| RESOLV_CONF&lt;br /&gt;
| /etc/resolv.conf&lt;br /&gt;
| no ; NO ; -&lt;br /&gt;
|-&lt;br /&gt;
| NO_DNS&lt;br /&gt;
| -&lt;br /&gt;
| &amp;lt;list of iface names&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
You may also add custom scripts /etc/udgcpc.pre-* and /etc/udgcpc.post-* to be run before and after deconfig|renew|bound dhcp events.&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Configure_Networking&amp;diff=13708</id>
		<title>Configure Networking</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Configure_Networking&amp;diff=13708"/>
		<updated>2017-08-02T13:00:08Z</updated>

		<summary type="html">&lt;p&gt;Jlo: /* Related articles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page will assist you in setting up networking on Alpine Linux.&lt;br /&gt;
{{Note|You must be logged in as root in order to perform the actions on this page.}}&lt;br /&gt;
&lt;br /&gt;
= Setting System Hostname =&lt;br /&gt;
To set the system hostname, do something like the following:&lt;br /&gt;
{{Cmd|echo &amp;quot;shortname&amp;quot; &amp;gt; /etc/hostname}}&lt;br /&gt;
&lt;br /&gt;
Then, to activate the change, do the following:&lt;br /&gt;
{{Cmd|hostname -F /etc/hostname}}&lt;br /&gt;
&lt;br /&gt;
If you&#039;re using IPv6, you should also add the following special IPv6 addresses to your &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;::1             localhost ipv6-localhost ipv6-loopback&lt;br /&gt;
fe00::0         ipv6-localnet&lt;br /&gt;
ff00::0         ipv6-mcastprefix&lt;br /&gt;
ff02::1         ipv6-allnodes&lt;br /&gt;
ff02::2         ipv6-allrouters&lt;br /&gt;
ff02::3         ipv6-allhosts&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Tip|If you are going to use automatic IP configuration, such as IPv4 DHCP or IPv6 Stateless Autoconfiguration, you can skip ahead to [[#Configuring_DNS|Configuring DNS]].  Otherwise, if you are going to use a static IPv4 or IPv6 address, continue below.}}&lt;br /&gt;
&lt;br /&gt;
For a static IP configuration, it&#039;s common to also add the machine&#039;s hostname you just set (above) to the &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s an IPv4 example:&lt;br /&gt;
&amp;lt;pre&amp;gt;192.168.1.150   shortname.domain.com&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And here&#039;s an IPv6 example:&lt;br /&gt;
&amp;lt;pre&amp;gt;2001:470:ffff:ff::2   shortname.domain.com&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configuring DNS =&lt;br /&gt;
{{Tip|&#039;&#039;&#039;For users of IPv4 DHCP:&#039;&#039;&#039; Please note that &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; will be completely overwritten with any nameservers provided by DHCP. Also, if DHCP does not provide any nameservers, then &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; will still be overwritten, but will not contain any nameservers!}}&lt;br /&gt;
&lt;br /&gt;
For using a static IP and static nameservers, use one of the following examples.&lt;br /&gt;
&lt;br /&gt;
For IPv4 nameservers, edit your &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; file to look like this:&amp;lt;br /&amp;gt;&lt;br /&gt;
The following example uses [http://en.wikipedia.org/wiki/Google_Public_DNS Google&#039;s Public DNS servers].&lt;br /&gt;
 nameserver 8.8.8.8&lt;br /&gt;
 nameserver 8.8.4.4&lt;br /&gt;
&lt;br /&gt;
For IPv6 nameservers, edit your &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; file to look like this:&amp;lt;br /&amp;gt;&lt;br /&gt;
The following example uses [http://www.he.net/ Hurricane Electric&#039;s] public DNS server.&lt;br /&gt;
 nameserver 2001:470:20::2&lt;br /&gt;
You can also use Hurricane Electric&#039;s public DNS server via IPv4:&lt;br /&gt;
 nameserver 74.82.42.42&lt;br /&gt;
&lt;br /&gt;
{{Tip|If you decide to use Hurricane Electric&#039;s nameserver, be aware that it is &#039;Google-whitelisted&#039;. What does this mean?  It allows you access to many of Google&#039;s services via IPv6. (Just don&#039;t add other, non-whitelisted, nameservers to &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; — ironically, such as Google&#039;s Public DNS Servers.) Read [http://www.google.com/intl/en/ipv6/ here] for more information.}}&lt;br /&gt;
&lt;br /&gt;
= Enabling IPv6 (Optional) =&lt;br /&gt;
&lt;br /&gt;
If you use IPv6, do the following to enable IPv6 for now and at each boot:&lt;br /&gt;
{{Cmd|modprobe ipv6&lt;br /&gt;
echo &amp;quot;ipv6&amp;quot; &amp;gt;&amp;gt; /etc/modules}}&lt;br /&gt;
&lt;br /&gt;
= Interface Configuration =&lt;br /&gt;
&lt;br /&gt;
== Loopback Configuration (Required) ==&lt;br /&gt;
{{Note|The loopback configuration must appear first in &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; to prevent networking issues.}}&lt;br /&gt;
To configure loopback, add the following to a new file &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;auto lo&lt;br /&gt;
iface lo inet loopback&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above works to setup the IPv4 loopback address (127.0.0.1), and the IPv6 loopback address (&amp;lt;code&amp;gt;::1&amp;lt;/code&amp;gt;) — if you enabled IPv6.&lt;br /&gt;
&lt;br /&gt;
== Wireless Configuration ==&lt;br /&gt;
&lt;br /&gt;
See [[Connecting to a wireless access point]].&lt;br /&gt;
&lt;br /&gt;
== Ethernet Configuration ==&lt;br /&gt;
For the following Ethernet configuration examples, we will assume that you are using Ethernet device &amp;lt;code&amp;gt;eth0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Initial Configuration ===&lt;br /&gt;
Add the following to the file &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt;, above any IP configuration for &amp;lt;code&amp;gt;eth0&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;auto eth0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== IPv4 DHCP Configuration ===&lt;br /&gt;
Add the following to the file &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt;, below the &amp;lt;code&amp;gt;auto eth0&amp;lt;/code&amp;gt; definition:&lt;br /&gt;
&amp;lt;pre&amp;gt;iface eth0 inet dhcp&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== IPv4 Static Address Configuration ===&lt;br /&gt;
Add the following to the file &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt;, below the &amp;lt;code&amp;gt;auto eth0&amp;lt;/code&amp;gt; definition:&lt;br /&gt;
&amp;lt;pre&amp;gt;iface eth0 inet static&lt;br /&gt;
        address 192.168.1.150&lt;br /&gt;
        netmask 255.255.255.0&lt;br /&gt;
        gateway 192.168.1.1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== IPv6 Stateless Autoconfiguration ===&lt;br /&gt;
Add the following to the file &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt;, below the &amp;lt;code&amp;gt;auto eth0&amp;lt;/code&amp;gt; definition:&lt;br /&gt;
&amp;lt;pre&amp;gt;iface eth0 inet6 manual&lt;br /&gt;
        pre-up echo 1 &amp;gt; /proc/sys/net/ipv6/conf/eth0/accept_ra&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Tip|The &amp;quot;inet6 manual&amp;quot; method is available in busybox 1.17.3-r3 and later.}}&lt;br /&gt;
&lt;br /&gt;
=== IPv6 Static Address Configuration ===&lt;br /&gt;
Add the following to the file &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt;, below the &amp;lt;code&amp;gt;auto eth0&amp;lt;/code&amp;gt; definition:&lt;br /&gt;
&amp;lt;pre&amp;gt;iface eth0 inet6 static&lt;br /&gt;
        address 2001:470:ffff:ff::2&lt;br /&gt;
        netmask 64&lt;br /&gt;
        gateway 2001:470:ffff:ff::1&lt;br /&gt;
        pre-up echo 0 &amp;gt; /proc/sys/net/ipv6/conf/eth0/accept_ra&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example: Dual-Stack Configuration ==&lt;br /&gt;
This example shows a dual-stack configuration.&lt;br /&gt;
&amp;lt;pre&amp;gt;auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
auto eth0&lt;br /&gt;
&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.1.150&lt;br /&gt;
        netmask 255.255.255.0&lt;br /&gt;
        gateway 192.168.1.1&lt;br /&gt;
&lt;br /&gt;
iface eth0 inet6 static&lt;br /&gt;
        address 2001:470:ffff:ff::2&lt;br /&gt;
        netmask 64&lt;br /&gt;
        gateway 2001:470:ffff:ff::1&lt;br /&gt;
        pre-up echo 0 &amp;gt; /proc/sys/net/ipv6/conf/eth0/accept_ra&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firewalling with iptables and ip6tables =&lt;br /&gt;
&lt;br /&gt;
See also: [[Alpine Wall]] - [[How-To Alpine Wall]] - [[Alpine Wall User&#039;s Guide]]&lt;br /&gt;
&lt;br /&gt;
== Install iptables/ip6tables ==&lt;br /&gt;
* To install iptables:&lt;br /&gt;
: {{Cmd|apk add iptables}}&lt;br /&gt;
&lt;br /&gt;
* To install ip6tables:&lt;br /&gt;
: {{Cmd|apk add ip6tables}}&lt;br /&gt;
&lt;br /&gt;
* To install the man pages for iptables and ip6tables:&lt;br /&gt;
: {{Cmd|apk add iptables-doc}}&lt;br /&gt;
&lt;br /&gt;
== Configure iptables/ip6tables ==&lt;br /&gt;
{{ Tip| Good examples of how to write iptables rules can be found at the Linux Home Networking Wiki http://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:_Ch14_:_Linux_Firewalls_Using_iptables }}&lt;br /&gt;
&lt;br /&gt;
== Save Firewall Rules ==&lt;br /&gt;
&lt;br /&gt;
=== For iptables ===&lt;br /&gt;
# Set iptables to start on reboot&lt;br /&gt;
#* {{ Cmd| rc-update add iptables }}&lt;br /&gt;
# Write the firewall rules to disk&lt;br /&gt;
#* {{ Cmd| /etc/init.d/iptables save}}&lt;br /&gt;
# If you use Alpine Local Backup:&lt;br /&gt;
&amp;lt;!-- Not needed on Alpine &amp;gt; 2.3&lt;br /&gt;
## Add the firewall rules to Alpine Local Backup&lt;br /&gt;
##* {{ Cmd| lbu add /var/lib/iptables/rules-save }}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
## Save the configuration&lt;br /&gt;
##* {{ Cmd| lbu ci }}&lt;br /&gt;
&lt;br /&gt;
=== For ip6tables ===&lt;br /&gt;
# Set ip6tables to start on reboot&lt;br /&gt;
#* {{ Cmd| rc-update add ip6tables }}&lt;br /&gt;
# Write the firewall rules to disk&lt;br /&gt;
#* {{ Cmd| /etc/init.d/ip6tables save}}&lt;br /&gt;
# If you use Alpine Local Backup:&lt;br /&gt;
&amp;lt;!-- Not needed on Alpine &amp;gt; 2.3&lt;br /&gt;
## Add the firewall rules to Alpine Local Backup&lt;br /&gt;
##* {{ Cmd| lbu add /var/lib/ip6tables/rules-save }}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
## Save the configuration&lt;br /&gt;
##* {{ Cmd| lbu ci }}&lt;br /&gt;
&lt;br /&gt;
= Activating Changes and Testing Connectivity =&lt;br /&gt;
Changes made to &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; can be activated by running:&lt;br /&gt;
{{Cmd|/etc/init.d/networking restart}}&lt;br /&gt;
If you did not get any errors, you can now test that networking is configured properly by attempting to ping out:&lt;br /&gt;
{{Cmd|ping www.google.com}}&lt;br /&gt;
&amp;lt;pre&amp;gt;PING www.l.google.com (74.125.47.103) 56(84) bytes of data.&lt;br /&gt;
64 bytes from yw-in-f103.1e100.net (74.125.47.103): icmp_seq=1 ttl=48 time=58.5 ms&lt;br /&gt;
64 bytes from yw-in-f103.1e100.net (74.125.47.103): icmp_seq=2 ttl=48 time=56.4 ms&lt;br /&gt;
64 bytes from yw-in-f103.1e100.net (74.125.47.103): icmp_seq=3 ttl=48 time=57.0 ms&lt;br /&gt;
64 bytes from yw-in-f103.1e100.net (74.125.47.103): icmp_seq=4 ttl=48 time=60.2 ms&lt;br /&gt;
^C&lt;br /&gt;
--- www.l.google.com ping statistics ---&lt;br /&gt;
4 packets transmitted, 4 received, 0% packet loss, time 3007ms&lt;br /&gt;
rtt min/avg/max/mdev = 56.411/58.069/60.256/1.501 ms&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For an IPv6 traceroute (&amp;lt;code&amp;gt;traceroute6&amp;lt;/code&amp;gt;), you will first need to install the &amp;lt;code&amp;gt;iputils&amp;lt;/code&amp;gt; package:&lt;br /&gt;
{{Cmd|apk add iputils}}&lt;br /&gt;
&lt;br /&gt;
Then run &amp;lt;code&amp;gt;traceroute6&amp;lt;/code&amp;gt;:&lt;br /&gt;
{{Cmd|traceroute6 ipv6.google.com}}&lt;br /&gt;
&amp;lt;pre&amp;gt;traceroute to ipv6.l.google.com (2001:4860:8009::67) from 2001:470:ffff:ff::2, 30 hops max, 16 byte packets&lt;br /&gt;
 1  2001:470:ffff:ff::1 (2001:470:ffff:ff::1)  3.49 ms  0.62 ms  0.607 ms&lt;br /&gt;
 2  *  *  *&lt;br /&gt;
 3  *  *  *&lt;br /&gt;
 4  pr61.iad07.net.google.com (2001:504:0:2:0:1:5169:1)  134.313 ms  95.342 ms  88.425 ms&lt;br /&gt;
 5  2001:4860::1:0:9ff (2001:4860::1:0:9ff)  100.759 ms  100.537 ms  89.907 ms&lt;br /&gt;
 6  2001:4860::1:0:5db (2001:4860::1:0:5db)  115.563 ms  102.946 ms  106.191 ms&lt;br /&gt;
 7  2001:4860::2:0:a7 (2001:4860::2:0:a7)  101.754 ms  100.475 ms  100.512 ms&lt;br /&gt;
 8  2001:4860:0:1::c3 (2001:4860:0:1::c3)  99.272 ms  111.989 ms  99.835 ms&lt;br /&gt;
 9  yw-in-x67.1e100.net (2001:4860:8009::67)  101.545 ms  109.675 ms  99.431 ms&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Additional Utilities =&lt;br /&gt;
&lt;br /&gt;
== iproute2 ==&lt;br /&gt;
&lt;br /&gt;
You may wish to install the &#039;iproute2&#039; package (note that this will also install iptables if not yet installed)&lt;br /&gt;
&lt;br /&gt;
{{Cmd|apk add iproute2}}&lt;br /&gt;
&lt;br /&gt;
This provides the &#039;ss&#039; command which is IMHO a &#039;better&#039; version of netstat.&lt;br /&gt;
&lt;br /&gt;
Show listening tcp ports:&lt;br /&gt;
{{Cmd|ss -tl}}&lt;br /&gt;
&lt;br /&gt;
Show listening tcp ports and associated processes:&lt;br /&gt;
{{Cmd|ss -ptl}}&lt;br /&gt;
&lt;br /&gt;
Show listening and established tcp connections:&lt;br /&gt;
{{Cmd|ss -ta}}&lt;br /&gt;
&lt;br /&gt;
Show socket usage summary:&lt;br /&gt;
{{Cmd|ss -s}}&lt;br /&gt;
&lt;br /&gt;
Show more options:&lt;br /&gt;
{{Cmd|ss -h}}&lt;br /&gt;
&lt;br /&gt;
== drill ==&lt;br /&gt;
&lt;br /&gt;
You may also wish to install &#039;drill&#039; (it will also install the &#039;ldns&#039; package) which is a superior (IMHO) replacement for nslookup and dig etc:&lt;br /&gt;
&lt;br /&gt;
{{Cmd|apk add drill}}&lt;br /&gt;
&lt;br /&gt;
Then use it as you would for dig:&lt;br /&gt;
&lt;br /&gt;
{{Cmd|drill alpinelinux.org @8.8.8.8}}&lt;br /&gt;
&lt;br /&gt;
To perform a reverse lookup (get a name from an IP) use the following syntax:&lt;br /&gt;
&lt;br /&gt;
{{Cmd|drill -x 8.8.8.8 @208.67.222.222}}&lt;br /&gt;
&lt;br /&gt;
= Related articles =&lt;br /&gt;
&lt;br /&gt;
You may also wish to review the following network related articles:&lt;br /&gt;
&lt;br /&gt;
[[Vlan|VLAN setup]]&lt;br /&gt;
&lt;br /&gt;
[[Bonding|Bonding setup]]&lt;br /&gt;
&lt;br /&gt;
[[Bridge|Network bridge setup]]&lt;br /&gt;
&lt;br /&gt;
[[udhcpc|udhcpc configuration]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Networking]]&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User_talk:Jlo&amp;diff=13696</id>
		<title>User talk:Jlo</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User_talk:Jlo&amp;diff=13696"/>
		<updated>2017-07-22T09:12:24Z</updated>

		<summary type="html">&lt;p&gt;Jlo: /* permanent pip install in run-from-ram with overlayFS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Oracle Java ==&lt;br /&gt;
&lt;br /&gt;
Let&#039;s adapt one (or more) famous docker files&lt;br /&gt;
(credit to https://hub.docker.com/r/anapsix/alpine-java/)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apk --update add curl ca-certificates tar&lt;br /&gt;
curl -Ls https://circle-artifacts.com/gh/andyshinn/alpine-pkg-glibc/6/artifacts/0/home/ubuntu/alpine-pkg-glibc/packages/x86_64/glibc-2.21-r2.apk &amp;gt; /tmp/glibc-2.21-r2.apk&lt;br /&gt;
apk add --allow-untrusted /tmp/glibc-2.21-r2.apk&lt;br /&gt;
&lt;br /&gt;
# Java Version&lt;br /&gt;
ENV JAVA_VERSION_MAJOR 8&lt;br /&gt;
ENV JAVA_VERSION_MINOR 45&lt;br /&gt;
ENV JAVA_VERSION_BUILD 14&lt;br /&gt;
ENV JAVA_PACKAGE       jdk&lt;br /&gt;
&lt;br /&gt;
# Download and unarchive Java&lt;br /&gt;
mkdir /opt&lt;br /&gt;
curl -jksSLH &amp;quot;Cookie: oraclelicense=accept-securebackup-cookie&amp;quot;\&lt;br /&gt;
  http://download.oracle.com/otn-pub/java/jdk/${JAVA_VERSION_MAJOR}u${JAVA_VERSION_MINOR}-b${JAVA_VERSION_BUILD}/${JAVA_PACKAGE}-${JAVA_VERSION_MAJOR}u${JAVA_VERSION_MINOR}-linux-x64.tar.gz \&lt;br /&gt;
    | tar -xzf - -C /opt&lt;br /&gt;
ln -s /opt/jdk1.${JAVA_VERSION_MAJOR}.0_${JAVA_VERSION_MINOR} /opt/jdk &lt;br /&gt;
rm -rf /opt/jdk/*src.zip \&lt;br /&gt;
           /opt/jdk/lib/missioncontrol \&lt;br /&gt;
           /opt/jdk/lib/visualvm \&lt;br /&gt;
           /opt/jdk/lib/*javafx* \&lt;br /&gt;
           /opt/jdk/jre/lib/plugin.jar \&lt;br /&gt;
           /opt/jdk/jre/lib/ext/jfxrt.jar \&lt;br /&gt;
           /opt/jdk/jre/bin/javaws \&lt;br /&gt;
           /opt/jdk/jre/lib/javaws.jar \&lt;br /&gt;
           /opt/jdk/jre/lib/desktop \&lt;br /&gt;
           /opt/jdk/jre/plugin \&lt;br /&gt;
           /opt/jdk/jre/lib/deploy* \&lt;br /&gt;
           /opt/jdk/jre/lib/*javafx* \&lt;br /&gt;
           /opt/jdk/jre/lib/*jfx* \&lt;br /&gt;
           /opt/jdk/jre/lib/amd64/libdecora_sse.so \&lt;br /&gt;
           /opt/jdk/jre/lib/amd64/libprism_*.so \&lt;br /&gt;
           /opt/jdk/jre/lib/amd64/libfxplugins.so \&lt;br /&gt;
           /opt/jdk/jre/lib/amd64/libglass.so \&lt;br /&gt;
           /opt/jdk/jre/lib/amd64/libgstreamer-lite.so \&lt;br /&gt;
           /opt/jdk/jre/lib/amd64/libjavafx*.so \&lt;br /&gt;
           /opt/jdk/jre/lib/amd64/libjfx*.so&lt;br /&gt;
&lt;br /&gt;
# Set environment&lt;br /&gt;
ENV JAVA_HOME /opt/jdk&lt;br /&gt;
ENV PATH ${PATH}:${JAVA_HOME}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Other sources===&lt;br /&gt;
&lt;br /&gt;
https://blogs.oracle.com/developers/official-docker-image-for-oracle-java-and-the-openjdk-roadmap-for-containers&lt;br /&gt;
https://wiki.alpinelinux.org/wiki/Installing_Oracle_Java&lt;br /&gt;
&lt;br /&gt;
== permanent pip install in run-from-ram with overlayFS ==&lt;br /&gt;
&lt;br /&gt;
For an embedded system, I wanted to have a few python tools installed from pip to be present at boot time without needing network to rebuild.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mv /usr /usr.dist&lt;br /&gt;
mkdir /usr&lt;br /&gt;
mount -t overlay overlay -o lowerdir=/usr.dist,upperdir=/usr,workdir=/tmp/usr /usr&lt;br /&gt;
pip install --upgrade pip&lt;br /&gt;
pip install semantic_version&lt;br /&gt;
pip install incremental&lt;br /&gt;
pip install pymodbus&lt;br /&gt;
umount /usr&lt;br /&gt;
mount -o remount,rw /media/sda1&lt;br /&gt;
mv /usr /media/sda1/usr.post&lt;br /&gt;
mount -o remount,ro /media/sda1&lt;br /&gt;
mv /usr.dist /usr&lt;br /&gt;
mkdir -p /tmp/usr&lt;br /&gt;
mount -t overlay overlay -o lowerdir=/media/sda1/usr.post,upperdir=/usr,workdir=/tmp/usr /usr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I use this technique to also have Oracle Java 8 and Apache Karaf running cleanly in run-from-ram mode without overloading the memory with storage.&lt;br /&gt;
The embedded box has a read-only memory chip and system is clean and brand new at each reboot.&lt;br /&gt;
&lt;br /&gt;
To update, we remount media rw, rsync then remount ro again.&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User_talk:Jlo&amp;diff=13695</id>
		<title>User talk:Jlo</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User_talk:Jlo&amp;diff=13695"/>
		<updated>2017-07-22T08:59:32Z</updated>

		<summary type="html">&lt;p&gt;Jlo: /* permanent pip install in run-from-ram with overlayFS */ new section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Oracle Java ==&lt;br /&gt;
&lt;br /&gt;
Let&#039;s adapt one (or more) famous docker files&lt;br /&gt;
(credit to https://hub.docker.com/r/anapsix/alpine-java/)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apk --update add curl ca-certificates tar&lt;br /&gt;
curl -Ls https://circle-artifacts.com/gh/andyshinn/alpine-pkg-glibc/6/artifacts/0/home/ubuntu/alpine-pkg-glibc/packages/x86_64/glibc-2.21-r2.apk &amp;gt; /tmp/glibc-2.21-r2.apk&lt;br /&gt;
apk add --allow-untrusted /tmp/glibc-2.21-r2.apk&lt;br /&gt;
&lt;br /&gt;
# Java Version&lt;br /&gt;
ENV JAVA_VERSION_MAJOR 8&lt;br /&gt;
ENV JAVA_VERSION_MINOR 45&lt;br /&gt;
ENV JAVA_VERSION_BUILD 14&lt;br /&gt;
ENV JAVA_PACKAGE       jdk&lt;br /&gt;
&lt;br /&gt;
# Download and unarchive Java&lt;br /&gt;
mkdir /opt&lt;br /&gt;
curl -jksSLH &amp;quot;Cookie: oraclelicense=accept-securebackup-cookie&amp;quot;\&lt;br /&gt;
  http://download.oracle.com/otn-pub/java/jdk/${JAVA_VERSION_MAJOR}u${JAVA_VERSION_MINOR}-b${JAVA_VERSION_BUILD}/${JAVA_PACKAGE}-${JAVA_VERSION_MAJOR}u${JAVA_VERSION_MINOR}-linux-x64.tar.gz \&lt;br /&gt;
    | tar -xzf - -C /opt&lt;br /&gt;
ln -s /opt/jdk1.${JAVA_VERSION_MAJOR}.0_${JAVA_VERSION_MINOR} /opt/jdk &lt;br /&gt;
rm -rf /opt/jdk/*src.zip \&lt;br /&gt;
           /opt/jdk/lib/missioncontrol \&lt;br /&gt;
           /opt/jdk/lib/visualvm \&lt;br /&gt;
           /opt/jdk/lib/*javafx* \&lt;br /&gt;
           /opt/jdk/jre/lib/plugin.jar \&lt;br /&gt;
           /opt/jdk/jre/lib/ext/jfxrt.jar \&lt;br /&gt;
           /opt/jdk/jre/bin/javaws \&lt;br /&gt;
           /opt/jdk/jre/lib/javaws.jar \&lt;br /&gt;
           /opt/jdk/jre/lib/desktop \&lt;br /&gt;
           /opt/jdk/jre/plugin \&lt;br /&gt;
           /opt/jdk/jre/lib/deploy* \&lt;br /&gt;
           /opt/jdk/jre/lib/*javafx* \&lt;br /&gt;
           /opt/jdk/jre/lib/*jfx* \&lt;br /&gt;
           /opt/jdk/jre/lib/amd64/libdecora_sse.so \&lt;br /&gt;
           /opt/jdk/jre/lib/amd64/libprism_*.so \&lt;br /&gt;
           /opt/jdk/jre/lib/amd64/libfxplugins.so \&lt;br /&gt;
           /opt/jdk/jre/lib/amd64/libglass.so \&lt;br /&gt;
           /opt/jdk/jre/lib/amd64/libgstreamer-lite.so \&lt;br /&gt;
           /opt/jdk/jre/lib/amd64/libjavafx*.so \&lt;br /&gt;
           /opt/jdk/jre/lib/amd64/libjfx*.so&lt;br /&gt;
&lt;br /&gt;
# Set environment&lt;br /&gt;
ENV JAVA_HOME /opt/jdk&lt;br /&gt;
ENV PATH ${PATH}:${JAVA_HOME}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Other sources===&lt;br /&gt;
&lt;br /&gt;
https://blogs.oracle.com/developers/official-docker-image-for-oracle-java-and-the-openjdk-roadmap-for-containers&lt;br /&gt;
https://wiki.alpinelinux.org/wiki/Installing_Oracle_Java&lt;br /&gt;
&lt;br /&gt;
== permanent pip install in run-from-ram with overlayFS ==&lt;br /&gt;
&lt;br /&gt;
For an embedded system, I wanted to have a few python tools installed from pip to be present at boot time without needing network to rebuild.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mv /usr /usr.dist&lt;br /&gt;
mkdir /usr&lt;br /&gt;
mount -t overlay overlay -o lowerdir=/usr.dist,upperdir=/usr,workdir=/tmp/usr /usr&lt;br /&gt;
pip install --upgrade pip&lt;br /&gt;
pip install semantic_version&lt;br /&gt;
pip install incremental&lt;br /&gt;
pip install pymodbus&lt;br /&gt;
umount /usr&lt;br /&gt;
mount -o remount,rw /media/sda1&lt;br /&gt;
mv /usr /media/sda1/usr.post&lt;br /&gt;
mount -o remount,ro /media/sda1&lt;br /&gt;
mv /usr.dist /usr&lt;br /&gt;
mkdir -p /tmp/usr&lt;br /&gt;
mount -t overlay overlay -o lowerdir=/media/sda1/usr.post,upperdir=/usr,workdir=/tmp/usr /usr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/image&amp;diff=13646</id>
		<title>User:Jlo/image</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/image&amp;diff=13646"/>
		<updated>2017-06-13T06:46:13Z</updated>

		<summary type="html">&lt;p&gt;Jlo: Created page with &amp;quot;&amp;lt;pre&amp;gt; apk add ca-certificates curl openvpn paxctl screen python2 glibc wget java &amp;lt;/pre&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
apk add ca-certificates curl openvpn paxctl screen python2 glibc&lt;br /&gt;
wget java&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/python27&amp;diff=13645</id>
		<title>User:Jlo/python27</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/python27&amp;diff=13645"/>
		<updated>2017-06-13T06:38:20Z</updated>

		<summary type="html">&lt;p&gt;Jlo: Created page with &amp;quot;&amp;lt;pre&amp;gt; apk add python2 screen &amp;lt;/pre&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
apk add python2 screen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/java8&amp;diff=13644</id>
		<title>User:Jlo/java8</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo/java8&amp;diff=13644"/>
		<updated>2017-06-13T06:31:10Z</updated>

		<summary type="html">&lt;p&gt;Jlo: Created page with &amp;quot;on a data install &amp;lt;pre&amp;gt; URL=http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/server-jre-8u131-linux-x64.tar.gz JDK=jdk1-8.0_131 FILE=serv...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;on a data install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
URL=http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/server-jre-8u131-linux-x64.tar.gz&lt;br /&gt;
JDK=jdk1-8.0_131&lt;br /&gt;
FILE=server-jre-8u131-linux-x64.tar.gz&lt;br /&gt;
cd /var&lt;br /&gt;
apk update&lt;br /&gt;
apk add ca-certificates curl paxctl&lt;br /&gt;
wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://raw.githubusercontent.com/sgerrand/alpine-pkg-glibc/master/sgerrand.rsa.pub&lt;br /&gt;
wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.25-r0/glibc-2.25-r0.apk&lt;br /&gt;
apk add glibc-2.25-r0.apk&lt;br /&gt;
wget $URL&lt;br /&gt;
tar xzf $FILE&lt;br /&gt;
rm $FILE&lt;br /&gt;
ln -s $JDK java&lt;br /&gt;
echo &#039;export JAVA_HOME=/var/java&#039; &amp;gt; /etc/profile.d/java.sh&lt;br /&gt;
echo &#039;export PATH=$JAVA_HOME/bin:$PATH&#039; &amp;gt;&amp;gt; /etc/profile.d/java.sh&lt;br /&gt;
. /etc/profile.d/java.sh&lt;br /&gt;
paxctl -c /var/java/bin/java&lt;br /&gt;
paxctl -m /var/java/bin/java&lt;br /&gt;
paxctl -c /var/java/bin/javac&lt;br /&gt;
paxctl -m /var/java/bin/javac&lt;br /&gt;
java -version&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Installing_Oracle_Java&amp;diff=13643</id>
		<title>Installing Oracle Java</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Installing_Oracle_Java&amp;diff=13643"/>
		<updated>2017-06-13T05:02:24Z</updated>

		<summary type="html">&lt;p&gt;Jlo: typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Using java requires having grsec play nice with the binaries. You may also want to install the JDK instead of the JRE depending on your use case.&lt;br /&gt;
&lt;br /&gt;
This guide assumes you&#039;re running as root.&lt;br /&gt;
&lt;br /&gt;
Download XXX-XXX-linux-x64.tar.gz from either the JRE or JDK section here:&lt;br /&gt;
https://www.oracle.com/technetwork/java/javase/downloads/index.html&lt;br /&gt;
&lt;br /&gt;
 mkdir -p /opt/java&lt;br /&gt;
 cd /opt/java&lt;br /&gt;
 sudo tar -zxvf XXX-XXX-linux-x64.tar.gz &lt;br /&gt;
&lt;br /&gt;
Note down the directory, e.g. /opt/java/jdk1.8.0_121, create a symbol link as the current version:&lt;br /&gt;
&lt;br /&gt;
 ln -s /opt/java/jdk1.8.0_121 /opt/java/current&lt;br /&gt;
&lt;br /&gt;
Create a file in &#039;&#039;&#039;/etc/profile.d/java.sh&#039;&#039;&#039;:&lt;br /&gt;
 export JAVA_HOME=/opt/java/current&lt;br /&gt;
 export PATH=$PATH:$JAVA_HOME/bin&lt;br /&gt;
&lt;br /&gt;
Execute this script or restart your shell:&lt;br /&gt;
 sh /etc/profile.d/java.sh&lt;br /&gt;
&lt;br /&gt;
Now we need manage grsec with paxctl use this command to check if its installed:&lt;br /&gt;
 which paxctl&lt;br /&gt;
&lt;br /&gt;
If nothing comes up install it:&lt;br /&gt;
&lt;br /&gt;
 apk add paxctl&lt;br /&gt;
&lt;br /&gt;
Now in your /opt/java/XXX/bin folder let it execute:&lt;br /&gt;
 paxctl -c java&lt;br /&gt;
 paxctl -m java&lt;br /&gt;
&lt;br /&gt;
If you have the JDK, you need to do the same to javac:&lt;br /&gt;
 paxctl -c javac&lt;br /&gt;
 paxctl -m javac&lt;br /&gt;
&lt;br /&gt;
You can do this for any other binary you need to use.&lt;br /&gt;
&lt;br /&gt;
NOTE: I read online that some people required using this command to get it working (and it may be a better alternative):&lt;br /&gt;
&lt;br /&gt;
 setfattr -n user.pax.flags -v &amp;quot;mr&amp;quot; java&lt;br /&gt;
 setfattr -n user.pax.flags -v &amp;quot;mr&amp;quot; javac&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo&amp;diff=13615</id>
		<title>User:Jlo</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo&amp;diff=13615"/>
		<updated>2017-06-10T10:31:58Z</updated>

		<summary type="html">&lt;p&gt;Jlo: Disadvantages&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I was [[User:Jch]] but I forgot my passwd and the email used to suscribe is not valid anymore...&lt;br /&gt;
&lt;br /&gt;
I&#039;m today senior system architect at some startup.&amp;lt;br/&amp;gt;&lt;br /&gt;
We are building a network of embedded devices controlling hardware stuff.&amp;lt;br/&amp;gt;&lt;br /&gt;
I&#039;m stepping it as the product is transitioning from prototype phase to industrial phase.&lt;br /&gt;
&lt;br /&gt;
The main app is written for Oracle Java8 and running in Apache/Karaf environment.&lt;br /&gt;
&lt;br /&gt;
The proto was done with Debian boxes managed with salt stack (about 100 of those with a mix of Wheezy and Jessie).&lt;br /&gt;
&lt;br /&gt;
I would like to see the boxes running AL in &#039;&#039;run-from-ram&#039;&#039; mode pulling the apkovl tarball (or at least some tarball to be applied in the /etc/local.d sequence) from a remote server somewhere in the cloud.&amp;lt;br/&amp;gt;&lt;br /&gt;
To upgrade would just to rsync the normally read-only SSD and reboot.&lt;br /&gt;
&lt;br /&gt;
To achieve this with AlpineLinux, one has to:&lt;br /&gt;
&lt;br /&gt;
*    deploy [[User:Jlo/java7|Oracle Java 7 with glibc]]&lt;br /&gt;
*    deploy [[User:Jlo/java8|Oracle Java 8 with glibc]]&lt;br /&gt;
*    deploy [[User:Jlo/python27|python2.7 with needed libs]]&lt;br /&gt;
*    deploy [[User:Jlo/watchdog|hardware watchdog]]&lt;br /&gt;
*    deploy [[User:Jlo/network|network drivers]] (eth, usb-eth, wlan, 3g, lte)&lt;br /&gt;
*    deploy [[User:Jlo/usb|USB drivers]]&lt;br /&gt;
*    rewrite [[User:Jlo/init|init scripts]]&lt;br /&gt;
*    prepare a [[User:Jlo/image|custom image]] with every needed packages locally present in disk repo&lt;br /&gt;
*    adapt [[User:Jlo/packages|custom packages]] from deb to apk ones&lt;br /&gt;
&lt;br /&gt;
To configure a box is done in two parts:&lt;br /&gt;
&lt;br /&gt;
*    the network. done locally&lt;br /&gt;
*    the app layer. done via a webinterface; commited to a server and download by the box at each boot.&lt;br /&gt;
&lt;br /&gt;
The advantages of such architecture are:&lt;br /&gt;
&lt;br /&gt;
* power failure resilient as the system runs from ram&amp;lt;br/&amp;gt;The only PoF here is when an upgrade of the read-only medium is done&lt;br /&gt;
* boxes use a pull mechanism to stay up-to-date ensuring the right version at any next reboot&amp;lt;br/&amp;gt;This protect us against out-of-sync boxes arraising often with push architecture (salt, ansible, ...)&lt;br /&gt;
* the two steps boot sequence allows us to temporary take control over a box for maintenance with a totally different setup&amp;lt;br/&amp;gt;and as we always keep an ssh access via the VPN, we can force that anytime we want (hardware watchdog being our friend here)&lt;br /&gt;
* easy to reproduce in VM for testing (including load tests)&lt;br /&gt;
&lt;br /&gt;
Disadvantages are:&lt;br /&gt;
&lt;br /&gt;
* need own repo with access control to distribute Oracle Java internally without breach of license&amp;lt;br/&amp;gt;(but it is the same situation for any distro)&lt;br /&gt;
* some used packages are distributed as deb only (from artifactory between others)&amp;lt;br/&amp;gt;will need to script part of the CI towards apk generation...&amp;lt;br/&amp;gt;will need to check every deb to see if sources are available...&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo&amp;diff=13614</id>
		<title>User:Jlo</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo&amp;diff=13614"/>
		<updated>2017-06-10T10:27:34Z</updated>

		<summary type="html">&lt;p&gt;Jlo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I was [[User:Jch]] but I forgot my passwd and the email used to suscribe is not valid anymore...&lt;br /&gt;
&lt;br /&gt;
I&#039;m today senior system architect at some startup.&amp;lt;br/&amp;gt;&lt;br /&gt;
We are building a network of embedded devices controlling hardware stuff.&amp;lt;br/&amp;gt;&lt;br /&gt;
I&#039;m stepping it as the product is transitioning from prototype phase to industrial phase.&lt;br /&gt;
&lt;br /&gt;
The main app is written for Oracle Java8 and running in Apache/Karaf environment.&lt;br /&gt;
&lt;br /&gt;
The proto was done with Debian boxes managed with salt stack (about 100 of those with a mix of Wheezy and Jessie).&lt;br /&gt;
&lt;br /&gt;
I would like to see the boxes running AL in &#039;&#039;run-from-ram&#039;&#039; mode pulling the apkovl tarball (or at least some tarball to be applied in the /etc/local.d sequence) from a remote server somewhere in the cloud.&amp;lt;br/&amp;gt;&lt;br /&gt;
To upgrade would just to rsync the normally read-only SSD and reboot.&lt;br /&gt;
&lt;br /&gt;
To achieve this with AlpineLinux, one has to:&lt;br /&gt;
&lt;br /&gt;
*    deploy [[User:Jlo/java7|Oracle Java 7 with glibc]]&lt;br /&gt;
*    deploy [[User:Jlo/java8|Oracle Java 8 with glibc]]&lt;br /&gt;
*    deploy [[User:Jlo/python27|python2.7 with needed libs]]&lt;br /&gt;
*    deploy [[User:Jlo/watchdog|hardware watchdog]]&lt;br /&gt;
*    deploy [[User:Jlo/network|network drivers]] (eth, usb-eth, wlan, 3g, lte)&lt;br /&gt;
*    deploy [[User:Jlo/usb|USB drivers]]&lt;br /&gt;
*    rewrite [[User:Jlo/init|init scripts]]&lt;br /&gt;
*    prepare a [[User:Jlo/image|custom image]] with every needed packages locally present in disk repo&lt;br /&gt;
*    adapt [[User:Jlo/packages|custom packages]] from deb to apk ones&lt;br /&gt;
&lt;br /&gt;
To configure a box is done in two parts:&lt;br /&gt;
&lt;br /&gt;
*    the network. done locally&lt;br /&gt;
*    the app layer. done via a webinterface; commited to a server and download by the box at each boot.&lt;br /&gt;
&lt;br /&gt;
The advantage of such architecture are:&lt;br /&gt;
&lt;br /&gt;
* power failure resilient as the system runs from ram&amp;lt;br/&amp;gt;The only PoF here is when an upgrade of the read-only medium is done&lt;br /&gt;
* boxes use a pull mechanism to stay up-to-date ensuring the right version at any next reboot&amp;lt;br/&amp;gt;This protect us against out-of-sync boxes arraising often with push architecture (salt, ansible, ...)&lt;br /&gt;
* the two steps boot sequence allows us to temporary take control over a box for maintenance with a totally different setup&amp;lt;br/&amp;gt;and as we always keep an ssh access via the VPN, we can force that anytime we want (hardware watchdog being our friend here)&lt;br /&gt;
* easy to reproduce in VM for testing (including load tests)&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User_talk:Jlo&amp;diff=13613</id>
		<title>User talk:Jlo</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User_talk:Jlo&amp;diff=13613"/>
		<updated>2017-06-10T09:51:06Z</updated>

		<summary type="html">&lt;p&gt;Jlo: Created page with &amp;quot; == Oracle Java ==  Let&amp;#039;s adapt one (or more) famous docker files (credit to https://hub.docker.com/r/anapsix/alpine-java/)  &amp;lt;pre&amp;gt; apk --update add curl ca-certificates tar cu...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Oracle Java ==&lt;br /&gt;
&lt;br /&gt;
Let&#039;s adapt one (or more) famous docker files&lt;br /&gt;
(credit to https://hub.docker.com/r/anapsix/alpine-java/)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apk --update add curl ca-certificates tar&lt;br /&gt;
curl -Ls https://circle-artifacts.com/gh/andyshinn/alpine-pkg-glibc/6/artifacts/0/home/ubuntu/alpine-pkg-glibc/packages/x86_64/glibc-2.21-r2.apk &amp;gt; /tmp/glibc-2.21-r2.apk&lt;br /&gt;
apk add --allow-untrusted /tmp/glibc-2.21-r2.apk&lt;br /&gt;
&lt;br /&gt;
# Java Version&lt;br /&gt;
ENV JAVA_VERSION_MAJOR 8&lt;br /&gt;
ENV JAVA_VERSION_MINOR 45&lt;br /&gt;
ENV JAVA_VERSION_BUILD 14&lt;br /&gt;
ENV JAVA_PACKAGE       jdk&lt;br /&gt;
&lt;br /&gt;
# Download and unarchive Java&lt;br /&gt;
mkdir /opt&lt;br /&gt;
curl -jksSLH &amp;quot;Cookie: oraclelicense=accept-securebackup-cookie&amp;quot;\&lt;br /&gt;
  http://download.oracle.com/otn-pub/java/jdk/${JAVA_VERSION_MAJOR}u${JAVA_VERSION_MINOR}-b${JAVA_VERSION_BUILD}/${JAVA_PACKAGE}-${JAVA_VERSION_MAJOR}u${JAVA_VERSION_MINOR}-linux-x64.tar.gz \&lt;br /&gt;
    | tar -xzf - -C /opt&lt;br /&gt;
ln -s /opt/jdk1.${JAVA_VERSION_MAJOR}.0_${JAVA_VERSION_MINOR} /opt/jdk &lt;br /&gt;
rm -rf /opt/jdk/*src.zip \&lt;br /&gt;
           /opt/jdk/lib/missioncontrol \&lt;br /&gt;
           /opt/jdk/lib/visualvm \&lt;br /&gt;
           /opt/jdk/lib/*javafx* \&lt;br /&gt;
           /opt/jdk/jre/lib/plugin.jar \&lt;br /&gt;
           /opt/jdk/jre/lib/ext/jfxrt.jar \&lt;br /&gt;
           /opt/jdk/jre/bin/javaws \&lt;br /&gt;
           /opt/jdk/jre/lib/javaws.jar \&lt;br /&gt;
           /opt/jdk/jre/lib/desktop \&lt;br /&gt;
           /opt/jdk/jre/plugin \&lt;br /&gt;
           /opt/jdk/jre/lib/deploy* \&lt;br /&gt;
           /opt/jdk/jre/lib/*javafx* \&lt;br /&gt;
           /opt/jdk/jre/lib/*jfx* \&lt;br /&gt;
           /opt/jdk/jre/lib/amd64/libdecora_sse.so \&lt;br /&gt;
           /opt/jdk/jre/lib/amd64/libprism_*.so \&lt;br /&gt;
           /opt/jdk/jre/lib/amd64/libfxplugins.so \&lt;br /&gt;
           /opt/jdk/jre/lib/amd64/libglass.so \&lt;br /&gt;
           /opt/jdk/jre/lib/amd64/libgstreamer-lite.so \&lt;br /&gt;
           /opt/jdk/jre/lib/amd64/libjavafx*.so \&lt;br /&gt;
           /opt/jdk/jre/lib/amd64/libjfx*.so&lt;br /&gt;
&lt;br /&gt;
# Set environment&lt;br /&gt;
ENV JAVA_HOME /opt/jdk&lt;br /&gt;
ENV PATH ${PATH}:${JAVA_HOME}/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Other sources===&lt;br /&gt;
&lt;br /&gt;
https://blogs.oracle.com/developers/official-docker-image-for-oracle-java-and-the-openjdk-roadmap-for-containers&lt;br /&gt;
https://wiki.alpinelinux.org/wiki/Installing_Oracle_Java&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo&amp;diff=13612</id>
		<title>User:Jlo</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo&amp;diff=13612"/>
		<updated>2017-06-10T09:11:41Z</updated>

		<summary type="html">&lt;p&gt;Jlo: add links to future studies&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I was [[User:Jch]] but I forgot my passwd and the email used to suscribe is not valid anymore...&lt;br /&gt;
&lt;br /&gt;
I&#039;m today senior system architect at some startup.&amp;lt;br/&amp;gt;&lt;br /&gt;
We are building a network of embedded devices controlling hardware stuff.&amp;lt;br/&amp;gt;&lt;br /&gt;
I&#039;m stepping it as the product is transitioning from prototype phase to industrial phase.&lt;br /&gt;
&lt;br /&gt;
The main app is written for Oracle Java8 and running in Apache/Karaf environment.&lt;br /&gt;
&lt;br /&gt;
The proto was done with Debian boxes managed with salt stack (about 100 of those with a mix of Wheezy and Jessie).&lt;br /&gt;
&lt;br /&gt;
I would like to see the boxes running AL in &#039;&#039;run-from-ram&#039;&#039; mode pulling the apkovl tarball (or at least some tarball to be applied in the /etc/local.d sequence) from a remote server somewhere in the cloud.&amp;lt;br/&amp;gt;&lt;br /&gt;
To upgrade would just to rsync the normally read-only SSD and reboot.&lt;br /&gt;
&lt;br /&gt;
To achieve this with AlpineLinux, one has to:&lt;br /&gt;
&lt;br /&gt;
*    deploy [[User:Jlo/java7|Oracle Java 7 with glibc]]&lt;br /&gt;
*    deploy [[User:Jlo/java8|Oracle Java 8 with glibc]]&lt;br /&gt;
*    deploy [[User:Jlo/python27|python2.7 with needed libs]]&lt;br /&gt;
*    deploy [[User:Jlo/watchdog|hardware watchdog]]&lt;br /&gt;
*    deploy [[User:Jlo/network|network drivers]] (eth, usb-eth, wlan, 3g, lte)&lt;br /&gt;
*    deploy [[User:Jlo/usb|USB drivers]]&lt;br /&gt;
*    rewrite [[User:Jlo/init|init scripts]]&lt;br /&gt;
*    prepare a [[User:Jlo/image|custom image]] with every needed packages locally present in disk repo&lt;br /&gt;
*    adapt [[User:Jlo/packages|custom packages]] from deb to apk ones&lt;br /&gt;
&lt;br /&gt;
To configure a box is done in two parts:&lt;br /&gt;
&lt;br /&gt;
*    the network. done locally&lt;br /&gt;
*    the app layer. done via a webinterface; commited to a server and download by the box at each boot.&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo&amp;diff=13611</id>
		<title>User:Jlo</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo&amp;diff=13611"/>
		<updated>2017-06-10T07:45:56Z</updated>

		<summary type="html">&lt;p&gt;Jlo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I was [[User:Jch]] but I forgot my passwd and the email used to suscribe is not valid anymore...&lt;br /&gt;
&lt;br /&gt;
I&#039;m today senior system architect at some startup.&amp;lt;br/&amp;gt;&lt;br /&gt;
We are building a network of embedded devices controlling hardware stuff.&amp;lt;br/&amp;gt;&lt;br /&gt;
I&#039;m stepping it as the product is transitioning from prototype phase to industrial phase.&lt;br /&gt;
&lt;br /&gt;
The main app is written for Oracle Java8 and running in Apache/Karaf environment.&lt;br /&gt;
&lt;br /&gt;
The proto was done with Debian boxes managed with salt stack (about 100 of those with a mix of Wheezy and Jessie).&lt;br /&gt;
&lt;br /&gt;
I would like to see the boxes running AL in &#039;&#039;run-from-ram&#039;&#039; mode pulling the apkovl tarball (or at least some tarball to be applied in the /etc/local.d sequence) from a remote server somewhere in the cloud.&amp;lt;br/&amp;gt;&lt;br /&gt;
To upgrade would just to rsync the normally read-only SSD and reboot.&lt;br /&gt;
&lt;br /&gt;
To achieve this with AlpineLinux, one has to:&lt;br /&gt;
&lt;br /&gt;
*    deploy Oracle Java 7 with glibc&lt;br /&gt;
*    deploy Oracle Java 8 with glibc&lt;br /&gt;
*    deploy python2.7 with needed libs&lt;br /&gt;
*    deploy hardware watchdog&lt;br /&gt;
*    deploy network drivers (eth, usb-eth, wlan, 3g, lte)&lt;br /&gt;
*    deploy USB drivers&lt;br /&gt;
*    rewrite init scripts&lt;br /&gt;
*    prepare a custom image with every needed packages locally present in disk repo&lt;br /&gt;
*    adapt custom deb packages to apk ones&lt;br /&gt;
&lt;br /&gt;
To configure a box is done in two parts:&lt;br /&gt;
&lt;br /&gt;
*    the network. done locally&lt;br /&gt;
*    the app layer. done via a webinterface; commited to a server and download by the box at each boot.&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jlo&amp;diff=13607</id>
		<title>User:Jlo</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jlo&amp;diff=13607"/>
		<updated>2017-06-09T14:33:53Z</updated>

		<summary type="html">&lt;p&gt;Jlo: Created page with &amp;quot;I was User:Jch but I forgot my passwd and the email used to suscribe is not valid anymore...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I was [[User:Jch]] but I forgot my passwd and the email used to suscribe is not valid anymore...&lt;/div&gt;</summary>
		<author><name>Jlo</name></author>
	</entry>
</feed>