Shallow Thoughts : : Aug
Akkana's Musings on Open Source Computing and Technology, Science, and Nature.
Fri, 31 Aug 2018
I wrote some time ago about how to use a
Raspberry
Pi over USB as an "Ethernet Gadget". It's a handy way to talk to
a headless Pi Zero or Zero W if you're somewhere where it doesn't already
have a wi-fi network configured.
However, the setup I gave in that article doesn't offer a way for the
Pi Zero to talk to the outside world. The Pi is set up to use the
machine on the other end of the USB cable for routing and DNS, but that
doesn't help if the machine on the other end isn't acting as a router
or a DNS host.
A lot of the ethernet gadget tutorials I found online
explain how to do this on Mac and Windows, but it was tough to find
an example for Linux. The best I found was for Slackware,
How
to connect to the internet over USB from the Raspberry Pi Zero,
which should work on any Linux, not just Slackware.
Let's assume you have the Pi running as a gadget and you can talk to it,
as discussed in the previous article, so you've run:
sudo ip a add 192.168.7.1/24 dev enp0s20u1
sudo ip link set dev enp0s20u1 up
substituting your network number and the interface name that the Pi
created on your Linux machine, which you can find in
dmesg | tail
or
ip link
. (In Part 3
I'll talk more about how to find the right interface name
if it isn't obvious.)
At this point, the network is up and you should be able to ping the Pi
with the address you gave it, assuming you used a static IP:
ping 192.168.7.2
If that works, you can ssh to it, assuming you've enabled ssh.
But from the Pi's end, all it can see is your machine; it can't
get out to the wider world.
For that, you need to enable IP forwarding and masquerading:
sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Now the Pi can route to the outside world, but it still doesn't have
DNS so it can't get any domain names. To test that, on the gateway machine
try pinging some well-known host:
$ ping -c 2 google.com
PING google.com (216.58.219.110) 56(84) bytes of data.
64 bytes from mia07s25-in-f14.1e100.net (216.58.219.110): icmp_seq=1 ttl=56 time=78.6 ms
64 bytes from mia07s25-in-f14.1e100.net (216.58.219.110): icmp_seq=2 ttl=56 time=78.7 ms
--- google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 78.646/78.678/78.710/0.032 ms
Take the IP address from that -- e.g. 216.58.219.110 -- then go to a shell
on the Pi and try ping -c 2 216.58.219.110
, and you should
see a response.
DNS with a Public DNS Server
Now all you need is DNS. The easy way is to use one of the free DNS
services, like Google's 8.8.8.8. Edit /etc/resolv.conf and add
a line like
nameserver 8.8.8.8
and then try pinging some well-known hostname.
If it works, you can make that permanent by editing /etc/resolv.conf,
and adding this line:
name_servers=8.8.8.8
Otherwise you'll have to do it every time you boot.
Your Own DNS Server
But not everyone wants to use public nameservers like 8.8.8.8.
For one thing, there are privacy implications: it means you're telling
Google about every site you ever use for any reason.
Fortunately, there's an easy way around that, and you don't even
have to figure out how to configure bind/named. On the gateway box,
install dnsmasq, available through your distro's repositories.
It will use whatever nameserver you're already using on that machine,
and relay it to other machines like your Pi that need the information.
I didn't need to configure it at all; it worked right out of the box.
In the next article, Part 3:
more about those crazy interface names (why is it
enp0s20u1 on my laptop but enp0s26u1u1i1 on my desktop?),
how to identify which interface is the gadget by using its MAC,
and how to put it all together into a shell function so you can
set it up with one command.
Tags: raspberry pi, linux, networking
[
15:25 Aug 31, 2018
More linux |
permalink to this entry |
]
Thu, 23 Aug 2018
I try to
avoid Grub2
on my Linux machines, for reasons I've discussed before.
Even if I run it, I usually block it from auto-updating /boot since that
tends to overwrite other operating systems.
But on a couple of my Debian machines, that has meant needing to notice
when a system update has installed a new kernel, so I can update the
relevant boot files. Inevitably, I fail to notice, and end up running
an out of date kernel.
But didn't Debian use to have a /boot/vmlinuz that always
linked to the latest kernel? That was such a good idea: what happened
to that?
I'll get to that. But before I found out, I got sidetracked trying to
find a way to check whether my kernel was up-to-date, so I could have
it warn me of out-of-date kernels when I log in.
That turned out to be fairly easy using uname and a little shell
pipery:
# Is the kernel running behind?
kernelvers=$(uname -a | awk '{ print $3; }')
latestvers=$(cd /boot; ls -1 vmlinuz-* | sort --version-sort | tail -1 | sed 's/vmlinuz-//')
if [[ $kernelvers != $latestvers ]]; then
echo "======= Running kernel $kernelvers but $latestvers is available"
else
echo "The kernel is up to date"
fi
I put that in my .login. But meanwhile I discovered that that
/boot/vmlinuz link still exists -- it just isn't enabled
by default for some strange reason. That, of course, is the right
way to make sure you're on the latest kernel, and you can do it with the
linux-update-symlinks command.
linux-update-symlinks
is called automatically when you install a new kernel -- but by
default it updates symlinks in the root directory, /, which isn't
much help if you're trying to boot off a separate /boot
partition.
But you can configure it to notice your /boot partition.
Edit /etc/kernel-img.conf and change link_in_boot
to yes:
link_in_boot = yes
Then linux-update-symlinks will automatically update the
/boot/vmlinuz link whenever you update the kernel,
and whatever bootloader you prefer can point to that image.
It also updates /boot/vmlinuz.old to point to the previous kernel
in case you can't boot from the new one.
Update: To get linux-update-symlinks to update symlinks to reflect
the current kernel, you need to reinstall the package for the current kernel,
e.g. apt-get install --reinstall linux-image-4.18.0-3-amd64
.
Just apt-get install --reinstall linux-image-amd64
isn't enough.
Tags: linux, debian, shell
[
20:14 Aug 23, 2018
More linux/kernel |
permalink to this entry |
]
Fri, 17 Aug 2018
Over the years I've picked up a couple of cellphone stands as
conference giveaways. A stand is a nice idea, especially if you
like to read news articles during mealtime, but the stands I've
tried never seem to be quite what I want. Either they're not
adjustable, or they're too bulky or heavy to want to carry them
around all the time.
A while back, I was browsing on ebay looking for something better
than the ones I have. I saw a few that looked like they might be
worth trying, but then it occurred to me: I could make one pretty
easily that would work better than anything I'd found for sale.
I started with plans that involved wire and a hinge -- the hinge so
the two sides of the stand would fold together to fit in a purse or
pocket -- and spent a few hours trying different hinge options.I
wasn't satisfied, though. And then I realized: all I had to do was
bend the wire into the shape I needed. Voilà -- instant
lightweight adjustable cellphone stand.
And it has worked great. I've been using it for months and it's much
better than any of the prefab stands I had before.
Bend a piece of wire
I don't know where this wire came from: it was in my spare-metal-parts
collection. You want something a little thinner than coathanger wire,
so you can bend it relatively easily; "baling wire" or "rebar wire"
is probably about right.
Bend the tips around
Adjust the curve so it's big enough that your cellphone will fit in
the crook of the wires.
Bend the back end down, and spread the two halves apart
Adjust so it fits your phone
Coat the finished stand with rubberized coating (available at
your local hardware store in either dip or spray-on varieties)
so it won't slide around on tables and won't scratch anything.
The finished product is adjustable to any angle you need -- so you
can adjust it based on the lighting in any room -- and you can fold
the two halves together to make it easy to carry.
Tags: hardware, hack
[
12:06 Aug 17, 2018
More hardware |
permalink to this entry |
]
Sun, 12 Aug 2018
About three weeks ago, a Debian (testing) update made a significant
change on my system: it added a 30-minute suspend timeout. If I left
the machine unattended for half an hour, it would automatically go
to sleep.
What's wrong with that? you ask. Why not just let it sleep if you're
going to be away from it that long?
But sometimes there's a reason to leave it running. For instance, I
might want to track an ongoing discussion in IRC, and occasionally
come back to check in. Or, more important, a long-running job that
doesn't require user input, like a system backup, or ripping a CD.
or testing a web service.
None of those count as "activity" to keep the system awake: only
mouse and keyboard motions count.
There are lots of pages that point to the file
/etc/systemd/logind.conf, where you can find commented-out
lines like
#IdleAction=ignore
#IdleActionSec=30min
The comment at the top of the file says that these are the defaults
and references the logind.conf man page. Indeed, man logind.conf
says that setting IdleAction=ignore should prevent annything from happening,
and that setting IdleActionSec=120min should lead to a longer delay.
Alas, neither is true. This file is completely ignored as far as I can
tell, and I don't know why it's there, or where the 30 minute setting
is coming from.
What actually did work was in
Debian's Suspend wiki page.
I was skeptical since the page hasn't been updated since Debian Jessie
(Stretch, the successor to Jessie, has been out for more than a year
now) and the change I was seeing just happened in the last month.
I was also leery because the only advice it gives is
"For systems which should never attempt any type of suspension, these
targets can be disabled at the systemd level". I do suspend my system,
frequently; I just don't want it to happen unless I tell it to, or with
a much longer timeout than 30 minutes.
But it turns out the command it suggests does work:
sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
and it doesn't disable suspending entirely: I can still suspend manually,
it just disables autosuspend. So that's good enough.
Be warned: the page says next:
Then run systemctl restart systemd-logind.service
or reboot.
It neglects to mention that restarting systemd-logind.service
will kill your X session, so don't run that command if you're
in the middle of anything.
It would be nice to know where the 30-second timeout had been coming
from, so I could enable it after, say, 90 or 120 minutes. A timeout
sounds like a good thing, if it's something the user can configure.
But like so many systemd functions, no one who writes documentation
seems to know how it actually works, and those who know aren't telling.
Tags: linux, systemd
[
13:36 Aug 12, 2018
More linux |
permalink to this entry |
]
Wed, 08 Aug 2018
We're still not getting the regular thunderstorms one would normally
expect in the New Mexico monsoon season, but at least we're getting
a little relief from the drought.
Last Saturday we had a fairly impressive afternoon squall. It only
lasted about ten minutes but it dumped over an inch of rain and hail
in that time.
("Over an inch" means our irritating new weather station stopped
recording at exactly 1.0 even though we got some more rain after that,
making us suspect that it has some kind of built-in "that can't be right!"
filter. It reads in hundredths of an inch and it's hard to believe that
we didn't even get another .01 after that.)
It was typical New Mexico hail -- lentil-sized, not like the
baseballs we heard about in Colorado Springs a few days later that
killed some zoo animals. I hear this area does occasionally
get big hailstones, but it's fortunately rare.
There was enough hail on the ground to make for wintry snow scenes,
and we found an enormous pile of hailstones on our back deck
that persisted through the next day (that deck is always shady).
Of course, the hail out in the yard disappeared in under half an hour
once the New Mexico sun came out.
But before that, as soon as the squall ended, we went out to walk the
property and take a look the "snow" and in particular at "La Cienega"
or "the swamp", our fanciful name for an area down at the bottom of
the hill where water collects and there's a little willow grove.
There was indeed water there -- covered with a layer of
floating hail -- but on the way down we also had a new "creek" with
several tributaries, areas where the torrent carved out little
streambeds.
It's fun to have our own creek ... even if it's only for part of a day.
More photos: August
hailstorm.
Tags: nature
[
19:28 Aug 08, 2018
More nature |
permalink to this entry |
]