[PC周辺] qmail で queue にたまっているメールを吐き出す (20080420)

なんかメール転送先のサーバが数日止っていたので,qmail-qstat の結果結構 メールがたまっていて,まあしばらく放置していれば次第に届くのであるが, 一気に送ってしまう方法があるはず(sendmail の場合は sendmail -q)なので, 調べてみた.

[% man qmail-send]
If qmail-send receives an ALRM signal,  it  will  reschedule
every message in the queue for immediate delivery.

とかいうことで,

% sudo kill -ALRM (qmail-send's pid)

ということらしい.

[PC周辺] vmware-any-any-update116 + Linux 2.6.25 git 20080419版 (20080419)

[myn:2008041800] の続き.Linux 2.6.25 の git の最新版にあげると,

/tmp/vmware-config0/vmnet-only/bridge.c: In function 'VNetBridgeDevCompatible':
/tmp/vmware-config0/vmnet-only/bridge.c:278: error: 'struct net_device' has no member named 'nd_net'
/tmp/vmware-config0/vmnet-only/bridge.c:278: error: 'struct net_device' has no member named 'nd_net'
/tmp/vmware-config0/vmnet-only/bridge.c: In function 'VNetBridgeUp':
/tmp/vmware-config0/vmnet-only/bridge.c:913: error: 'struct net_device' has no member named 'nd_net'
/tmp/vmware-config0/vmnet-only/bridge.c:951: error: 'struct net_device' has no member named 'nd_net'

とか怒られる.これは,

[include/linux/netdevice.h]
#ifdef CONFIG_NET_NS
        /* Network namespace this network device is inside */
        struct net              *nd_net;
#endif

とかになっていて CONFIG_NET_NS が設定されていないから. とはいえ CONFIG_NET_NS は !CONFIG_SYSFS でなければ設定不能 (ということで普通は設定されない).ということで,

[include/linux/netdevice.h]
/*
 * Net namespace inlines
 */
static inline
struct net *dev_net(const struct net_device *dev)
{
#ifdef CONFIG_NET_NS
        return dev->nd_net;
#else
        return &init_net;
#endif
}

という method を使うことにする.

diff -ruw vmnet-only.orig/bridge.c vmnet-only/bridge.c
--- vmnet-only.orig/bridge.c 2007-11-28 19:25:06.000000000 +0900
+++ vmnet-only/bridge.c 2008-04-19 19:08:45.000000000 +0900
@@ -275,7 +275,7 @@
                         struct net_device *net)  // IN: Network device
 {
 #ifdef VMW_NETDEV_HAS_NET
-   if (net->nd_net != bridge->internalDev->nd_net) {
+   if (dev_net(net) != dev_net(bridge->internalDev)) {
       return 0;
    }
 #endif

と,

diff -ruw vmnet-only.orig/vmnet-only/vmnetInt.h vmnet-only/vmnetInt.h
--- vmnet-only.orig/vmnet-only/vmnetInt.h       2007-11-28 19:25:06.000000000 +0900
+++ vmnet-only/vmnetInt.h       2008-04-20 23:09:00.000000000 +0900
@@ -63,7 +63,7 @@
 #   define dev_lock_list()    read_lock(&dev_base_lock)
 #   define dev_unlock_list()  read_unlock(&dev_base_lock)
 #   ifdef VMW_NETDEV_HAS_NET
-#      define DEV_GET(x)      __dev_get_by_name((x)->internalDev->nd_net, (x)->name)
+#      define DEV_GET(x)      __dev_get_by_name((dev_net((x)->internalDev)), (x)->name)
 #   else
 #      define DEV_GET(x)      __dev_get_by_name((x)->name)
 #   endif
@@ -85,7 +85,7 @@

 #ifdef VMW_NETDEV_HAS_NET
 extern struct proto vmnet_proto;
-#   define compat_sk_alloc(_bri, _pri) sk_alloc((_bri)->internalDev->nd_net, \
+#   define compat_sk_alloc(_bri, _pri) sk_alloc((dev_net((_bri)->internalDev)), \
                                                 PF_NETLINK, _pri, &vmnet_proto)
 #elif defined(VMW_HAVE_SK_ALLOC_WITH_PROTO)
 extern struct proto vmnet_proto;

みたいな感じで(なんか無駄に括弧が多くしてしまったような気もする).

該当する Linux 側の変更は, [NET] NETNS: Omit net_device->nd_net without CONFIG_NET_NS.

関連リンク
参照リンク

[PC周辺] vmware-any-any-update116 + Linux 2.6.25-rc8 git 20080412版 (20080418)

2.6.24-rc8 git 20080124版であれば vmware-any-any-update116 で vmware が動くが,それ以降の Linux だと compile がとおらず,放置してた.

2.6.25 も出てことだし,ちょっと見てみた.

ちなみに vmware-any-any-update116 は <URL:http://groups.google.com/group/vmkernelnewbies/files> にある(開発が 115 までとは別系統?).

で,まず,

In file included from /tmp/vmware-config0/vmmon-only/common/hostKernel.h:56,
                 from /tmp/vmware-config0/vmmon-only/common/task.c:30:
include/asm/page.h: In function 'pte_t native_make_pte(pteval_t)':
include/asm/page.h:128: error: expected primary-expression before ')' token
include/asm/page.h:128: error: expected ';' before '{' token
include/asm/page.h:128: error: expected primary-expression before '.' token
include/asm/page.h:128: error: expected `;' before '}' token

とか.これは [myn:2007072000] と同様に include/asm/page.h の native_make_pte 付近を修正.次に,

/tmp/vmware-config0/vmnet-only/bridge.c: In function 'VNetBridgeUp':
/tmp/vmware-config0/vmnet-only/bridge.c:949: error: implicit declaration of function 'sock_valbool_flag'

とか.これは「[NET]: Move sock_valbool_flag to socket.c」 由来の問題ぽい.

diff -ruw vmnet-only.orig/bridge.c vmnet-only/bridge.c
--- vmnet-only.orig/bridge.c 2007-11-28 19:25:06.000000000 +0900
+++ vmnet-only/bridge.c 2008-04-18 10:43:53.000000000 +0900
@@ -886,6 +886,14 @@
  *----------------------------------------------------------------------
  */

+static inline void sock_valbool_flag(struct sock *sk, int bit, int valbool)
+{
+  if (valbool)
+    sock_set_flag(sk, bit);
+  else
+    sock_reset_flag(sk, bit);
+}
+
 int
 VNetBridgeUp(VNetBridge *bridge, // IN: bridge struct
              Bool rtnlLock)      // IN: acquire RTNL lock

という感じで bridge.c に宣言を記述して対応(というか手動で inline 展開 しても可).やるきなしなし.次に,

/tmp/vmware-config0/vmnet-only/filter.c:48: error: 'NF_IP_LOCAL_IN' undeclared here (not in a function)
/tmp/vmware-config0/vmnet-only/filter.c:53: error: 'NF_IP_POST_ROUTING' undeclared here (not in a function)
/tmp/vmware-config0/vmnet-only/filter.c: In function 'VNetFilterHookFn':
/tmp/vmware-config0/vmnet-only/filter.c:233: warning: comparison between pointer and integer

とか.NF_IP_LOCAL_IN および NF_IP_POST_ROUTING は linux/netfilter_ipv4.h で define されており, filter.c からこの file を include しようとしているのだが,失敗してるぽい. ということで

diff -ruw vmnet-only.orig/filter.c vmnet-only/filter.c
--- vmnet-only.orig/filter.c 2007-11-28 19:11:12.000000000 +0900
+++ vmnet-only/filter.c 2008-04-18 10:50:24.000000000 +0900
@@ -41,6 +41,9 @@
 /* netfilter hooks for filtering. */
 static nf_hookfn VNetFilterHookFn;

+#define NF_IP_LOCAL_IN         1
+#define NF_IP_POST_ROUTING      4
+
 static struct nf_hook_ops vmnet_nf_ops[] = {
    {  .hook = VNetFilterHookFn,
       compat_nf_hook_owner

という感じで filter.c に #define を記述して対応.やるきなしなし.

関連リンク
参照リンク

このページのインデックス


Last-modified: Sun May 11 18:13:31 +0900 2008

全インデックス