アラブねこ

この記事は猫写真 Advent Calendar 2015 - Adventarのやつです。撮りためた猫写真をひたすら貼っていってくだしあとのこと

f:id:Ieshoriveul:20130818183957j:plain 猫の餌

f:id:Ieshoriveul:20130822164204j:plain 魚市場ねこ。湾岸ねこの食文化は海産物も多いねこ。

f:id:Ieshoriveul:20130822184317j:plain みずたまりは涼しげアラブねこ。

f:id:Ieshoriveul:20130822184423j:plain f:id:Ieshoriveul:20130822184435j:plain きのぼりねこ。きのうえにも涼しげねこ。

f:id:Ieshoriveul:20130822232253j:plain f:id:Ieshoriveul:20130822232318j:plainf:id:Ieshoriveul:20130822232302j:plainf:id:Ieshoriveul:20130822232329j:plain ゆうぐれおさんぽねこ。

f:id:Ieshoriveul:20130827122835j:plain UNIX

f:id:Ieshoriveul:20130829232227j:plain ねこの敵、野犬。夜中山の中で吠える。

f:id:Ieshoriveul:20130902023450j:plainf:id:Ieshoriveul:20130902023525j:plainf:id:Ieshoriveul:20130902024303j:plain ねむいけどねつけない微妙な夜のねこ。

bitviorでvirtio-net

[この記事はbitvisorのステマ記事です][この記事はBitVisor Advent Calendar 2015の3日目の記事として先輩に書かされました][怖い]

みなさんご存知BitVisorですが、最近virtio-netに対応したことは知ってます?

check it out

BitVisorの最新版はbitvisor.orgじゃなくて、bitvisor / bitvisor — Bitbucketにあります(安定版はない)。 テストも安定版tagもないので運が悪かったらそれまでですが、EDK2とかもそんな感じだしまあいいでしょ(よくない💢)。

 hg clone ssh://hg@bitbucket.org/bitvisor/bitvisor

make config

なんやいろいろありますが、NET_*系があれば機能的にはOK。

defconfig

機能的に足りていても設定されないと動かないのが世の常。 イケてる系だとそんなの起動時オプションとかでサクッとヨユーなんですが、芋いVMMは無理、許して。機能の使い分け・ペリフェラルの設定は config.oとかいう物体に格納された全設定項目入り構造体の実体で制御します、こいつの値はビルド時にdefconfigをいじるといじれる。

もっとdefconfig

defconfigがないとmake時に勝手に作られます、っていうかconfig.cでのincludeもこの名前決め打ちってそれデフォっていうかタダの設定ファイルやんけ!

そういう仕組みなので、手でdefconfig.tmplからコピーしてmakeしたほうが上品だが、makeしてビルド終わってから後で変えてもすぐ反映されます、これは救いっぽい

virtio化について

Q: bitvisorってパラパスじゃねえの、なんでわざわざ準仮想化デバイスすんねん

A: パススルーのほうが楽だけど、VMMのデバッグとか謎機能の実装とかで、VMM側もネット使いたいことあるやろ!

Q: 今までじゃあどうしてたの?

A: 例えば、VMMでもう一本ガメる(別居)とか、あるいは、パススルーっぽくしておきつつも割り込みはVMMに引き込んで自分宛のだけ盗む(同棲)という技を使ってた

Q: え、それって…………

A: デバイスが二度リセットしたりするけど、映画みたいに避けるとなんとかなる

Q: ……

A: 準仮想化いいよね

では

defconfigの下の方に空気を読みつつ以下のようにショドーすべし

                :
                :
        .driver = {
            .pci = "device=pro1000, driver=pro1000, virtio=1, net=pass, tty=1, and,"
                   "device=bnx, virtio=1, net=pass, driver=bnx, tty=1"
        },
                :

こうすると

PRO/1000などのPCIコンフィグ空間が盗まれてvirtioのPCIコンフィグ空間になる

# 速度

どうせGigabit etherしか対応してないし、ベアメタルと同じく931Mbps出る

FAQ

Q: 俺のパソコンで動かない

A: lspciして本当のデバイスが見えてしまっている場合はアレや、アレをみるんや……………

drivers/net/<your-bitch-netcard>.cの下の方の

 .device     = "class_code=020000,id="
              "14e4:165a|" /* BCM5722 */
              "14e4:1682|" /* Thunderbolt - BCM57762 */
              "14e4:1684|" /* BCM5764M */
              "14e4:1686|" /* BCM57766 */
              "14e4:1691|" /* BCM57788 */
              "14e4:16b4", /* BCM57765 */

みたいなとこにアレとアレがないんや………

僕は例えばこれを足しました:

           "14e4:165f|" /* BCM5720 */

そんなときは

lspci -nnk

以上

Cプリプロセサを使い、#includeディレクティブにマクロで生成したファイル名を読ませる

タイトルのとおりだが、難しいぞ。

例えば、こういうのなら簡単だ:

#define _CONCAT(X,Y) X ## Y
#define CONCAT(X,Y) _CONCAT(X, Y)
#define HEY(X) CONCAT(X, X)
#define YO yo

int HEY(YO);

int yoyo;になるはず。

この、一段プリプロセサの命令を使う前に展開させるためのクッションを入れるテクを使うと、例えば、

#include CONFIGFILE(def)

が、

#include "defconfig"

になってほしいなら、

#define QUOTE(X) # X
#define QUOTIFY(X) QUOTE(X)
#define _CONCAT(X,Y) X ## Y
#define CONCAT(X,Y) _CONCAT(X, Y)
#define _CONFIGFILE(X) _CONCAT(X,config)

#define CONFIGFILE(X) QUOTIFY(_CONFIGFILE(X))

#include CONFIGFILE(def)

とすればいい。

では、次に

#include CONFIGFILE(def)

が、

#include "../defconfig"

となるにはどうすればいいだろうか。

#define UPDIR ../
#define __CONFIGFILE(X) CONCAT(UPDIR, _CONFIGFILE(X))

を足すと、 error: pasting "/" and "defconfig" does not give a valid preprocessing token と言われて怒られる。なぜならドットやスラッシュはC言語では一つのトークンをなすからだ。しかし、これを文字列として扱うと、""../""と"defconfig"の連結となってしまい、意図したものとは違うものになってしまう(と言うか以下でも怒られる):

#define _UPDIR ../
#define UPDIR # _UPDIR

しかし、この場合は、文字列連結ではなく、トークンの連接で解決できる、すなわち以下のとおり。

#define QUOTE(X) # X
#define QUOTIFY(X) QUOTE(X)
#define _CONCAT(X,Y) X ## Y
#define CONCAT(X,Y) _CONCAT(X, Y)
#define _CONFIGFILE(X) _CONCAT(X,config)

#define CONFIGFILE(X) QUOTIFY(../_CONFIGFILE(X))

#include CONFIGFILE(def)

やったぜ

Jailでresolv.confどないすんねん問題

jail中でpkg installできないと思ったらそもそも名前引けなかったみたいな事例、普通にresolv.conf書けば治るんですが、それはそれとして

Resolvconf with FreeBSD jails

こういう、Jail中のresolv.confはpublic DNSにしたら?みたいなクソどうでも良い回答でスレッドが終わってて悲しかったので一応言っとくと、

#!/usr/local/bin/zsh

#This file is located /etc/resolvconf.conf

for i in /var/jails/*/etc; do
        cp /etc/resolv.conf $i
done

(ただしすべてのjail環境が/var/jailsの下にある場合)

以上です

Jailから出る

jailから外にpingが打ちたいねん

うちたい。

当方FreeBSD 10.2-RELEASE #0 r286666

ま、とりあえずjailたてようか

mkdir -p /var/jail/hoge
cd /var/jail/hoge
fetch http://そこらへん/base.txz
tar xf base.txz
vi etc/crontab #最終行を消せ!!!

ここが網走だ、覚悟しろ

jailの設定を/etc/rc.confに書くと計算機が爆発する

jailが増えるといずれrc.conf設定ファイルが摩擦熱で徐々に熱くなり、そのうち発火、最悪CPUのグリスに引火・爆発して周囲10kmが焼け野原になる。

これを避けるために発明されたのが/etc/jail.confというファイルだ。

これはこんな見た目をしている。

allow.raw_sockets = 0;
allow.set_hostname = 0;
allow.sysvipc = 0;
mount.devfs;
exec.start += "/bin/sh /etc/rc";
exec.stop = "";

baka {
        host.hostname = "baka";
        path = "/usr/jail/hoge";
        ip4.addr += "一億/16";
        allow.sysvipc = 1;
        allow.raw_sockets = 1;
}

ちなみに、/etc/rc.confに

jail_devfs_enable="YES" 
jail_sysvipc_allow="YES"

とか書いてても、上のallow.*みたいなのを書かないとpingが通らず(ping: socket: Operation not permitted とかみたいになる)、ユーザは禿げるし、ユーザが放った数多くのpingがネットワークカードに詰まって摩擦熱で徐々に熱くなり、最悪PCIスロットに詰まったホコリに引火・爆発して周囲30kmが焼け野原になる。

お土産

[/etc/rc.conf]

hostname="oyaga_bakanara_komo_baka"
keymap="us.pc-ctrl.kbd"
ifconfig_em0="DHCP"
sshd_enable="YES"
# Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable
dumpdev="AUTO"
zfs_enable="YES"

jail_enable="YES"
jail_list="baka"
ifconfig_em0_alias0="inet 一億/16"

wpa_supplicant and WPA enterprise (like eduroam)

Like as wiki (WPA supplicant - ArchWiki) says, anyway you need to install wpa_supplicant.

Then, because Networkmanager can't handle with eduroam, you'll start to thinking about connecting to it by hand.

Write a configration file (eg: /etc/wpa_supplicant/wpa_supplicant.conf) like below:

network={
    ssid="eduroam"
    scan_ssid=1
    key_mgmt=WPA-EAP
    eap=PEAP
    identity="foo"
    password="bar"
    phase1="peaplabel=0"
    phase2="auth=MSCHAPV2"
}

OK, configuration is done. Let's up wpa_supplicant.

% wpa_supplicant -B -i wlp3s0 -c /etc/wpa_supplicant/wpa_supplicant.conf

... and connect a client to wpa_supplicant.

% wpa_cli
:
:
blah
blah
blah
:
:

You will get a prompt to put a command.

> list_networks                               # [list_network] is your input
network id / ssid / bssid / flags

0   eduroam any 
> enable_network 0
OK
:
:
blah
blah
:

If you have some configuration other than eduroam in wpa_supplicant.conf, it's ok. Then you'll see some networks on list_networks. Disable unneeded one with disable_network m and choose eduroam with enable_network n(if needed).