<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://mbj3.dev/feed.xml" rel="self" type="application/atom+xml" /><link href="https://mbj3.dev/" rel="alternate" type="text/html" /><updated>2025-08-07T21:47:57-04:00</updated><id>https://mbj3.dev/feed.xml</id><title type="html">Graybeard in Training</title><subtitle>a site for blogging, software, and networking topics</subtitle><author><name>Logan Blyth</name></author><entry><title type="html">Getting dtbs_check Working</title><link href="https://mbj3.dev/blog/Device-Tree/" rel="alternate" type="text/html" title="Getting dtbs_check Working" /><published>2024-06-05T00:00:00-04:00</published><updated>2024-06-05T00:00:00-04:00</updated><id>https://mbj3.dev/blog/Device-Tree</id><content type="html" xml:base="https://mbj3.dev/blog/Device-Tree/"><![CDATA[<h1 id="just-a-quick-note-for-myself">Just a Quick Note for Myself</h1>
<p>I have off and on been working on getting a device tree files submitted for a Solid Run board that I own. I would like to have an easier time running OpenWrt on the board. Uptreaming for the win.</p>

<p>I had a <a href="https://lore.kernel.org/linux-devicetree/ef8eec8a-2ce5-ad1a-afcf-86ee78231017@kernel.org/">well short attempt</a> to add the device tree file as it came from Solid Run. So after working out the small naming problems I decided I want to try to use the <code class="language-plaintext highlighter-rouge">dtbs_check</code> functionality in the kernel makefile. In case I don’t get this merged upstream I want to document how to get this check running:</p>

<ol>
  <li>Get the kernel source tree</li>
  <li><code class="language-plaintext highlighter-rouge">make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 KBUILD_OUTPUT=out/ defconfig</code></li>
  <li><code class="language-plaintext highlighter-rouge">make CHECK_DTBS=y marvell/cn9130-cf-pro.dtb</code></li>
</ol>

<h1 id="links-for-later">Links for later</h1>
<ul>
  <li><a href="https://devicetree-specification.readthedocs.io/en/latest/chapter2-devicetree-basics.html#generic-names-recommendation">Devicetree names</a></li>
  <li><a href="https://www.linaro.org/blog/tips-and-tricks-for-validating-devicetree-sources-with-the-devicetree-schema/">Linaro Blog</a></li>
</ul>]]></content><author><name>Logan Blyth</name></author><category term="Blog" /><category term="Kernel Builds" /><category term="Embedded" /><category term="Device Tree" /><category term="Cross Compile" /><summary type="html"><![CDATA[Just a Quick Note for Myself I have off and on been working on getting a device tree files submitted for a Solid Run board that I own. I would like to have an easier time running OpenWrt on the board. Uptreaming for the win.]]></summary></entry><entry><title type="html">Sorting Interfaces by Counters</title><link href="https://mbj3.dev/blog/Interface-Stats/" rel="alternate" type="text/html" title="Sorting Interfaces by Counters" /><published>2022-08-04T00:00:00-04:00</published><updated>2022-08-04T00:00:00-04:00</updated><id>https://mbj3.dev/blog/Interface-Stats</id><content type="html" xml:base="https://mbj3.dev/blog/Interface-Stats/"><![CDATA[<h1 id="interface-statistics">Interface Statistics</h1>
<p>When a linux system has many interfaces and you want to identify the interface with the highest packet or byte counters the <code class="language-plaintext highlighter-rouge">-s</code> and the <code class="language-plaintext highlighter-rouge">-j</code> flags  combined with the  <code class="language-plaintext highlighter-rouge">jq</code> utility will be of assitance.</p>

<p><code class="language-plaintext highlighter-rouge">ip -s -j link | jq 'max_by(.stats64.rx.bytes)'</code> this will show the pretty print of the jq output.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{
  "ifindex": 2,
  "ifname": "wlp1s0",
  "flags": [
    "BROADCAST",
    "MULTICAST",
    "UP",
    "LOWER_UP"
  ],
  "mtu": 1500,
  "qdisc": "noqueue",
  "operstate": "UP",
  "linkmode": "DORMANT",
  "group": "default",
  "txqlen": 1000,
  "link_type": "ether",
  "address": "ba:ba:ba:ba:ba:ba",
  "broadcast": "ff:ff:ff:ff:ff:ff",
  "stats64": {
    "rx": {
      "bytes": 1049995463,
      "packets": 819829,
      "errors": 0,
      "dropped": 10963,
      "over_errors": 0,
      "multicast": 0
    },
    "tx": {
      "bytes": 42628714,
      "packets": 200952,
      "errors": 0,
      "dropped": 0,
      "carrier_errors": 0,
      "collisions": 0
    }
  }
}
</code></pre></div></div>
<p>Instead of <code class="language-plaintext highlighter-rouge">stats64.rx.bytes</code> there is also <code class="language-plaintext highlighter-rouge">stats64.tx.packets</code> or a combination of the two.
A nice option to add to the <code class="language-plaintext highlighter-rouge">jq</code> output is <code class="language-plaintext highlighter-rouge">ip -s -j link | jq 'max_by(.stats64.rx.bytes).ifname'</code> which will slot it in nicely to a script.</p>

<p>Also notable is the <code class="language-plaintext highlighter-rouge">sort_by</code> function of <code class="language-plaintext highlighter-rouge">jq</code>, <code class="language-plaintext highlighter-rouge">ip -s -j link | jq 'sort_by(.stats64.rx.bytes)[-3:]</code> which will give us the NICS with the top 3 highest counters.</p>

<p>A colleague pointed out to me that this is a static view of the counters and there could be an active NIC with incrementing counters that hasn’t surpassed the highest NIC on the system.</p>]]></content><author><name>Logan Blyth</name></author><category term="Blog" /><category term="System Administration" /><category term="Networking" /><category term="one-liner" /><category term="iproute2" /><category term="jq" /><summary type="html"><![CDATA[Interface Statistics When a linux system has many interfaces and you want to identify the interface with the highest packet or byte counters the -s and the -j flags combined with the jq utility will be of assitance.]]></summary></entry><entry><title type="html">Automated Install with Debian Preseed</title><link href="https://mbj3.dev/blog/Debian-Preseed/" rel="alternate" type="text/html" title="Automated Install with Debian Preseed" /><published>2019-05-27T00:00:00-04:00</published><updated>2019-05-27T00:00:00-04:00</updated><id>https://mbj3.dev/blog/Debian-Preseed</id><content type="html" xml:base="https://mbj3.dev/blog/Debian-Preseed/"><![CDATA[<h1 id="automated-install-with-debian-preseed">Automated Install with Debian Preseed</h1>

<h2 id="intro">Intro</h2>
<p>I recently made a Debian preseed file so that no questions would have to be answered during the installation. The configuration is simple, dhcp, sshd, all the files in one partition, and that partion uses all of the available disk space. This is useful if a pc comes from a manufacturer without an operating system. This iso would be useful for a pxe boot install as well, though it was a net install iso so the packages are pulled from the mirrors.</p>

<h2 id="preseedcfg">Preseed.cfg</h2>
<p>The Debian project has a great <a href="https://www.debian.org/releases/stable/i386/apbs01.html.en">wiki</a> on the preseed process and I will reproduce the commands I used here. The preseed file I created is based off <a href="http://www.debian.org/releases/stretch/example-preseed.txt">their sample.</a> The comments in this file do a good job describing what the options do, and offering guidance.</p>
<pre><code class="language-Bash">#### Contents of the preconfiguration file (for stretch)
### Localization
# Preseeding only locale sets language, country and locale.
d-i debian-installer/locale string en_US

# The values can also be preseeded individually for greater flexibility.
#d-i debian-installer/language string en
#d-i debian-installer/country string NL
#d-i debian-installer/locale string en_GB.UTF-8
# Optionally specify additional locales to be generated.
#d-i localechooser/supported-locales multiselect en_US.UTF-8, nl_NL.UTF-8

# Keyboard selection.
d-i keyboard-configuration/xkb-keymap select us
# d-i keyboard-configuration/toggle select No toggling

### Network configuration
# Disable network configuration entirely. This is useful for cdrom
# installations on non-networked devices where the network questions,
# warning and long timeouts are a nuisance.
#d-i netcfg/enable boolean false

# netcfg will choose an interface that has link if possible. This makes it
# skip displaying a list if there is more than one interface.
d-i netcfg/choose_interface select auto

# To pick a particular interface instead:
#d-i netcfg/choose_interface select eth1

# To set a different link detection timeout (default is 3 seconds).
# Values are interpreted as seconds.
#d-i netcfg/link_wait_timeout string 10

# If you have a slow dhcp server and the installer times out waiting for
# it, this might be useful.
d-i netcfg/dhcp_timeout string 30
#d-i netcfg/dhcpv6_timeout string 60

# If you prefer to configure the network manually, uncomment this line and
# the static network configuration below.
#d-i netcfg/disable_autoconfig boolean true

# If you want the preconfiguration file to work on systems both with and
# without a dhcp server, uncomment these lines and the static network
# configuration below.
#d-i netcfg/dhcp_failed note
#d-i netcfg/dhcp_options select Configure network manually

# Static network configuration.
#
# IPv4 example
#d-i netcfg/get_ipaddress string 192.168.1.42
#d-i netcfg/get_netmask string 255.255.255.0
#d-i netcfg/get_gateway string 192.168.1.1
#d-i netcfg/get_nameservers string 192.168.1.1
#d-i netcfg/confirm_static boolean true
#
# IPv6 example
#d-i netcfg/get_ipaddress string fc00::2
#d-i netcfg/get_netmask string ffff:ffff:ffff:ffff::
#d-i netcfg/get_gateway string fc00::1
#d-i netcfg/get_nameservers string fc00::1
#d-i netcfg/confirm_static boolean true

# Any hostname and domain names assigned from dhcp take precedence over
# values set here. However, setting the values still prevents the questions
# from being shown, even if values come from dhcp.
d-i netcfg/get_hostname string unassigned-hostname
d-i netcfg/get_domain string unassigned-domain

# If you want to force a hostname, regardless of what either the DHCP
# server returns or what the reverse DNS entry for the IP is, uncomment
# and adjust the following line.
#d-i netcfg/hostname string somehost

# Disable that annoying WEP key dialog.
#d-i netcfg/wireless_wep string
# The wacky dhcp hostname that some ISPs use as a password of sorts.
#d-i netcfg/dhcp_hostname string radish

# If non-free firmware is needed for the network or other hardware, you can
# configure the installer to always try to load it, without prompting. Or
# change to false to disable asking.
d-i hw-detect/load_firmware boolean true

### Network console
# Use the following settings if you wish to make use of the network-console
# component for remote installation over SSH. This only makes sense if you
# intend to perform the remainder of the installation manually.
#d-i anna/choose_modules string network-console
#d-i network-console/authorized_keys_url string http://10.0.0.1/openssh-key
#d-i network-console/password password r00tme
#d-i network-console/password-again password r00tme

### Mirror settings
# If you select ftp, the mirror/country string does not need to be set.
#d-i mirror/protocol string ftp
d-i mirror/country string manual
d-i mirror/http/hostname string http.us.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string

# Suite to install.
#d-i mirror/suite string testing
# Suite to use for loading installer components (optional).
#d-i mirror/udeb/suite string testing

### Account setup
# Skip creation of a root account (normal user account will be able to
# use sudo).
d-i passwd/root-login boolean false
# Alternatively, to skip creation of a normal user account.
#d-i passwd/make-user boolean false

# Root password, either in clear text
#d-i passwd/root-password password r00tme
#d-i passwd/root-password-again password r00tme
# or encrypted using a crypt(3)  hash.
#d-i passwd/root-password-crypted password [crypt(3) hash]

# To create a normal user account.
d-i passwd/user-fullname string Debian User
d-i passwd/username string user
# Normal user's password, either in clear text
#d-i passwd/user-password password insecure
#d-i passwd/user-password-again password insecure
# or encrypted using a crypt(3) hash.
d-i passwd/user-password-crypted password $6$Pbb.p.dmhJ4t$/u5DLdgM9jiSqHh.cHj5ZalEzKO9CUfsu50669GNqPnrHwzpO5auEdb2i93JcsqCj/rU6BLG1T5znG8Artm6C.
# Create the first user with the specified UID instead of the default.
#d-i passwd/user-uid string 1010

# The user account will be added to some standard initial groups. To
# override that, use this.
#d-i passwd/user-default-groups string audio cdrom video

### Clock and time zone setup
# Controls whether or not the hardware clock is set to UTC.
d-i clock-setup/utc boolean true

# You may set this to any valid setting for $TZ; see the contents of
# /usr/share/zoneinfo/ for valid values.
d-i time/zone string US/Central

# Controls whether to use NTP to set the clock during the install
d-i clock-setup/ntp boolean true
# NTP server to use. The default is almost always fine here.
#d-i clock-setup/ntp-server string ntp.example.com

### Partitioning
## Partitioning example
# If the system has free space you can choose to only partition that space.
# This is only honoured if partman-auto/method (below) is not set.
#d-i partman-auto/init_automatically_partition select biggest_free

# Alternatively, you may specify a disk to partition. If the system has only
# one disk the installer will default to using that, but otherwise the device
# name must be given in traditional, non-devfs format (so e.g. /dev/sda
# and not e.g. /dev/discs/disc0/disc).
# For example, to use the first SCSI/SATA hard disk:
#d-i partman-auto/disk string /dev/sda
# In addition, you'll need to specify the method to use.
# The presently available methods are:
# - regular: use the usual partition types for your architecture
# - lvm:     use LVM to partition the disk
# - crypto:  use LVM within an encrypted partition
d-i partman-auto/method string regular

# If one of the disks that are going to be automatically partitioned
# contains an old LVM configuration, the user will normally receive a
# warning. This can be preseeded away...
d-i partman-lvm/device_remove_lvm boolean true
# The same applies to pre-existing software RAID array:
d-i partman-md/device_remove_md boolean true
# And the same goes for the confirmation to write the lvm partitions.
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true

# You can choose one of the three predefined partitioning recipes:
# - atomic: all files in one partition
# - home:   separate /home partition
# - multi:  separate /home, /var, and /tmp partitions
d-i partman-auto/choose_recipe select atomic

# Or provide a recipe of your own...
# If you have a way to get a recipe file into the d-i environment, you can
# just point at it.
#d-i partman-auto/expert_recipe_file string /hd-media/recipe

# If not, you can put an entire recipe into the preconfiguration file in one
# (logical) line. This example creates a small /boot partition, suitable
# swap, and uses the rest of the space for the root partition:
#d-i partman-auto/expert_recipe string                         \
#      boot-root ::                                            \
#              40 50 100 ext3                                  \
#                      $primary{ } $bootable{ }                \
#                      method{ format } format{ }              \
#                      use_filesystem{ } filesystem{ ext3 }    \
#                      mountpoint{ /boot }                     \
#              .                                               \
#              500 10000 1000000000 ext3                       \
#                      method{ format } format{ }              \
#                      use_filesystem{ } filesystem{ ext3 }    \
#                      mountpoint{ / }                         \
#              .                                               \
#              64 512 300% linux-swap                          \
#                      method{ swap } format{ }                \
#              .

# The full recipe format is documented in the file partman-auto-recipe.txt
# included in the 'debian-installer' package or available from D-I source
# repository. This also documents how to specify settings such as file
# system labels, volume group names and which physical devices to include
# in a volume group.

# This makes partman automatically partition without confirmation, provided
# that you told it what to do using one of the methods above.
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true

# When disk encryption is enabled, skip wiping the partitions beforehand.
#d-i partman-auto-crypto/erase_disks boolean false

## Partitioning using RAID
# The method should be set to "raid".
#d-i partman-auto/method string raid
# Specify the disks to be partitioned. They will all get the same layout,
# so this will only work if the disks are the same size.
#d-i partman-auto/disk string /dev/sda /dev/sdb

# Next you need to specify the physical partitions that will be used. 
#d-i partman-auto/expert_recipe string \
#      multiraid ::                                         \
#              1000 5000 4000 raid                          \
#                      $primary{ } method{ raid }           \
#              .                                            \
#              64 512 300% raid                             \
#                      method{ raid }                       \
#              .                                            \
#              500 10000 1000000000 raid                    \
#                      method{ raid }                       \
#              .

# Last you need to specify how the previously defined partitions will be
# used in the RAID setup. Remember to use the correct partition numbers
# for logical partitions. RAID levels 0, 1, 5, 6 and 10 are supported;
# devices are separated using "#".
# Parameters are:
# &lt;raidtype&gt; &lt;devcount&gt; &lt;sparecount&gt; &lt;fstype&gt; &lt;mountpoint&gt; \
#          &lt;devices&gt; &lt;sparedevices&gt;

#d-i partman-auto-raid/recipe string \
#    1 2 0 ext3 /                    \
#          /dev/sda1#/dev/sdb1       \
#    .                               \
#    1 2 0 swap -                    \
#          /dev/sda5#/dev/sdb5       \
#    .                               \
#    0 2 0 ext3 /home                \
#          /dev/sda6#/dev/sdb6       \
#    .

# For additional information see the file partman-auto-raid-recipe.txt
# included in the 'debian-installer' package or available from D-I source
# repository.

# This makes partman automatically partition without confirmation.
d-i partman-md/confirm boolean true
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true

## Controlling how partitions are mounted
# The default is to mount by UUID, but you can also choose "traditional" to
# use traditional device names, or "label" to try filesystem labels before
# falling back to UUIDs.
d-i partman/mount_style select uuid

### Base system installation
# Configure APT to not install recommended packages by default. Use of this
# option can result in an incomplete system and should only be used by very
# experienced users.
#d-i base-installer/install-recommends boolean false

# The kernel image (meta) package to be installed; "none" can be used if no
# kernel is to be installed.
#d-i base-installer/kernel/image string linux-image-686

### Apt setup
# You can choose to install non-free and contrib software.
#d-i apt-setup/non-free boolean true
#d-i apt-setup/contrib boolean true
# Uncomment this if you don't want to use a network mirror.
#d-i apt-setup/use_mirror boolean true
# Select which update services to use; define the mirrors to be used.
# Values shown below are the normal defaults.
d-i apt-setup/services-select multiselect security, updates
d-i apt-setup/security_host string security.debian.org

# Don't Scan DVD/netinst image
d-i apt-setup/cdrom/set-first boolean false
d-i apt-setup/cdrom/set-next boolean false
d-i apt-setup/cdrom/set-failed boolean false

# Additional repositories, local[0-9] available
#d-i apt-setup/local0/repository string \
#       http://local.server/debian stable main
#d-i apt-setup/local0/comment string local server
# Enable deb-src lines
#d-i apt-setup/local0/source boolean true
# URL to the public key of the local repository; you must provide a key or
# apt will complain about the unauthenticated repository and so the
# sources.list line will be left commented out
#d-i apt-setup/local0/key string http://local.server/key

# By default the installer requires that repositories be authenticated
# using a known gpg key. This setting can be used to disable that
# authentication. Warning: Insecure, not recommended.
#d-i debian-installer/allow_unauthenticated boolean true

# Uncomment this to add multiarch configuration for i386
#d-i apt-setup/multiarch string i386


### Package selection
tasksel tasksel/first multiselect standard, ssh-server

# Individual additional packages to install
#d-i pkgsel/include string openssh-server 
# Whether to upgrade packages after debootstrap.
# Allowed values: none, safe-upgrade, full-upgrade
d-i pkgsel/upgrade select safe-upgrade

# Some versions of the installer can report back on what software you have
# installed, and what software you use. The default is not to report back,
# but sending reports helps the project determine what software is most
# popular and include it on CDs.
popularity-contest popularity-contest/participate boolean false

### Boot loader installation
# Grub is the default boot loader (for x86). If you want lilo installed
# instead, uncomment this:
#d-i grub-installer/skip boolean true
# To also skip installing lilo, and install no bootloader, uncomment this
# too:
#d-i lilo-installer/skip boolean true


# This is fairly safe to set, it makes grub install automatically to the MBR
# if no other operating system is detected on the machine.
d-i grub-installer/only_debian boolean true

# This one makes grub-installer install to the MBR if it also finds some other
# OS, which is less safe as it might not be able to boot that other OS.
d-i grub-installer/with_other_os boolean true

# Due notably to potential USB sticks, the location of the MBR can not be
# determined safely in general, so this needs to be specified:
#d-i grub-installer/bootdev  string /dev/sda
# To install to the first device (assuming it is not a USB stick):
d-i grub-installer/bootdev  string default

# Alternatively, if you want to install to a location other than the mbr,
# uncomment and edit these lines:
#d-i grub-installer/only_debian boolean false
#d-i grub-installer/with_other_os boolean false
#d-i grub-installer/bootdev  string (hd0,1)
# To install grub to multiple disks:
#d-i grub-installer/bootdev  string (hd0,1) (hd1,1) (hd2,1)

# Optional password for grub, either in clear text
#d-i grub-installer/password password r00tme
#d-i grub-installer/password-again password r00tme
# or encrypted using an MD5 hash, see grub-md5-crypt(8).
#d-i grub-installer/password-crypted password [MD5 hash]

# Use the following option to add additional boot parameters for the
# installed system (if supported by the bootloader installer).
# Note: options passed to the installer will be added automatically.
#d-i debian-installer/add-kernel-opts string nousb

### Finishing up the installation
# During installations from serial console, the regular virtual consoles
# (VT1-VT6) are normally disabled in /etc/inittab. Uncomment the next
# line to prevent this.
#d-i finish-install/keep-consoles boolean true

# Avoid that last message about the install being complete.
d-i finish-install/reboot_in_progress note

# This will prevent the installer from ejecting the CD during the reboot,
# which is useful in some situations.
#d-i cdrom-detect/eject boolean false

# This is how to make the installer shutdown when finished, but not
# reboot into the installed system.
#d-i debian-installer/exit/halt boolean true
# This will power off the machine instead of just halting it.
#d-i debian-installer/exit/poweroff boolean true

### Preseeding other packages
# Depending on what software you choose to install, or if things go wrong
# during the installation process, it's possible that other questions may
# be asked. You can preseed those too, of course. To get a list of every
# possible question that could be asked during an install, do an
# installation, and then run these commands:
#   debconf-get-selections --installer &gt; file
#   debconf-get-selections &gt;&gt; file


#### Advanced options
### Running custom commands during the installation
# d-i preseeding is inherently not secure. Nothing in the installer checks
# for attempts at buffer overflows or other exploits of the values of a
# preconfiguration file like this one. Only use preconfiguration files from
# trusted locations! To drive that home, and because it's generally useful,
# here's a way to run any shell command you'd like inside the installer,
# automatically.

# This first command is run as early as possible, just after
# preseeding is read.
#d-i preseed/early_command string anna-install some-udeb
# This command is run immediately before the partitioner starts. It may be
# useful to apply dynamic partitioner preseeding that depends on the state
# of the disks (which may not be visible when preseed/early_command runs).
#d-i partman/early_command \
#       string debconf-set partman-auto/disk "$(list-devices disk | head -n1)"
# This command is run just before the install finishes, but when there is
# still a usable /target directory. You can chroot to /target and use it
# directly, or use the apt-install and in-target commands to easily install
# packages and run commands in the target system.
#d-i preseed/late_command string apt-install zsh; in-target chsh -s /bin/zsh
</code></pre>

<p>Most of this is straight forward, though there are a couple of gotchas that I had to deal with.</p>

<h3 id="scanning-for-another-cddvd">Scanning for another CD/DVD</h3>

<p>The Debian installer would ask if there was another CD/DVD to scan. Turning this off was not in the Debian docs, but thankfully <a href="https://unix.stackexchange.com/questions/409212/preseed-directive-to-skip-another-cd-dvd-scanning">stackoverflow</a> had the answer.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>d-i apt-setup/cdrom/set-first boolean false
d-i apt-setup/cdrom/set-next boolean false   
d-i apt-setup/cdrom/set-failed boolean false
</code></pre></div></div>
<h3 id="starting-the-text-installer">Starting the Text Installer</h3>

<p>Since I didn’t want to push any buttons after I booted from the usb media, I had to figure out how to launch the installer, thankfully the Debian docs had the answer <a href="https://www.debian.org/releases/stable/i386/apbs02.html.en">Section B.2.1</a> says to set <code class="language-plaintext highlighter-rouge">timeout to 1 in syslinux.cfg</code> which will automatically select the GUI install. The gui install wouldn’t continue on for me, I think the reason for that was that I needed to supply boot time parameters to select the localization. I didn’t want to fiddle with that. I tried the text based installer and it worked without having to supply any additional boot time arguments. So I set the default target in <code class="language-plaintext highlighter-rouge">isolinux.cfg</code> to be <code class="language-plaintext highlighter-rouge">install</code>. <code class="language-plaintext highlighter-rouge">install</code> is the label that is given to the text based installer in the file <code class="language-plaintext highlighter-rouge">txt.cfg</code>. My <code class="language-plaintext highlighter-rouge">isolinux.cfg</code> is below, the default is to launch the vesamenu.</p>
<pre><code class="language-Bash"># D-I config version 2.0
# search path for the c32 support libraries (libcom32, libutil etc.)
path
include menu.cfg
#default vesamenu.c32
default install
prompt 0
timeout 1
</code></pre>
<h2 id="creating-a-new-iso">Creating a new ISO</h2>
<p>There are a few ways to point the installer towards the preseed.cfg file. The best option for my use case was to re-spin the installer iso with the preseed.cfg inside the initrd. <a href="https://wiki.debian.org/DebianInstaller/Preseed/EditIso">Here are the instructions</a>. I installed the <code class="language-plaintext highlighter-rouge">udevil</code> utility and followed the instructions in the wiki page to mount the iso and extract the files to my working directory. My dev/test cycle was:</p>
<ol>
  <li>Make changes to my <code class="language-plaintext highlighter-rouge">preseed.cfg</code></li>
  <li>Add my new file to the initrd
    <pre><code class="language-Bash">chmod +w -R isofiles/install.386/
gunzip isofiles/install.386/initrd.gz
echo preseed.cfg | cpio -H newc -o -A -F isofiles/install.386/initrd
</code></pre>
  </li>
  <li>Re-compress the initrd
    <pre><code class="language-Bash">gzip isofiles/install.386/initrd
chmod -w -R isofiles/install.386/
</code></pre>
  </li>
  <li>Update the iso’s md5sum.txt
    <pre><code class="language-Bash"> # cd isofiles
 # md5sum `find -follow -type f` &gt; md5sum.txt
 # cd ..
</code></pre>
  </li>
  <li>Create the iso with my changes
    <pre><code class="language-Bash">genisoimage -r -J -b isolinux/isolinux.bin -c isolinux/boot.cat \                           
         -no-emul-boot -boot-load-size 4 -boot-info-table \                                          
         -o preseed-debian-9.3.0-i386-netinst.iso isofiles
</code></pre>
  </li>
  <li>Test by booting in KVM.</li>
</ol>

<p>You can leave the isofiles directory mounted while you are making changes, the <code class="language-plaintext highlighter-rouge">genisoimage</code> command will copy the files. Ultimately I only needed to add the preseed.cfg and change <code class="language-plaintext highlighter-rouge">/isolinux/isolinux.cfg</code> and I am now able to have an unattended isntall.</p>

<h2 id="conclusion">Conclusion</h2>
<p>This was a good exercies in some system administration tasks. The next step from here would be to make this preseed iso available via PXE so a blank system would automatically install without being booted from USB. I haven’t sorted out PXE with the new uefi based systems. So that is a topic for another time. There is a lot of discussion about using containers and serverless architectures, but there are still needs that are solved by a Linux appliance.</p>]]></content><author><name>Logan Blyth</name></author><category term="Blog" /><category term="System Administration" /><category term="Debian" /><category term="Install" /><summary type="html"><![CDATA[Automated Install with Debian Preseed]]></summary></entry><entry><title type="html">Packet Size Histograms with eBPF and XDP</title><link href="https://mbj3.dev/blog/eBPF-Packet-Histograms/" rel="alternate" type="text/html" title="Packet Size Histograms with eBPF and XDP" /><published>2018-12-01T00:00:00-05:00</published><updated>2018-12-01T00:00:00-05:00</updated><id>https://mbj3.dev/blog/eBPF-Packet-Histograms</id><content type="html" xml:base="https://mbj3.dev/blog/eBPF-Packet-Histograms/"><![CDATA[<h1 id="packet-histograms-with-ebpf-xdp">Packet Histograms with eBPF XDP</h1>

<h2 id="intro">Intro</h2>
<p>I have been reading a lot of articles about the eXpress Data Path(XDP) and I would like to learn my about it. I decided to write a program that will track the size of packets inbound to my NIC, and increment a counter for the corresponding “bin” size. I have my MTU set to 1500 and I not worried about packets that are smaller than 64 bytes.</p>

<h2 id="quick-intro-to-ebpf-and-xdp">Quick intro to eBPF and XDP</h2>
<p>eBPF is kind of like an in-kernel virtual machine. It allows a programmer to write code that the kernel will execute in kernel space at various hook-points in the kernel. There is a good FAQ of what eBPF is in the <a href="https://www.kernel.org/doc/html/latest/bpf/bpf_design_QA.html?highlight=bpf#bpf-design-q-a">kernel docs</a></p>
<h3 id="2-types-of-code-in-xdp-examples">2 Types of code in XDP examples</h3>

<p>I adapted my code from the <code class="language-plaintext highlighter-rouge">xdp1</code> example given in the kernel source located in the <code class="language-plaintext highlighter-rouge">samples/bpf</code>. That directory has C files named similarly, with the difference being the suffix, <code class="language-plaintext highlighter-rouge">_kern.c</code> and <code class="language-plaintext highlighter-rouge">_user.c</code>. The <code class="language-plaintext highlighter-rouge">_kern</code> code is the code that will be translated to the eBPF instructions then compiled to machine native code and executed in the kernel, the <code class="language-plaintext highlighter-rouge">_user</code> is code that is executed in user-space.</p>

<h2 id="xdp-code">XDP Code</h2>
<p>The code examples below utilize the API for XDP programs. From the FAQ above, we know that not all kernel code is available to XDP programs. The example kernel code does some simple math for the packet size and will atomically increment the appropriate counter. The counters are values in the eBPF maps. The user space program will read those counters from the map via file descriptors. Links to documentation are provided as comments to the code. The userspace code include code from <code class="language-plaintext highlighter-rouge">bpf_load.h</code> which assists in in communicating with the eBPF map.</p>
<h3 id="xdp-kernel-code">XDP Kernel Code</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/* Copyright (c) 2016 PLUMgrid
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of version 2 of the GNU General Public
 * License as published by the Free Software Foundation.
 */
#define KBUILD_MODNAME "foo"
#include &lt;uapi/linux/bpf.h&gt;
#include &lt;linux/in.h&gt;
#include &lt;linux/if_ether.h&gt;
#include &lt;linux/if_packet.h&gt;
#include &lt;linux/if_vlan.h&gt;
#include &lt;linux/ip.h&gt;
#include &lt;linux/ipv6.h&gt;
#include "bpf_helpers.h"

struct bpf_map_def SEC("maps") size_hist_map = {
	.type = BPF_MAP_TYPE_ARRAY,
	.key_size = sizeof(u32),
	.value_size = sizeof(u64),
	.max_entries = 5,
};


// Still looking for where this call is attached to in the networking stack
SEC("xdp1")
// xdp_md is documented in the kernel
// https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/bpf.h#L2416
int xdp_prog1(struct xdp_md *ctx)
{
	long* value;
	u32 len = ctx-&gt;data_end - ctx-&gt;data;
	u32 key = 0;
	if(len &gt;= 64 &amp;&amp; len &lt; 128){
		key = 0;
	}else if(len &gt;= 128 &amp;&amp; len &lt; 256){
		key = 1;
	}else if(len &gt;= 256 &amp;&amp; len &lt; 512){
		key = 2;
	}else if(len &gt;= 512 &amp;&amp; len &lt; 1024){
		key = 3;
	}else if(len &gt;= 1024 &amp;&amp; len &lt;=1500){
		key = 4;
	}
	value = bpf_map_lookup_elem(&amp;size_hist_map, &amp;key);
	if(value){
		// LLVM maps this to built-in bpf atomic add instructions,
		// BPF_STX | BPF_XADD | BPF_W for word sizes
		// according to https://cilium.readthedocs.io/en/latest/bpf/#llvm
		__sync_fetch_and_add(value,1);
	}
	return XDP_PASS;
}

char _license[] SEC("license") = "GPL";
</code></pre></div></div>

<h3 id="xdp-user-code">XDP User Code</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/* Copyright (c) 2016 PLUMgrid
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of version 2 of the GNU General Public
 * License as published by the Free Software Foundation.
 */
#include &lt;linux/bpf.h&gt;
#include &lt;linux/if_link.h&gt;
#include &lt;assert.h&gt;
#include &lt;errno.h&gt;
#include &lt;signal.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;
#include &lt;unistd.h&gt;
#include &lt;libgen.h&gt;
#include &lt;sys/resource.h&gt;

#include "bpf_util.h"
#include "bpf/bpf.h"
#include "bpf/libbpf.h"

static int ifindex;
static __u32 xdp_flags;

static void int_exit(int sig)
{
	bpf_set_link_xdp_fd(ifindex, -1, xdp_flags);
	exit(0);
}
char* str_arr[5] = {
	"64 - 127",
	"128 - 255",
	"256 - 511",
	"512 - 1023",
	"1024 - 1500"};
/* simple size counter
 */
static void poll_stats(int map_fd, int interval)
{
	const unsigned int nr_keys = 5;
	__u64 values[nr_keys];
	__u32 key;

	while (1) {
		sleep(interval);

		for (key = 0; key &lt; nr_keys; key++) {
			assert(bpf_map_lookup_elem(map_fd, &amp;key, (&amp;values[key])) == 0);
			printf("range %s: %10llu\n",str_arr[key],values[key]);
		}
	}
}

static void usage(const char *prog)
{
	fprintf(stderr,
		"usage: %s [OPTS] IFINDEX\n\n"
		"OPTS:\n"
		"    -S    use skb-mode\n"
		"    -N    enforce native mode\n",
		prog);
}

int main(int argc, char **argv)
{
	struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY};
    // This is an XDP program
	struct bpf_prog_load_attr prog_load_attr = {
		.prog_type	= BPF_PROG_TYPE_XDP,
	};
	const char *optstr = "SN";
	int prog_fd, map_fd, opt;
	struct bpf_object *obj;
	struct bpf_map *map;
	char filename[256];

	while ((opt = getopt(argc, argv, optstr)) != -1) {
		switch (opt) {
		case 'S':
			xdp_flags |= XDP_FLAGS_SKB_MODE;
			break;
		case 'N':
			xdp_flags |= XDP_FLAGS_DRV_MODE;
			break;
		default:
			usage(basename(argv[0]));
			return 1;
		}
	}

	if (optind == argc) {
		usage(basename(argv[0]));
		return 1;
	}

	if (setrlimit(RLIMIT_MEMLOCK, &amp;r)) {
		perror("setrlimit(RLIMIT_MEMLOCK)");
		return 1;
	}

	ifindex = strtoul(argv[optind], NULL, 0);

	/* argv[0] is the name of the executable, good way to find the object file */
	snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
	prog_load_attr.file = filename;

	if (bpf_prog_load_xattr(&amp;prog_load_attr, &amp;obj, &amp;prog_fd))
		return 1;

	map = bpf_map__next(NULL, obj);
	if (!map) {
		printf("finding a map in obj file failed\n");
		return 1;
	}
	map_fd = bpf_map__fd(map);

	if (!prog_fd) {
		printf("load_bpf_file: %s\n", strerror(errno));
		return 1;
	}

	signal(SIGINT, int_exit);
	signal(SIGTERM, int_exit);

    // this function is defined in bpf_load.c like all the user-space helpers
	if (bpf_set_link_xdp_fd(ifindex, prog_fd, xdp_flags) &lt; 0) {
		printf("link set xdp fd failed\n");
		return 1;
	}

	poll_stats(map_fd, 2);

	return 0;
}
</code></pre></div></div>

<h3 id="xdp-compile-and-running">XDP compile and running</h3>
<p>To compile the code, modify the Makefile in <code class="language-plaintext highlighter-rouge">samples/bpf</code> to include your <code class="language-plaintext highlighter-rouge">_kern.c</code> and your <code class="language-plaintext highlighter-rouge">_user.c</code> code. Grepping the Makefile shows the lines I had to add:</p>
<pre><code class="language-Makefile">hostprogs-y += xdp_count
xdp_count-objs := xdp_count_user.o
always += xdp_count_kern.o
</code></pre>
<p>Ensure that you follow the directions in the readme of the <code class="language-plaintext highlighter-rouge">samples/bpf</code> directory and run <code class="language-plaintext highlighter-rouge">make headers_install</code> at the top level of your kernel source directory before compile the samples directory.</p>
<h4 id="compile-errors">Compile Errors</h4>
<p>I did have some compile errors. The errors came from my <code class="language-plaintext highlighter-rouge">_kernel</code> code, googling did help, but the answers weren’t as easy to find. I ended up seeing the errors as github issues. It is possible that the bpftool could have been of help. My errors came from not using the correct map access function. The other xdp examples and the cillium docs helped.</p>

<h4 id="running">Running</h4>
<p>To run: <code class="language-plaintext highlighter-rouge">sudo ./xdp_count -S 3</code>. The <code class="language-plaintext highlighter-rouge">-S 3</code> tells the xdp program to use “skb” mode as opposed to a mode that is hardware accelerated. The ifindex of the NIC can be found using the <code class="language-plaintext highlighter-rouge">ip</code> command.</p>

<h3 id="output">Output</h3>
<p>This is the output when I am streaming music, the user-space program polls the map every two seconds:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>range 64 - 127:        506
range 128 - 255:         17
range 256 - 511:         17
range 512 - 1023:          0
range 1024 - 1500:          1
range 64 - 127:        511
range 128 - 255:         17
range 256 - 511:         20
range 512 - 1023:          0
range 1024 - 1500:          1
range 64 - 127:        516
range 128 - 255:         17
range 256 - 511:         20
range 512 - 1023:          0
range 1024 - 1500:          1
</code></pre></div></div>
<p>This is the output when I am watching an XDP related youtube video:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>range 64 - 127:         10
range 128 - 255:          6
range 256 - 511:          1
range 512 - 1023:          1
range 1024 - 1500:         79
range 64 - 127:         37
range 128 - 255:         11
range 256 - 511:          1
range 512 - 1023:          4
range 1024 - 1500:       1488
range 64 - 127:         57
range 128 - 255:         17
range 256 - 511:          2
range 512 - 1023:          6
range 1024 - 1500:       2454
</code></pre></div></div>
<p>It makes sense that the youtube video would have bigger packets than music streaming.</p>

<h2 id="xdp-attachment-point">XDP Attachment Point</h2>
<p>I am still searching for the attachment point of the XDP program. I read that the program executes when the packet “comes off the NIC” but I am trying to find where specifically.</p>

<h2 id="references-further-reading">References/ Further reading</h2>
<p>There are a lot of resources out there I will link to several that have helped me:</p>
<ul>
  <li><a href="https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/bpf.h">the elixir from bootlin</a></li>
  <li><a href="https://cilium.readthedocs.io/en/latest/bpf/">the cillium docs</a></li>
  <li><a href="https://prototype-kernel.readthedocs.io/en/latest/bpf/index.html">prototype-kernel docs</a></li>
  <li><a href="http://man7.org/linux/man-pages/man8/tc-bpf.8.html">the tc-bpf man page</a></li>
  <li><a href="https://github.com/iovisor/bpf-docs">the various presentations on the iovisor github</a></li>
</ul>]]></content><author><name>Logan Blyth</name></author><category term="Blog" /><category term="eBPF" /><category term="networking" /><category term="network visibility" /><summary type="html"><![CDATA[Packet Histograms with eBPF XDP]]></summary></entry><entry><title type="html">Using the Ceph libradosstriping API</title><link href="https://mbj3.dev/blog/Ceph-Stripe/" rel="alternate" type="text/html" title="Using the Ceph libradosstriping API" /><published>2017-05-28T00:00:00-04:00</published><updated>2017-05-28T00:00:00-04:00</updated><id>https://mbj3.dev/blog/Ceph-Stripe</id><content type="html" xml:base="https://mbj3.dev/blog/Ceph-Stripe/"><![CDATA[<h1 id="introduction">Introduction</h1>

<p>This article is going to discuss the libradosstriping API. Striping across objects is desireable as it spreads the IO load across different objects. Each object is mapped to a placement group, and each placement group maps to a set of OSDs. The end result is that each OSD is responsible for a smaller portion of the IO load. This is in contrast to writing <code class="language-plaintext highlighter-rouge">4MiB</code> to a single object, which is mapped to a single placement group which is mapped to <code class="language-plaintext highlighter-rouge">K + M</code> OSDs.  The Ceph docs have a <a href="http://docs.ceph.com/docs/master/architecture/#data-striping">good illustration</a> of this, so I won’t go over it here.</p>

<p>The libradosstriping API can be seen <a href="https://github.com/ceph/ceph/blob/master/src/include/radosstriper/libradosstriper.hpp">here</a>. For this article I am going to assume that you already have access to a cluster, and it has an erasure coded pool created. If you need steps on created an erasure coded pool, see <a href="http://docs.ceph.com/docs/master/rados/operations/pools/">here</a>.</p>

<p>To run the example code below you need to have the rados libraries installed, specifically <code class="language-plaintext highlighter-rouge">libradosstriper1-devel</code>. This article is using a Ceph Jewel (10.2.5) cluster, with 5 OSDs, and a pool with 256 placement groups.</p>

<h1 id="the-code">The Code</h1>

<p>The makefile:</p>

<script src="https://gist.github.com/f77291dad36fbf79691e0a9ba24a64aa.js"> </script>

<p>The source file:</p>

<script src="https://gist.github.com/8c95e3072e892195b3cf98f13155cdfc.js"> </script>

<h1 id="rados-cli">Rados CLI</h1>

<p>The Rados CLI has a <code class="language-plaintext highlighter-rouge">--striper</code> option. It can be used to cleanup the files you made with a simple <code class="language-plaintext highlighter-rouge">rados -p pool_name --striper rm obj_name</code>. Also, you can use the <code class="language-plaintext highlighter-rouge">ls</code> option to see the object you have put into Ceph. If the <code class="language-plaintext highlighter-rouge">--striper</code> option is not suppiled you can see all of the Ceph objects that the stripping API created. I have a feeling this will be usefule in the future when I am looking into the alignment details.</p>

<h1 id="commentary">Commentary</h1>

<p>I am still wrapping my head around the idea of <code class="language-plaintext highlighter-rouge">alignment</code> I know that it is realted to the erasure coding that is done on the pool, but I don’t know the factors that influence it. I will be digging into this in a future blog post. In my examples my alignment is <code class="language-plaintext highlighter-rouge">4128</code>. It seems that is not ideal as my object size is <code class="language-plaintext highlighter-rouge">4MiB</code>, so the values don’t divide evenly.</p>

<p>When I ran the example code and used <code class="language-plaintext highlighter-rouge">ceph -w</code>, I saw both read and write traffic reported, when I was only doing a write. I will be digging into the details of why libradosstriper does this.</p>

<p>I was happy to discover the <code class="language-plaintext highlighter-rouge">bl.read_file</code> method. That made this example code much cleaner, as I didn’t have to worry about reading the file, Ceph takes care of it for me! I have no idea how stable the buffer api is, but you can find it <a href="https://github.com/ceph/ceph/blob/master/src/common/buffer.cc#L2117">here</a></p>

<p>Since I am writing to an Erasure Coded pool and don’t have the EC overwrite turned on, I use the <code class="language-plaintext highlighter-rouge">write_full</code> call inside of libradosstriper.</p>

<h1 id="thanks">Thanks</h1>

<p>Thanks to James Norman for writing the <a href="https://blog.storagemadeeasy.com/writing-to-an-erasure-coded-pool-in-ceph-rados/">post</a> at the Storage Made Easy blog. The Alignment tip is excellent.</p>

<p>I would also like to thank <a href="https://gitlab.cern.ch/castor/CASTOR/blob/e3500a660f718d595cf2cbe7ccffa8a630e6b7b5/ceph/ceph_posix.cpp">CERN</a> for their source file that also uses the striping API, which helped me write this post.</p>]]></content><author><name>Logan Blyth</name></author><category term="Blog" /><category term="Ceph" /><category term="storage" /><category term="rados" /><summary type="html"><![CDATA[Introduction]]></summary></entry><entry><title type="html">Cjdns and Hyperboria</title><link href="https://mbj3.dev/blog/Cjdns-Hyperboria/" rel="alternate" type="text/html" title="Cjdns and Hyperboria" /><published>2015-07-07T00:00:00-04:00</published><updated>2015-07-07T00:00:00-04:00</updated><id>https://mbj3.dev/blog/Cjdns-Hyperboria</id><content type="html" xml:base="https://mbj3.dev/blog/Cjdns-Hyperboria/"><![CDATA[<h1 id="cjdns-up-and-running">Cjdns Up and Running</h1>
<p>Configuration is as simple as they say:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone https://github.com/cjdelisle/cjdns.git
<span class="nb">cd </span>cjdns
./cjdroute <span class="nt">--genconf</span> <span class="o">&gt;</span> cjdroute.conf
<span class="c"># find a peer, I used a public one</span>
<span class="c"># add a peer to the cjdroute.conf</span>
<span class="nb">sudo</span> ./cjdroute cjdroute.conf
</code></pre></div></div>

<p>To simply join the network you have to add a peer to the configuration file and
launch the daemon. If you have made an error in the configuration file, it won’t
be immediately obvious from the daemon, but the startup output will throw a
critical message. A handy debugging step is to generate a blank config and try
to launch the daemon with that. You should see a tun device show up in the “ip
addr show”</p>

<p>To become a part of then network (from your house) you would need to forward a port from your router (assuming you have one) to your machine on port given in the cjdroute.conf file.
The network is built around anonymity, so all packets are encrpyted.</p>

<h2 id="what-its-like-once-your-on-it">What its Like Once your On It</h2>
<p>The first thing I noticed is that there isn’t a DNS server per se. There is a
way to not have to type an entire IPv6 address into the url bar, but it can be
summarized as register with the guy who keeps track of this stuff.</p>

<h2 id="the-tun-device">The Tun device</h2>
<p>Cjdns creates a tun device for its network traffic. This is useful as code can
be written in user-space and not the kernel. The Tun device is given the ipv6
address.</p>

<h2 id="routing">Routing</h2>
<p>routing is complicated, I am still working on it, but it is similar to the old
ATM style of routing</p>

<h2 id="the-admin-interface">The Admin Interface</h2>
<p>Every instance of cjdns has an admin interface that provides statistics for your
node</p>

<h2 id="links">Links</h2>
<p><a href="https://wiki.projectmeshnet.org/Cjdns">wiki</a>
<a href="https://wiki.projectmeshnet.org/Cjdns_Troubleshooting">wiki-troubleshooting</a>
<a href="https://github.com/cjdelisle/cjdns/blob/master/doc/Whitepaper.md">cjdns-whitepaper</a></p>]]></content><author><name>Logan Blyth</name></author><category term="Blog" /><category term="Mesh Networking" /><summary type="html"><![CDATA[Cjdns Up and Running Configuration is as simple as they say:]]></summary></entry><entry><title type="html">BattleMesh v7</title><link href="https://mbj3.dev/blog/BattleMeshv7-Overview/" rel="alternate" type="text/html" title="BattleMesh v7" /><published>2015-06-17T00:00:00-04:00</published><updated>2015-06-17T00:00:00-04:00</updated><id>https://mbj3.dev/blog/BattleMeshv7-Overview</id><content type="html" xml:base="https://mbj3.dev/blog/BattleMeshv7-Overview/"><![CDATA[<h1 id="battle-mesh">Battle Mesh</h1>
<p>Sadly, it doesn’t look like the organizers posted any results from their
expirements. They have a <a href="https://github.com/battlemesh">github repository</a> and <a href="http://www.youtube.com/playlist?list=PLjdaTaDJvaVzotzdFSpblCVegRpHgGPLG">youtube playlist</a> of some of the talks given. <a href="www.ac.upc.edu">UPC</a> donated 20 <a href="www.wrtnode.com">WRTnodes</a> for the event. 
There were about 60 confirmed attendees to the event.</p>

<h2 id="what-they-actually-did">What they Actually Did</h2>
<p>As best I can tell they downloaded and ran the <a href="http://wiki.confine-project.eu/wibed:start">wibed</a> on their hardware. The stated goal was to “run different routing protocols…perform some tests and see which routing protocol behaves better”. Several of the participants were from the creators of the mesh protocols, I can only assume that they took the knowledge gained applied it to their codebases.</p>
<h2 id="what-to-look-for-in-v8">What to look for in v8</h2>
<p>Looks like more of the same, the venu will give options for indoor and outdoor
testing. There are 3 participants registered affiliated with cjdns It is taking place in Maribor, Slovenia.</p>

<h2 id="in-the-next-blog-post">In the next blog post</h2>
<p>A deep dive into cjdns. I will be running it on my wrtnode, laptop, and my old
router that is openwrt comaptible. Another possibility would be to use
containers on a local system.</p>]]></content><author><name>Logan Blyth</name></author><category term="Blog" /><category term="Mesh Networking" /><summary type="html"><![CDATA[Battle Mesh Sadly, it doesn’t look like the organizers posted any results from their expirements. They have a github repository and youtube playlist of some of the talks given. UPC donated 20 WRTnodes for the event. There were about 60 confirmed attendees to the event.]]></summary></entry><entry><title type="html">Mesh Networking Overview</title><link href="https://mbj3.dev/blog/Mesh-Networking-Overview/" rel="alternate" type="text/html" title="Mesh Networking Overview" /><published>2015-05-15T00:00:00-04:00</published><updated>2015-05-15T00:00:00-04:00</updated><id>https://mbj3.dev/blog/Mesh-Networking-Overview</id><content type="html" xml:base="https://mbj3.dev/blog/Mesh-Networking-Overview/"><![CDATA[<h1 id="overview">Overview</h1>
<p>This post will serve as an overview of all the mesh networking technologies,
projects, and efforts that I will be reasearching for my gradschool project:</p>

<ul>
  <li>
    <p><a href="http://tinc-vpn.org/">tinc</a></p>
  </li>
  <li>
    <p><a href="http://dedis.cs.yale.edu/dissent/#">Dissent</a></p>
  </li>
  <li>
    <p><a href="https://opengarden.com/">Open Garden</a></p>
  </li>
  <li>
    <p><a href="https://thefnf.org/">Free Network Foundation</a></p>
  </li>
  <li>
    <p><a href="http://guifi.net">GuiFi</a></p>
  </li>
  <li>
    <p><a href="http://tidepools.co">tidepools</a></p>
  </li>
  <li>
    <p><a href="https://hyperboria.net">hyperboria</a></p>
  </li>
  <li>
    <p><a href="https://wiki.projectmeshnet.org/Cjdns">cjdns</a></p>
  </li>
  <li>
    <p><a href="http://libre-mesh.org/">libremesh</a></p>
  </li>
  <li>
    <p><a href="http://www.olsr.org/mediawiki/index.php/Projects">OLSR</a></p>
  </li>
  <li>
    <p><a href="http://www.open-mesh.org/projects">BATMAN</a></p>
  </li>
  <li>
    <p><a href="http://bmx6.net/projects/bmx6/wiki">BMX</a></p>
  </li>
  <li>
    <p><a href="http://open80211s.org/open80211s/">802.11s</a></p>
  </li>
  <li>
    <p>Bit-Torrent style peer to peer</p>
  </li>
  <li>
    <p>Block chain</p>
  </li>
</ul>

<p>I will add other projects when I come across them.</p>

<h2 id="starting-off">Starting off</h2>
<p>I will be looking into the results of <a href="http://battlemesh.org/BattleMeshV7/Agenda?highlight=%28results%29">battlemeshv7</a>. It is a group of people who get together to test out the wireless mesh protocols.</p>]]></content><author><name>MrBoJangles3</name></author><category term="Blog" /><category term="Mesh Networking" /><summary type="html"><![CDATA[Overview This post will serve as an overview of all the mesh networking technologies, projects, and efforts that I will be reasearching for my gradschool project:]]></summary></entry></feed>