OpenWRT 交叉编译 traceroute

OpenWRT 交叉编译 traceroute

最近 (2014.10)需要在路由器上运行完整版的 traceroute (路由器自带的 traceroute 是精简版, 不支持很多功能, 如 --fwmark= 设置 icmp 包标记), 于是自己编译.

下载对应路由器架构 OpenWrt toolchain 最新版 (brcm47xx 最新版 OpenWrt toolchain), 设置相应的环境变量 (参考 OpenWrt cross compile 文档)

下载 traceroute 源代码: http://sourceforge.net/projects/traceroute/

解压缩, 修改 Make.rules, 搜索含有 "CROSS" 和 "LDFLAGS" 的两行, 改成下面的:

$(call set, CROSS, mipsel-openwrt-linux-uclibc-)
$(call set, LDFLAGS, -s -L../libsupp)

然后 make 即可. 生成的 bin 位于 traceroute/traceroute

PS. 编译完后放到路由器上运行出错, 上网搜索下找到了解决方法:

# traceroute 10.0.0.1
10.0.0.1: Bad value for ai_flags
Cannot handle "host" cmdline arg `10.0.0.1' on position 1 (argc 1)

# traceroute www.yahoo.com
www.yahoo.com: Bad value for ai_flags
Cannot handle "host" cmdline arg `www.yahoo.com' on position 1 (argc 1)

The solution was simply to comment out the line that sets ai_flags to
AI_IDN.  Here is the patch:

diff -Naur traceroute-2.0.12.org/traceroute/traceroute.c
traceroute-2.0.12/traceroute/traceroute.c
--- traceroute-2.0.12.org/traceroute/traceroute.c       2008-09-17
07:30:22.000000000 -0600
+++ traceroute-2.0.12/traceroute/traceroute.c   2010-06-14
20:32:19.000000000 -0600
@@ -176,7 +176,6 @@

PS2. linux 的 ping 和 traceroute 工具都可以设置 mark 标记 (用于 ip rule 做策略路由)

ping -m 0xa 8.8.8.8
traceroute --fwmark=0xa 8.8.8.8

但是 mtr 好像不支持 mark 标记, 文档里没找到相应参数.

Rt-N16 ddwrt 刷机

Rt-N16 ddwrt 刷机

目前 (2014.10) 的固件是 ddwrt K26 build svn19342, 计划升级 (现在的版本 ddwrt 跑了好几年了, 非常稳定, 不过我最经在折腾一些奇怪的东西, 2.6的内核玩不了). 考虑了下, 还是刷 ddwrt 好了. OpenWrt 貌似 brcm47xx 的 802.11n 驱动仍然不完善.

最新版 ddwrt 固件下载(官方build) ftp://ftp.dd-wrt.com/betas/2014/ . 根据设备型号, ROM大小, 架构类型等选择. ROM 必须大于固件大小. 8MB ROM的设备可以刷 mega, 32MB 或更多 ROM 的设备(如 RT-N16, RT-N66)可以刷 big (最大而全的版本, 20多MB)

固件架构选择:
(Asus Rt-N16 uses generic broadcom K26 build .TRX version is just for the initial flashing from the Asus firmware. after you get DD-WRT on it, use the non device specific version like Mini, Mega or Big.)
K26 build (broadcom_K26), 2.6内核, 32kb nvram, 可以使用 optware / optware2
K3 build (broadcom_K3X), 3.x 内核, 64kb nvram, 不能使用 optware / OTRW2. (更正: 初步的 optrw2 for 3.x kernel 已经可用. 参考) 支持 > 2tb usb硬盘. K3 的 big 版非常大(最新版 20多MB), mega版仍然是<8MB, 官方说明是: "thats the difference between big and mega. i just included everything possible in big but it will work only on 32mb flash devices." 无线速度比K26慢 (驱动问题?)(但根据 ddwrt developer KingKong 的说法, 新版的 K3 build 的无线网络性能已经过优化, 比 K2.6 好得多)

各个版本固件功能支持:
SWAP: Thus swap for K3 requires 22282 for K26 it is included in 22357.Once it is included in the kernel it automounts the swap and you don't have to do it by hand.
port forwarding is fixed in release beyond 19696 so no startup script is necessary now.

K3 r24461: 最新. 2014年6月23日发布. 有人报告不稳定有问题? 下载地址 (RT-N16 所用的 broadcom_K3X版).
Old:
r24160: works well seemly.
r22118: 早期, bug: Lan和Wireless的MAC变为一样了, 貌似没什么影响。

K2.6 Build: King Kong 2.6 build (it's 2.6 kernel based so no issues with experimental stuff or instability.) is recommended. 解决了ddwrt K26 官方 >18946 build OpenVPN 连接错误问题; 非常稳定; CPU占用低.
R22200: 下载地址(已失效, 需要迅雷离线). 推荐的版本. (or 21661M if you have problems with multiple users for FTP and/or Samba. Build 19545M can also be useful if you have multiple (bridged) routers, all running minidlna.)

RT-N16 特别说明:
对RT-N16, K3 build 的固件必须从已有的k26 (2.6 kernel)固件上开始先刷3.x 21530 (一个特别的 2.6->3.x 过渡boot固件, dd-wrt.v24-21530_NEWD-2_K3.x_big.bin, 17MB, 主要解决 RT-N16 32KB nvram 问题), 然后再刷最新版的3.x build (官网ftp下载). 刷完后 nvram 会自动扩展到 64KB (in 23204 and later the nvram got bumped up to 256K.). 具体步骤 (推荐):
0. 有人建议先刷"最新版" K26 build (21676)? (可跳过, 只要已有固件是 2.6 内核应该就行)
1. 在已有K26 build ddwrt 管理界面 reset the router (nvram)
2. 立即在同一界面开始刷 21530 (登录 192.168.1.1, 默认密码: admin. 不要改动任何设置), 升级时, 建议不要选择"reset to default" (第一步已经reset 过了)
3. 立即开始刷最新版的K3 build, 升级时, 不要选择"reset to default" (有人在这一步reset结果砖了)
4. * If the router boots, you will probably get the MAC address problem and no WAN address as mentioned. That happened to me. Try to manually reset your rt-n16 now to default from the Administration tab. Reboot and your rt-n16 should get an external MAC address and connect to the internet. No hacks, just works. So there is no need to change the command/startup page.

WPS 恢复模式 (万一刷挂了时候用)
You may directly flash the kingkong build from recovery mode (no previous DD-WRT firmware installation needed). Just remove power, press WPS button and keep pressing it while you connect power, wait till the power LED flashes rapidly, press Recover button while continuing to press WPS, then don't press WPS anymore but continue to press Recover till the power LED flashes slowly, then go to you computer, set a static IP 192.168.1.3, netmask 255.255.255.0 and standard gateway 192.168.1.1 and use Asus Recovery program or atftp with the following commands:
connect 192.168.1.1
mode octet
put kingkong-nv32k-broadcom.bin
Wait 10 minutes and if needed remove then power for 10 seconds.

K3 降级 K2.6
Note, when switching from a K3 build to a K2 build, even though you choose to reset NVRAM, many K3 NVRAM parameters are not erased. The older K3 parameters will be reused when the K3 build is reinstalled. To fully clear the K3 nvram, issue the command “erase nvram" and “erase nvram_cfe" before installing K2. Note that running these two commands on a K3 build will soft brick the router requiring DD-WRT to be reflashed.

其它资料整理 (来自ddwrt 官方论坛用户帖子, 供参考)
Here is a list of the other builds I attempted which failed to work with RT-N16 (i.e. either there was no wireless or no internet at all or there was wireless but the ipad wouldn't recognize it):
dd-wrt.v24-14896_NEWD-2_K2.6_big.bin
kingkong-nv32k-broadcom.bin
dd-wrt.v24-21530_NEWD-2_K3.x_big.bin
RT-N16_3.0.0.4_376.44_0.trx (Merlin)
dd-wrt.v24-24461_NEWD-2_K3.x_big.bin
For the ipad issue, try disabling all three dnsmasq options I. The basic settings page.

Minimally 14929 is required. The best build would be Kong 22000++ or a K3.x if you need 64 kB NVRAM or USB hard disk greater than 2 TB.

ddwrt 笔记

ddwrt 笔记

本笔记里内容基于如下环境:
路由器: Asus RT-N16 (mipsel 32位架构)
固件: ddwrt K3 r24461 big (3.10.44 内核)

网络

获取 wan 网关 ip
nvram get wan_gateway

获取 wan interface ip
nvram get wan_ipaddr

这几个 IP 是 ddwrt 在 ppp 拨号连接 /断开 时维护设置的, 不受 VPN 连接 /路由表更改等操作影响.

指定一个直连 (不走 VPN)的策略路由表 table 1
ip route add 0/0 via $(nvram get wan_gateway) table 1

对路由器本机向外发出的 ping (icmp) 打标记. 注意在 OUTPUT 阶段无法使用 -o (路由还没确定), 必须根据数据包dst地址是外部来判断
iptables -t mangle -A OUTPUT ! -d 192.168.0.0/16 -p icmp -j MARK --set-mark 0xa

对含有 0xa (10) 标记数据包 走 table 1 路由
ip rule add prio 1 fwmark 0xa table 1

关于标记 mark: mark比较特殊,它不是包本身 的一部分,而是在包穿越计算机的过程中由内核分配的和它相关联的一个字段。它可能被用来改变包的传输 路径或过滤。 mark 字段的值是一个无符号的整数, 在32位系统上最大可以是4294967296(就是2的32次方)(默认mark是0, 表示没有)
mark 值格式可以是10进制数字或 0xFF 这种格式的二进制. 推荐16进制, 因为 ip rule list / iptables -t mangle -vxnL 显示时候均输出16进制

ping 命令可以用 -m mark 设置icmp包标记值 (不是所有 build 都支持)

用户

增加一个用户, 需要修改启动脚本, 开机时写入 /etc/passwd (实际上映射了 /tmp/etc/passwd )

grep -q direct /tmp/etc/passwd || echo "direct:*:1024:1024:direct connecting users:/var:/bin/false" >> /tmp/etc/passwd

iptables 对属于这个用户进程的外出流量打标记 (需要先自己编译安装 iptables 和 owner extension 扩展)

iptables -t mangle -A OUTPUT -m owner --uid-owner 1024 -j MARK --set-mark 0xa

-----------------------------------------------------------------------------------------------------------
This module attempts to match various characteristics of the packet creator, for locally generated packets. This match is only valid in the OUTPUT and POSTROUTING chains. Forwarded packets do not have any socket associated with them. Packets from kernel threads do have a socket, but usually no owner.

[!] --uid-owner username
[!] --uid-owner userid[-userid]
Matches if the packet socket's file structure (if it has one) is owned by the given user. You may also specify a numerical UID, or an UID range.
[!] --gid-owner groupname
[!] --gid-owner groupid[-groupid]
Matches if the packet socket's file structure is owned by the given group. You may also specify a numerical GID, or a GID range.
[!] --socket-exists
Matches if the packet is associated with a socket.
-----------------------------------------------------------------------------------------------------------

--uid-owner 无法应用于 ping 之类的 RAW_SOCKET 发出的数据包 ?

貌似我现在 (2014.10)的 ddwrt 固件 (svn24461, 3.10.44 kernel) 存在 bug, iptables owner match module (kernel xt_owner) 工作不正常, 从测试上看, iptables -m owner 的 --uid-owner 总是返回 False, 即使是对应用户所属进程发出的数据包.

ipkg repository setup

/etc/ipkg.conf 不可编辑 (根分区只读), 所以要修改 ipkg repository 设置只能用 mount 形式

创建 /jffs/etc/ipkg.conf, 使用 OpenWrt 的 repository 源, 建议使用对应内核的 OpenWrt build 的源, 3.10.44 内核的 OpenWrt 版本是 barrier_breaker 14.07-rc1, 或者使用最新版的 OpenWrt snapshot repository (但里面部分 kmod-* 内核模块 package 无法安装)

src base http://downloads.openwrt.org/snapshots/trunk/brcm47xx/packages/base
src main http://downloads.openwrt.org/snapshots/trunk/brcm47xx/packages/packages
#src attitude http://downloads.openwrt.org/attitude_adjustment/12.09/brcm47xx/generic/packages
dest root /jffs
dest mmc /mmc
dest opt /opt
dest smbfs /tmp/mnt/smbshare
dest ram /tmp

startup 脚本里增加:

mount --bind /jffs/etc/ipkg.conf /etc/ipkg.conf

OpenWrt 的源里很多软件 ddwrt 安装都会报兼容性问题, 但实际上可以正常运行. 建议关闭 ipkg 的 dependency 错误报告, 在 profile 脚本里增加:

alias ipkg="ipkg -force-depends"

Dnsmqsq

ddwrt 里面自带的 dnsmasq 不知道是什么破版本的, 有旧又烂, 什么高级特性都不支持. 建议换掉.

安装 OpenWrt 里的 dnsmasq-full: (推荐安装到默认位置 /jffs, /opt usb 设备可能启动时并未立即挂载完全 )

ipkg -force-depends install dnsmasq-full

在 ddwrt startup 脚本里设置用安装的 dnsmasq-full 里的 dnsmasq 代替系统内置的 dnsmasq: (我不确定改 PATH 优先级有没有作用, 因为 ddwrt一些系统服务的 PATH 貌似是固定的, 所以还是 mount 可靠)

mount --bind /jffs/usr/sbin/dnsmasq /usr/sbin/dnsmasq


ipset

需要内核模块支持:
* kmod-nfnetlink
** kmod-ipt-ipset
ip_set.ko
ip_set_bitmap_ip.ko
ip_set_bitmap_ipmac.ko
ip_set_bitmap_port.ko
ip_set_hash_ip.ko
ip_set_hash_ipport.ko
ip_set_hash_ipportip.ko
ip_set_hash_ipportnet.ko
ip_set_hash_net.ko
ip_set_hash_netiface.ko
ip_set_hash_netport.ko
ip_set_list_set.ko
**
* xt_set.ko (alias: ipt_set, iptables set 模块)

测试内核模块是否支持:
ipset list
// 如果nfnetlink模块未加载 (并且没有编译在内核里), 会提示 "can't connect to kernel." 错误.

测试内核是否支持 xt_set.ko: 执行一条 iptables -m set 命令:

ipset create direct hash:ip
iptables -t mangle -A OUTPUT -m set --match-set direct dst -j MARK --set-mark 0xa
// 如果 xt_set.ko 未加载, iptables 会报错 (iptables: No chain/target/match by that name.)
// 如果 iptables 没有 -m set 动态库, 会提示 match not found 之类错误
cat /proc/net/ip_tables_matches
// see there is a "set"


这个版本 ddwrt 版本内核里已经编译进去了 nfnetlink, 但不包括 xt_set.ko (并且固件自带的内核模块目录里也没有), 所以需要自己编译 xt_set.ko 内核模块. 然后在路由器上加载:

insmod /path/to/xt_set.ko


安装 ipset 用户空间工具: ipkg install ipset

使用:
---------------------------
Usage: ipset [options] COMMAND

Commands:
create SETNAME TYPENAME [type-specific-options] ( create == -N)
Create a new set
add SETNAME ENTRY
Add entry to the named set
del SETNAME ENTRY
Delete entry from the named set
test SETNAME ENTRY
Test entry in the named set
destroy [SETNAME]
Destroy a named set or all sets
list [SETNAME] (list == -L)
List the entries of a named set or all sets
save [SETNAME]
Save the named set or all sets to stdout
restore
Restore a saved state
flush [SETNAME]
Flush a named set or all sets
rename FROM-SETNAME TO-SETNAME
Rename two sets
swap FROM-SETNAME TO-SETNAME
Swap the contect of two existing sets
-------------------------

常用的 set type: (括号里是别名, 两个均可使用)
* bitmap:ip: can store up to 65535 (B-class network) entries. You can store same size network addresses in this kind of sets as well and an IP address will be in the set if the network address it belongs to can be found in the set.
* hash:ip (iphash): 可以存储任意个 ip 地址. Same size network addresses can be stored in an hash:ip type of set as well.
* hash:net: 存储任意个不同子网长度的网络

创建一个 "direct" ipset:

ipset create direct hash:ip

操作 ipset 里面记录:
ipset add direct 8.8.8.8/32

使用 iptables 的 set match 匹配 ipset 里地址:

iptables -t mangle -A PREROUTING -m set --match-set direct dst -j MARK --set-mark 0xa
iptables -t mangle -A OUTPUT -m set --match-set direct dst -j MARK --set-mark 0xa

对 0xa 标记 设置查询路由表:

ip rule add fwmark 0xa table 1

设置 dnsmasq 将查询到的域名 ip 加入 ipset: (域名同时匹配子域名, 与 address=// 和 server=// 行为相同)

ipset=//[domain/][,]


ddwrt 交叉编译笔记

在 PC (x86, linux) 上编译 ddwrt / openwrt mips 路由器上的 C 程序

根据路由器soc和ddwrt版本选择一个 toolchain (不同的 toolchain 使用不同的 libc, 对应不同 build 的 ddwrt 固件). 所有 toolchain 在这里下载, 解压缩后7G多.

对应不同 soc 的 toolchain 版本选择:
brcm26: gcc linaro 4.5 uclibc 0.9.33.2
brcm3x: gcc linaro 4.8.

brcm47XX:

推荐使用 OpenWrt 的 toolchain, ddwrt 的 toolchain 就是一坨屎, 而且基本没有什么文档和说明.
注意这些 toolchain 里的编译工具上都是64位 (x86-64) )Linux下可执行文件.

# 或者, 下载 debian x86 下的 toolchain (这是一个比较旧的版本, 不过是32位的),使用里面的 4.1.0 mips版gcc编译
$ wget ftp://ftp.dd-wrt.com/sourcecode/toolchains.x86.debian.sp1.tar.bz2
$ tar -jxf toolchains.x86.debian.sp1.tar.bz2
$ export PATH=~/toolchains/4.1.0-uclibc-0.9.28/bin:$PATH
$ mipsel-linux-uclibc-gcc helloworld.c -o helloworld
$ file helloworld
helloworld: ELF 32-bit LSB executable, MIPS, version 1 (SYSV), dynamically linked (uses shared libs), not stripped

使用 Makefile 时, 需要修改 Makefile 里相应路径
CROSS = mipsel-openwrt-linux-uclibc-
CC = $(CROSS)gcc
...


OpenWRT 交叉编译文档:

配置 PATH 和 STAGING_DIR 环境变量
~/.bashrc:
export PATH=$PATH:/path/to/toolchain_root/bin
export STAGING_DIR=$PATH:/path/to/toolchain_root

Pass the host and build to the build system of the package to trigger cross-compile
  • For GNU configure, use --build=architecture-unkown-linux-gny --host=architecture-openwrt-linux-uclibc (for example: ./configure --build=x86_64-unkown-linux-gnu –host=mips-openwrt-linux-uclibc)
    • Run ./config.guess to get the --build= option.
    • Check the output and ensure that 'checking whether we are cross compiling… yes' is yes.
  • For GNU make, override the CC and LD environment variables (usually not needed if GNU configure was used)
    • make CC=architecture-openwrt-linux-uclibc-gcc LD=architecture-openwrt-linux-uclibc-ld
architecture: mipsel, arm, x86_64

GNU configure

对于 brcm47xx mipsel 架构的路由器:
./configure --build=x86_64-unkown-linux-gnu --host=mipsel-openwrt-linux-uclibc

但很多软件包的源码并不支持这种 ./configure 这种配置方式 (虽然也用了 GNU Autoconf).

GNU make

make CC=mipsel-openwrt-linux-uclibc-gcc LD=mipsel-openwrt-linux-uclibc-ld

如果需要链接第三方动态库 / 头文件, 用 CPPFLAGS 和 LDFLAGS 参数:
CPPFLAGS=-I/path/to/header/files LDFLAGS=-L/path/to/dynamic/library/files

貌似最新版的 OpenWrt toolchain (OpenWrt toolchain brcm47xx mipsel (barrier breaker 14.07) ) 里存在一个 Bug, 可能导致编译器链接时出现 "undefined reference to `dlclose'" 错误, 解决方法:

in toolchain/bin/mips-openwrt-linux-uclibc-wrapper.sh,
TOOLCHAIN_SYSROOT="$TOOLCHAIN_BIN_DIR/../.."
This pointed to the parent of the actual toolchain directory, correcting it by changing to
TOOLCHAIN_SYSROOT="$TOOLCHAIN_BIN_DIR/.."
Then whole process works fine again.

已测试交叉编译软件包

路由器: Asus RT-N16 (mipsel 32位架构)
固件: ddwrt K3 r24461 big (3.10.44 内核)
工具链: OpenWrt toolchain brcm47xx mipsel (barrier breaker 14.07) (gcc-4.8-linaro_uClibc-0.9.33.2)
编译宿主环境: Ubuntu 14.04 X86_64

注: 部分包可以通过 ipkg / OPTW2 下载, 建议优先下载已有的package, 自己编译麻烦. 如果 ipkg / OPTW2 没有可以到 OpenWrt 的 Repository 里找找看 ipk 下载.

软件包交叉编译情况备注
netstat-nat-1.4.10.tar.gz (查看当前系统 NAT 连接信息工具)./configure
修改生成的 Makefile 里 CC 编译器命令为 mipsel-openwrt-linux-uclibc-gcc
make CC=mipsel-openwrt-linux-uclibc-gcc LD=mipsel-openwrt-linux-uclibc-ld

traceroute 2.0.20修改 Make.rules, 设置 CROSS 变量:
$(call set, CROSS, mipsel-openwrt-linux-uclibc-)
修改含有 LDFLAGS 的另一行
$(call set, LDFLAGS, -s -L../libsupp)
make 即可

make CROSS=mipsel-openwrt-linux-uclibc- LDFLAGS= -L../libsupp

修改 traceroute.c/traceroute.c, 注释掉 getaddr 函数里下面一行代码 (否则程序在路由器上运行出错):
//hints.ai_flags = AI_IDN;

iputils-s20121221 (提供 ping, arping, traceroute6 等工具)修改 Makefile 里三行:
CC=mipsel-openwrt-linux-uclibc-gcc
ADDLIB= -lm -L$(STAGING_DIR)/lib
USE_CAP=no
make
貌似编译部分成功, 不过我就需要里面的 ping 工具.
iptables 1.4.21 (2013.11.22)
./configure --build=x86_64-unkown-linux-gnu --host=mipsel-openwrt-linux-uclibc --prefix=/opt/sagan --enable-libipq --with-xtlibdir=/opt/sagan/lib/iptables --sbindir=/opt/sagan/bin
make
make install

iproute2-3.16.0 (2014.08) (最新完整版的 iproute2, ddwrt 自带的不支持 -batch 选项)
修改 ip/ipnetns.c, 注释掉 #ifndef HAVE_SETNS 和对应的 #endif 两行, 让程序使用自己静态包装的 setns 函数, 否则编译出错

//#ifndef HAVE_SETNS
static int setns(int fd, int nstype)
{
#ifdef __NR_setns
return syscall(__NR_setns, fd, nstype);
#else
errno = ENOSYS;
return -1;
#endif
}
//#endif /* HAVE_SETNS */

make CC=mipsel-openwrt-linux-uclibc-gcc LD=mipsel-openwrt-linux-uclibc-ld
编译了一半出错, 不过需要的 ip 已经编译成功了 (ip/ip), 测试可运行, 所以报的错误就不用管了- -
libmnl-1.0.3.tar.bz2 ./configure --build=x86_64-unkown-linux-gnu --host=mipsel-openwrt-linux-uclibc
make
编译生成的动态库位于 src/.libs

这个包是单纯动态库, 没有任何依赖, OpenWrt repository 里有, 建议直接安装.
ipkg install libmnl
ipset-6.23.tar.bz2先交叉编译依赖的 libml;
./configure --build=x86_64-unkown-linux-gnu --host=mipsel-openwrt-linux-uclibc --with-kbuild=/storage/ddwrt/kernel/linux-3.10-svn24461

make CPPFLAGS=-I/home/sagan/files/dev/src/libmnl-1.0.3/include LDFLAGS=-L/home/sagan/files/dev/src/libmnl-1.0.3/src/.libs
configure 时需要用 --with-kbuild 链接内核源码地址 (可以从ddwrt svn下载对应版的)

make 时需要制定 libml 的头文件和动态库文件路径

编译好的可执行文件位于 src/ipset.
程序依赖 libmnl.so.0

这个包 OpenWrt 的 repository (14.07 / snapshot) 里有 6.20 版, 建议直接安装 ipkg install ipset






编译内核模块

首先看看自己需要的内核模块是否已经包含在固件里了:

find /lib/modules/$(uname -r) -name "*.ko"

如果有, 在启动脚本里加入命令加载:

insmod /lib/modules/$(uname -r)/path/to/module.ko

如果没有, 可以自己编译. 但网上有一些编译好的内核模块 package 可以下载, 如 OpenWrt 的 kmod-* 包, 不过需要与自己的路由器 soc 类型和内核版本严格对应. 对应 brcm47xx 3.10.44 内核的 OpenWrt 的 repository 是 barrier_breaker 14.07-rc1, 里面的 kmod-系列内核模块包大部分应该都可以在 RT-N16 的 ddwrt K3 r24461 big (3.10.44 内核)固件里加载 (不过 big 版的 ddwrt builld 内核已经编译进去很多功能, 还有很多模块则已经编译好包含在固件里了, 直接可以加载).

下载对应内核版本的 ddwrt linux kernel 源代码, 需要严格匹配内核版本和 ddwrt svn 版本

svn co svn://svn.dd-wrt.com/DD-WRT/src/linux/universal/linux-3.10 -r 24461

编译需要 ddwrt 自己的工具链.下载, 解压缩后有一堆工具链文件夹, 编译内核模块需要的是"toolchain-mipsel_gcc4.1.2" 文件夹里的工具链. 将 "toolchain-mipsel_gcc4.1.2/bin" 目录加入 PATH

cd /opt
wget ftp://ftp.dd-wrt.com/toolchains/toolchains.tar.xz
tar jxvf current-toolchains.tar.bz2
PATH=$PATH:/opt/toolchain-mipsel_gcc4.1.2/bin
根据路由器架构, 将对应的 .config_XX 文件复制为 .config. 以 brcm mips 的路由为例:

cp .config_bcmmips .config

配置编译选项 (这里 mips == mipsel) (或者手工编辑 .config, 将需要编译的内核模块设为 m, 但不推荐, 需要自己处理依赖关系)
make menuconfig ARCH=mips

编译 ( 先编译一次内核再编译一次内核模块?)

make
make modules ARCH=mips

如果遇到 "drivers/net/wireless/Kconfig:284: can't open file "drivers/net/wireless/rt3352/rt2860v2_ap/Kconfig"" 错误, 修改 drivers/net/wireless/Kconfig, 注释掉相关代码(Ralink 驱动, svn中没有)

#if RALINK_DEVICE
#source "drivers/net/wireless/rt3352/rt2860v2_ap/Kconfig"
#source "drivers/net/wireless/rt3352/rt2860v2_sta/Kconfig"
#endif
# if SOC_MT7620_OPENWRT
# source "drivers/net/wireless/rt7620/rt2860v2_ap/Kconfig"
# source "drivers/net/wireless/rt7620/rt2860v2_sta/Kconfig"
# source "drivers/net/wireless/rt5592/Kconfig"
# source "drivers/net/wireless/rt7612/rlt_wifi/Kconfig"
# endif

如果遇到 " ERROR: "emfc_exit" [drivers/net/wl/wl.ko] undefined!" 错误, 将.config 里 CONFIG_WL 编译选项设为 no

CONFIG_WL=n

如果遇到 "Debug Mismatch" 错误, 关闭CONFIG_DEBUG_SECTION_MISMATCH 编译选项

CONFIG_DEBUG_SECTION_MISMATCH=n

也可以用 make 的参数传入选项

make CONFIG_DEBUG_SECTION_MISMATCH=n modules

已测试编译的内核模块

Asus RT-N16 / ddwrt K3 r24461 big (3.10.44内核) svn 24461

模块选项 (.config)说明
xt_owner.ko (netfilters iptables owner模块)CONFIG_NETFILTER_XT_MATCH_OWNER=m增加 iptables 匹配进程 uid/pid / gid MATCH 选项: ( This module attempts to match various characteristics of the packet creator, for locally generated packets. This match is only valid in the OUTPUT and POSTROUTING chains. Forwarded packets do not have any socket associated with them. Packets from kernel threads do have a socket, but usually no owner. )

-m owner
[!] --uid-owner username
[!] --uid-owner userid[-userid]
Matches if the packet socket's file structure (if it has one) is owned by the given user. You may also specify a numerical UID, or an UID range.
[!] --gid-owner groupname
[!] --gid-owner groupid[-groupid]
Matches if the packet socket's file structure is owned by the given group. You may also specify a numerical GID, or a GID range.
[!] --socket-exists
Matches if the packet is associated with a socket.

除了内核模块, 还需要用户空间 iptables 的动态库 libipt_owner.so (ddwrt 默认 iptables 不包含任何 extension, 需要自己编译 iptables )
IPV6 相关

ip6_tables.ko
nf_defrag_ipv6.ko
ip6table_filter.ko
ip6table_mangle.ko
nf_conntrack_ipv6.ko
CONFIG_IP6_NF_FILTER=m
CONFIG_IP6_NF_MATCH_RPFILTER=m
CONFIG_IP6_NF_MATCH_RT=m
CONFIG_IP6_NF_RAW=m
CONFIG_IP6_NF_MANGLE=m
CONFIG_NF_NAT_IPV6=m
big 版的 ddwrt 已经内置了相关内核模块 (只是没有默认载入):
find /lib/modules/$(uname -r)/kernel/ -name *6*
在启动脚本里增加所需要的模块 ( ipv6, ip_tunnel, sit 三个模块 ddwrt 默认载入, 如果在 web 管理界面开启 IPV6 的话)

insmod ip6_tables
insmod ip6t_REJECT
insmod ip6table_filter
insmod nf_defrag_ipv6
insmod nf_conntrack_ipv6









Glype Proxy 在 nginx 下 GBK 网页乱码问题

Glype 是一个 php 的 web 在线代理程序。最近发现在 nginx + php-fcgi 环境下用 Glype 打开部分 GBK 编码的网站会出现乱码。

这个问题原因是 nginx 中设置了默认字符编码:

charset utf-8;

如果 php 传递给 nginx 的 http header 中的 Content-Type 没有 "charset", 则 nginx 会把设置的默认编码附加上去:

php 发送的原始 header: Content-Type: text/html
nginx 实际发送的 header: Content-Type: text/html; charset=UTF-8

Glype 会原封不动将目标网页的原始 Content-Type header 发送给浏览器。而某些网站(比如百度)的 http header 的 Content-Type 并不包含 charset,如果这些网页内容是非 UTF-8 编码, 在浏览器下就会出现乱码。

workaround (保留 nginx设置不变)

修改 Glype 的 browser.php 文件,在 Request 类的 processHeaders 方法最后加上下面代码:

if( !$charset )
header("Content-Type: " . $mime . '; charset=');

如果网页的 Content-Type 没有 charset,强制设置一个空的 charset 值。



ラブライブ!スクールアイドルフェスティバル 游戏资料

ラブライブ!スクールアイドルフェスティバル 游戏资料

最近 (2014.10)在玩这个. 略手残.

Android

游戏会检测 Root, 发现已 root 的机器后会拒绝运行. 规避方法: 安装 Xposed 框架的 RootCloak 插件并把 LoveLive! 加入屏蔽 root 列表 (不确定是否已经在列表中). 然后首次运行游戏前需要在 RootCloak 的 "commands hidden list" 里删除 "su"命令, 游戏首次运行下载资源完毕后可以添加回去, 否则首次运行时一直黄屏.

IOS: 未尝试越狱后机器是否可以运行, 发现不知道什么时候 Apple 把我日区 iTunes 账号封了我去.


刷初始

所谓刷初始就是创很多小号利用系统送的劝诱券和30心去抽UR,挑出小号中刷初始抽卡抽出UR的号作为初始最好的开局. 刷初始需要至少两台设备 (IOS / Android) (或使用 PC 上 bluestack Android 模拟器).

A 设备上创建帐号, 引继到 B 设备上, 则再次打开A设备上的 LL 时可以重新创建新帐号玩. 注意引继后要在 B 设备上重新生成一次继承码 (原继承码使用一次后失效)

备份账户

生成继承码后保存即可. 继承码有效期1年, 使用一次后失效必须重新生成.

卡片

N (1-2星,等级MAX30-40, 满级经验值 4475 / 8000)
R (3-4星,等级MAX40-50, 满级经验值 6725 / 13500)
SR (5-6星,等级MAX50-60, 满级经验值 23803 / 36800)
UR (7-8星,等级MAX60-70, 满级经验值 59408 / 79700)

觉醒 (特别练习)需要两张相同未觉醒卡 (饲料那张卡等级 / 属性无用).

值得培养的 R 卡:
红: 果果 凛喵 妮可 (笨蛋三人组)
绿: 花阳 小鸟 希魔王 (傲娇三人组)
蓝: 会长 真姬 海爷 (剩下三个 )
口诀: 红凛果妮绿花鸟希蓝海绘姬. (关于傲娇, 笨蛋等属性参考动画)

练习

就是给一张卡片喂其它卡片 (狗粮)升级,

练习结果大部分情况是“SUCCESS",低概率出现“SUPER SUCCESS" 或“ULTRA SUCCESS" . SUCCESS是获得正常练习经验,SUPER SUCCESS是1.5倍经验,ULTRA是2倍经验.

练习的时候用同样的颜色作为陪练有百分之20的经验加成,比如你1级蓝色N卡喂给红色卡是有100点经验,那么喂给蓝色卡的话就有120点经验了

N卡觉醒满绊满级的话就可以喂给下一张卡片了,不同色的4000经验,喂给同色的就有4800经验哦,可以让N卡从1级升到27级

重复的R卡看属性,高属性的可以继续升级充实卡组,低属性的可以用来升技能(喂给其它相同技能 R 卡).

氪金

11连抽花费 50 心 = 3000 日元, 约合不到 200 RMB. 一般能获得1张SR就不错了. 有活动时, 11连抽必获得1张SR.


非洲 / 欧洲 / 欧洲卷

貌似是中文圈比较流行的黑话, 欧洲卷指"輔助チケット", 花费5张可以进行"SR・UR勧誘"抽卡, 各有 80% 和 20% 几率获得一张 sr 或 ur 卡. 相比之下, 通常的氪金11连抽大多数情况下最多获得1SR + 10R (有保底时), 甚至只有11R. 所以把这种"輔助チケット"叫做欧洲卷, 具有欧洲人 / 皇室的风范 (或者是指到欧洲旅游的机票), 相比之下普通抽卡的水准就像非洲人一样 (或者说脸黑). 其它的说法还包括: 欧洲机票 / 飞机票. 另外, 如果欧洲卷只抽到了 sr 卡, 就叫坠机, 抽到了 ur 卡才算成功飞到欧洲了.

"輔助チケット" 获得方式: 游戏帐号 Rank 每提升 20级 (0, 20,40,60...) 获得一张; 每累积花费50心抽卡获得一张; SM / 传统活动进入前X排行榜可以获得若干张; (活动进排名送的是"勧誘チケット", 作用是直接进行一次单抽)











お兄ちゃん、右手の使用を禁止します! 游戏剧情

お兄ちゃん、右手の使用を禁止します! 游戏剧情

别名: おに禁

算拔作, 不过还蛮甜的.

游戏特典
予約特典 「のぞきみダイアリーパッチ」 (iso): 游戏增强补丁, 追加妹妹第一人称视角 Scene Replay
げっちゅ屋特典 録り下ろしドラマCD 「お兄ちゃん、年上な事を禁止します!」(1 CD): Drama CD, 18X
ソフマップ特典 録り下ろしドラマCD 「お兄ちゃん、一人で寝るのを禁止します!」(2 CD): Drama CD, 18X
メディオ!特典 ドラマCD 「お兄ちゃん、明かりを点けるの禁止します!」 (1 CD): Drama CD, 18X


妹尾 つぐみ (いもお つぐみ) CV:橘まお



妹尾 あゆか (いもお あゆか) CV:こたつみやこ





妹尾 かえで (いもお かえで) CV:姫川あいり (姫川あいり=峰岸由香里, 其它作品: めちゃ婚! 淡島茜, FORTUNE ARTERIAL: 東儀白)





妹尾 ゆき (いもお ゆき) CV:唯香


基本的线路选择就是主角右手"受伤"后每天选择哪一个妹妹来照顾自己, 然后那个妹妹每天放学后会来主角的住处, 帮主角做家务, 尿尿, 一起洗澡, 暖床 etc. 主角逐渐对妹妹产生超越普通喜欢的情愫, 把她当作女孩子对待, 妹妹一直以来对哥哥的喜欢之情也迸发出来...全部4个妹妹攻略后,重新从最初开始游戏, 谁都不选择, 进入后宫路线.

在游戏初始画面里可以选择输入"特殊码":

" うりけせ": お兄ちゃん隠しコード 输入后, 可以在Config设置按 F8 切换选择屏幕上是否显示主人公名字 「裕人」(「ヒロト」). 来源: 官方开发Blog

其它一些特殊码会开放 Scene 回想查看功能中"おまけ"的一些栏位, 主要是一些制作者评论. 获取方式:先到官網的 creators topic 頁面: 再點那些creator的個人主頁或Twitter連結,在其中尋到 patch code. 如原畫的ひさまくまこ爲「わなのふ」:http://mocochouchou.net/

>3.『Extra内のおまけについて』
一度クリアすると現れる【Extra】→【SCENE REPLAY】→【おまけ】にある枠は、
各クリエイターコードで開放されるおまけ枠です。

おに禁オフィシャルサイトの【クリエイターズトピック】にて公開されている
各クリエイターさまのリンク先や、ツイッターなど、様々な形で公開されておりますので、
興味のある方は訪ねてみていただければ幸いです。
http://glace.me/weblog/2014/09/26/onikin0926/

所有的隐藏码(来源):

妹妹CV
つぐみ なこだて
あゆか こしちう
かえで もにんと
ゆき つりもせ

原画家
K子 かいてり
ひさまくまこ わなのふ

OP
薬師るり きらちを

ED
夜桜真里亜(つぐみED) なにるか
南野Emily(あゆかED) たとなた
ハルセカンド(かえでED) みためす
保科めぐみ(ゆきED) うひかと
anporin(ハーレムED) こにのし

后宫路线解锁: うりけせ

男主名字隐藏 设定页面下按F8


妹尾 あゆか 线

次女, 喜欢给哥哥膝枕, 还有69式侧卧的双向膝枕. 小的时候主角经常照顾她.

基本没啥剧情, 中途主角去学校接 あゆか 一起放学, 结果为了保护あゆか又被卡车撞了一次, 这次真正受伤严重, 右手甚至有可能留下终身影响, 妹妹们特别是あゆか来医院照顾主角. 最后主角平安完全康复.

结局是主角和あゆか同居了, 并且得到了父母的许可 (貌似由于其他妹妹们帮助说服父母).


妹尾 つぐみ (いもお つぐみ)线

长女, 喜欢像猫一样从后面趴在哥哥肩上亲昵.擅长料理. 小的时候和主角玩的最多, 经常发生小孩子之间的吵架.

没啥剧情. 自然而然的就H了, 后来主角尝试把つぐみ当作恋人(而非妹妹)对待, 和她以恋人身份去游乐场约会, 约会中虽然很开心但总感觉到违和感, 主角终于发现妹妹对自己而言是比恋人更重要的存在. つぐみ对自己而言世界上是最爱的妹妹.

结局是つぐみ得到父母许可 (条件是主角的家务事自己做, 不过つぐみ可以帮哥哥做饭), 搬到主角住处隔壁来. 每天和主角过着性福生活.


妹尾 かえで 线

三女. 处于反抗期的有点傲娇的少女, 非常喜欢哥哥, 但是常常言不由衷(标准的傲娇, 经常说出「別にーじゃない」这种句式), 不过由于非常不擅长做作掩饰反而让哥哥觉得可爱, 心情被哥哥戳穿时掩饰害羞的嗔怒也很可爱. 虽然在家里(哥哥面前)很残念, 但在学校成绩优秀表现活跃, 是学级委员长. 喜欢玩游戏. 小时候经常尿床. 小时候经常坐在哥哥膝盖上和主角一起玩游戏 (并且经常屏幕上已出现强敌就吓的尿漏出来), 不过现在因为傲娇有些不愿意, 但是让哥哥抱坐的时候仍然非常开心. 喜欢哥哥夸奖自己, 经常说出好像等待哥哥夸奖的话, 很容易读懂. 正处于思春期, 对于性的事情朦胧般感兴趣却又一知半解. 不喜欢被当成小孩子对待, 但是言行举行到现在仍然像小孩子一样可爱.

没啥剧情. かえで来照顾主角, 主角问她有没有喜欢的人, かえで却说最讨厌男生了, 男生都是满脑子H的变态. 期间かえで的学校发生一件事情, 一个男生把一本H书带到学校来, 书里面的人物很像班里另一位女同学, 结果给发现了, 然后把那位女同学弄哭了, かえで于是作为委员长斥责了那位男生. 回到家かえで把这件事告诉主角, 主角为了纠正かえで对性和男生的错误厌恶情感, 告诉她自己也和她班上的男生一样, 会用H的目光看女孩子, 于是かえで为了"不让哥哥成为H的变态和犯罪者", 决定"自己来承担哥哥的性欲".

某日, かえで从男生那里看到一本内容非常H的女性杂志, 被老师发现了以为是她带到学校的, 批评了她, 还把かえで母亲也叫到学校来. かえで回到主角住处, 与主角"实践"杂志里的"恋人经验之谈", 假装恋人表演杂志文章里台词, 又经过一点小风波, かえで终于表达表达出了自己对哥哥的情感, 主角也坦诚认识到かえで对于自己是特别的人.

主角到かえで学校给她送忘带的体操服, 在体育仓库和穿普鲁玛的かえでH. 和かえで的同学交谈, 发现原来かえで的同学都知道かえで的傲娇性格, 喜欢逗弄它(无恶意), かえで在学校也是残念的学级委员长(本人似乎未察觉).

某日, かえで和哥哥在浴室里玩水着 & SM Play (CG 上明显是かえで两手上戴着锁链, 不过奇怪的是对话里一句都没提到), 受凉, 第二天かえで感冒了, 学校请假在家休息. 主角骗かえで说精液可以治疗感冒, 和她乳交把精液射她一脸还让她吞下去. 妹妹们来主角住处看望かえで, かえで却因为哥哥而对姐姐们起了奇怪的敌对意识, 不过最终姐妹们和解了, 决定公平竞争哥哥. 但是之后かえで再来主角住处时却显得灰心丧气, 原来她觉得自己完全没能照顾哥哥, 只是和哥哥一起玩而已, 自己仍然还是小孩子, 没有资格竞争哥哥, 这时主角告诉かえで自己本来就把她当作小孩子, 但かえで对他仍是特别的人, 因为他们兄妹两个都是"残念"兄妹.

结局: かえで从傲娇毕业了, 变成中二病了, 自己写了一本"禁书", 里面设定哥哥是从天上神界受到嫉妒而被发配到人间的"兄神", 四个妹妹们是追随哥哥来到人间的守护天使...里面还有自己的手绘插图, 图中哥哥的右手和头用锁链连在一起, 上身赤裸(かえで为了不让哥哥用右手, 每次主角洗澡时都会让他戴上锁链.), 她自己是暗黑魔法少女, 右手被绷带包着, 通过这个运用哥哥被封印的右手力量. 然后かえで想让哥哥和自己一起去表演这本原创本子的Cosplay, 还让姐姐们帮她制作服装. 于是主角很快乐地去和かえで一起参加Cosplay表演了.


妹尾 ゆき 线

最小的妹妹. 天使一般可爱. 因为还小, 什么家务都不会做, 但是却让人感到治愈. 喜欢抱在哥哥身上. 睡觉时要抱着名字叫こゆき(名字是かえで起的)的粉红色兔子玩偶, 不然睡不着.(王道设定) 和哥哥發郵件聯繫時每次都會寫很多句, 因為非常喜歡哥哥, 不自覺地情感外露出來.

帮哥哥做什么事都是失败, 于是主角把她抱在膝上让她代替自己右手点鼠标浏览18X商品售卖网站.

某日, 主角外出对便利店买东西, 却偶然发现ゆき在翻他藏在床底的H书, 原来ゆき对性很感兴趣却不懂, 问姐姐かえで却被骂. 于是主角决定自己教育ゆき正确的性知识. 主角和 ゆき一起玩 H Game (galgame), 然后主角教ゆき如何正确地オナニ并从中获取快感. 之后情节就是H, 第一次因为ゆき那里太紧没有插入成功, 结果用肛交代替. 第二次做时候通过爱抚成功插入. 之后情节就是啪啪啪

主角去医院检查, 发现右手情况反而恶化了(但仍然只是挫伤而已), ゆき以为是自己没能帮哥哥的忙造成的, 陷入消沉和自责, 差点离家出走. 主角劝慰ゆき, 告诉它只要她在自己身边, 哪怕是给他添麻烦, 他也感到很幸福和快乐. ゆき决定一直陪在哥哥身边, 总有一天要成长为能与哥哥相配的人.

结局是ゆき成长了, 无论是在H方面还是生活方面. 最后在学校的舞台剧"うさぎとかめ" (兔子与乌龟)表演中ゆき扮演兔子. 而且这次表演的"兔子与乌龟"和普通的版本的 (就是龟兔赛跑的故事, 兔子嘲讽乌龟跑的慢, 两人赛跑, 兔子一开始跑得快, 得意洋洋, 在到达终点前开始睡觉, 醒来时一点点慢慢跑的乌龟已经先到达终点了, 兔子后悔不已)不同, 这个剧本中兔子是主役. 情节是中赛跑中兔子被乌龟骗了, 乌龟跑在前面, 兔子反而在后面拼命地追赶. 小ゆき努力又可爱的表演让在场观看所有人都为她应援. Over.







Foobar library 设置文件类型

Foobar library 设置文件类型

Foobar 的 Library 设置中, 可以设置需要索引的文件类型. 推荐的设置是:

*.cue;*.aac;*.mp3;*.wma;*.ogg;*.m4a;*.mka; 0*.flac;1*.flac;2*.flac;3*.flac

上面的设置索引了主要有损文件和 cue 文件. 同时用 " 0*.flac;1*.flac;2*.flac;3*.flac" 这种写法索引分轨专辑的 Flac 文件, 但又不会索引其它自带 cue 文件 的 flac 文件 (多以非数字字符开头)

恋しよっ?游戏剧情

恋しよっ?游戏剧情


半个拔作, 个人线剧情很短. 而且偷工减料严重, 连 H CG 都大打折扣, 差分 CG 都没几个.

ブランド とりぷる・すれっと
発売日 2013-05-24
原画 夏桜 , ツカモリシュウジ(サブ) , mizuki(SDイラスト)
シナリオ 北川晴 , Hatsu
音楽 松本慎一郎(M.U.T.S.MusicStudio)(OP曲) , 五十嵐芳樹(BGM、ED曲) , M.U.T.S.MusicStudio
声優 奏雨(渡良瀬 優美) , ヒマリ(陽茉莉)(日月 咲) , 北見六花(都野田 雅) , 有坂羽由(矢野 綾) , 上原あおい(円藤 琴子) , 小倉結衣(羽生 知花)
片倉ひな(古田 彩希) , 堀川忍(川原 真理) , 陸奥出流(鳴海 正貴) , 水上司郎(内海 涼夫)
中澤歩(中澤アユム)(その他) , 韮井叶(その他) , かも(その他) , 八王子タカオ(その他)
歌手 西沢はぐみ(OP曲 「キミと恋しよっ!」) , 葉月ゆら(ED曲 「夢を照らす道しるべ」)
その他 北川晴(ディレクター) , 田中一郎(進行管理補助) , キューン・プラント(背景) , 松根マサト(matsuNe)(アートディレクション・デザインワーク、OP・EDムービー、Web制作) , 新庄ひなた(Web制作) , studioCLEF(収録スタジオ) , ワームスエンタテイメント(スクリプトエンジン QLiE) , Ko-Ta(システム/ゲームアニメーション) , AZ creative(手配協力)

系统

游戏系统不错, 对多屏支持良好, 全屏运行时, 鼠标移动到别的屏幕时不会跳出游戏.

按鼠标右键切换文本对话框是否显示; 文本对话框关闭时, 点击鼠标左键放大屏幕画面, 然后移动鼠标改变画面中心位置.

ED 动画可以跳过(单击即可), 不错.

CV

矢野綾: 有坂羽由 (有坂羽由=遠藤沙哉=岡嶋妙=茅野ましろ=汐見凛=遠野そよぎ=成瀬ゆら)
円藤琴子: 上原あおい
羽生知花 (はぶちか): 小倉結衣
渡良瀬優美: 奏雨
都野田雅 (つのだ みやび): 北見六花(小野涼子)
日月咲(saki): ヒマリ



OP: キミと恋しよっ!/西沢はぐみ

共通线

主角和众人去海边玩(以打扫垃圾义务劳动的名义获得学校许可), 选择项是与哪位女主角搭话. 则之后剧情中主角会决定将自己的りんぐ (ring, 手链, 恋爱学园入学时发给每个学生3个的道具, 遇到心仪的对象时送给对方. 如果入学很长时间仍然一个都没有送出去会被教育甚至惩罚以致退学.如果把对方送的和自己原有的りんぐ连在一起(两个不同颜色)戴在手上, 则表明自己和对方是couple?)送给那位女生 (为了满足恋爱学园规定), 以此为契机主角和那位女生开始逐渐交往.

知花 线

两人相遇背景是主角在街上遇到她被小混混学生纠缠, 出手相助, 用公主抱带着她一起逃跑. 于是知花爱上了主角, 提出把りんぐ送给主角. 被婉拒.

主角在食堂与后宫嬉戏打闹时发生意外, 面条洒了, 为了保护知花主角自己被面条洒了一脸和上半身, 回去后洗了个冷水澡结果就生病了, 知花和咲还有基友来探望. 知花为主角擦身体(咲和基友一旁看, 羞耻play), 做粥喂给主角吃.

主角为了表示知花来看病的谢意, 在其它后宫的撺掇下, 决定了与知花去约会.

星期六(土曜日, 学园约会日), 主角和知花约会, 一起去约会, 知花想买性感的泳衣, 但主角对她说最喜欢她现在的可爱风格. 然后又去海边, 期间遇到另一对笨蛋情侣, 男的想在海滩上就与女生交欢, 女生不愿意, 于是答应回去后再补偿男的(胸部夹), 期间两人羞耻的对话被主角和知花听到, 但知花似乎对这方面事情一无所知, 问主角那对情侣说的话什么意思, 被主角糊弄过去了. 主角和知花愉快地玩耍, 夕阳下的海边, 知花亲吻了主角(初吻), 再次表达爱意并将りんぐ赠送给主角, 主角接受并同样送出自己的りんぐ. 但两人并没有正式成为couple?

第2天来到学校, 学校流传着主角已经和知花H过的传言, 主角惊讶地发现传言根源竟然是如花, 是如花自己对朋友说自己和主角已经 goal in, 自己已经是属于主角的之类的话. 原来如花对性这一方面真的是一无所知, 是憧憬像少女漫画一样的浪漫的天真纯净女孩子.这是她的初恋, 和主角相遇, 坠入爱河, 然后交往这段经历就像少女漫画里的情节一样, 让她心儿怦怦跳. 如花的倾诉让主角动摇了, 主角一直不想成为像父母那样的恋爱傻瓜, 但他发现和如花在一起时候很快乐, 如花的倾情话语更让他感动, 两人在天空(地点是学校校舍天台...)下拥吻. 这次是主角主动而强力地求索.主角的欲望萌发了, 舌吻不断延续, 主角用手隔着衣服抚摸如花虽小却膨胀的胸部. 但是主角抚摸却让如花感到害怕, 当主角把手伸向如花内衣时, 如花推开了主角.

原来知花在家里受到父亲和两个哥哥无微不至宠爱, 是"箱入り娘"型的大小姐, 对性一无所知, 主角深吻让她感到莫名和未知的悸动(快感), 故而害怕. 咲告诉知花恋爱不仅要主动出击, 而且还要接受男性的求索. 知花似有所悟, 傍晚放学后的教室, 知花来到主角教室, 空无一人, 知花突然感到内心涌出奇怪感觉和欲望, 于是在主角的桌子上オナニ。被主角发现了. 在主角的连续求索下知花终于决定接受主角, 于是H. 之后剧情啪啪啪.

某日, 咲突然决定要转学. 其自称是因为家庭原因, 但具体没有多说. 对于知花和主角而言, 咲是他们能够在一起的"恩人". 他们想在咲离开前为她做些什么来报答和表示感谢. 于是众人秘密策划在咲离校之前在食堂(这个地方对于主角和知花有特殊意义, 她们恋爱过程中遇到问题时就是在这里接受咲和众人的建议和咨询的)办一个惊喜Party给咲送别. Party当天, 知花的父亲突然来到现场, 原来她听说知花竟然和某个不知道从哪里来的臭小子恋爱了, 来想把知花带回家, 于是主角对知花的父亲当众宣言自己对知花的爱情, 知花也对父亲说自己不是小孩子了, 主角是她最喜欢的人, 等等戏码, 让咲看戏看得很开心. 结果知花父亲大受 shock, 终于放弃把知花带回家的念头. 咲在众人的祝福中离开了恋爱学园. (咲转学的真正原因可能需要在其个人线里才明朗)

结局: 恋爱学园发挥着越来越大的作用, 社会人口有回升的趋势. 主角和知花相遇8年后, 主角和知花重新回到菊理学园, 一起作为老师, 以"恋爱前辈"的身份, 开始指导新一代的学生们恋爱. 知花老师在女学生中特别受欢迎, 经常有女学生来找她恋爱咨询, 因为经过她的恋爱相谈后恋爱成功率确实会上升. 知花总是津津乐道地把自己的亲身经历说给女学生们听(要勇敢地向喜欢的男生表达心意), 这时主角就会吐槽她, 正因为听到知花和主角两位老师笨蛋情侣的对话(痴話), 来咨询的女学生的烦恼就会不知不觉消散了. 主角和知花的左手无名指上戴着同样的戒指, 一直是关系良好甜蜜夫妻, 知花已经怀孕5个月了, 非常幸福. 知花告诉前来咨询的女学生, 恋爱不是"一方通行", 不仅需要把自己的心意传达给对方, 还有必须接受对方的回应, 反过来也是同理. 她鼓励女学生勇敢地告白, 恋爱的女生冲冲冲. Over.



日月咲 线

二周目(任意角色 clear 后)可攻略 (可以直接读取一周目的分歧点存档).

只有两个 Scene, 纯坑爹.

主角无意间在夜晚空无一人的食堂听到咲在用公共电话和父亲通话, 电话中咲的说话方式与平时(那种爽朗, 喜欢开玩笑的风格)判若两人, 有点撒娇的感觉, 并且流露出很爱她的父亲(说出"パパ大好き"之类的话), 从电话里听感觉咲好像有心事顾虑. 然后偷听的主角被咲发现了, 主角很干脆地承认听到了并且向咲道歉, 于是咲把自己的心事和秘密告诉了主角.

原来咲的母亲以前是一个有钱人家的大小姐, 和咲的父亲交往后被父亲(咲的外公)反对, 于是咲的父母私奔结婚了, 咲的母亲家里震怒, 和咲的母亲断绝了关系. 但是咲的母亲身体不好, 一直在治病, 现在还在住院中, 咲的父亲为了挣咲母亲的医疗费现在正在国外工作 (同时也是为了在国外寻找新的治疗方法). 咲很爱她的父母, 同时非常感激母亲身体不好却仍然生下她. 她想留在母亲身边照顾她, 但她又憧憬母亲和父亲在学园里相识并恋爱的这段经历, 自己也想有这种爱情, 所以才来到恋爱学园. 但咲仍然一直在想是否要离开学园回到母亲身边.

主角劝慰咲, 对她说她的父母也一定希望她留在学园追寻自己的幸福的. 主角知道了咲的事情, 对她保证不会告诉别人, 于是两人有了共同的秘密, 以此为契机, 两人的关系开始亲密以来, 咲每天晚上都会打电话给主角和他聊天, 主角也经常在咲(因为母亲事情)心情低落时候安慰她. 主角渐渐发现自己喜欢上了咲, 但是说不出口, 因为咲和他约定过只做朋友的 (其实是咲逞强, 她自己也喜欢上主角了).

某日, 咲又接到医院电话, 母亲状况不佳. 咲来到主角房间向他倾诉, 还哭了出来. 主角把咲抱在怀里安慰, 然后吻了她, 主角欲望突然迸发, 于是顺势把咲推倒, 咲并没有抗拒,于是两人H.

H之后, 主角和咲关系更加亲密, 但是两人并没有正式告白或者确认恋人关系 (只是"作为朋友做了H的事情"). 咲母亲状况又不佳, 咲终于决定离开恋爱学园去母亲身边, 主角知道后并没有尝试阻止, 因为这是咲自己的选择. 临行前一天, 咲和主角约会, H.

结局: 咲离开当天, 主角赶到车站送行, 咲和主角互诉爱意, 约定有一天会重新回到恋爱学园后, 离开了学园. 一年后, 主角加入了恋爱学园学生会, 平时的事务很繁忙. 咲离开后逐渐就没有和她有任何邮件联系了, 但主角仍然相信她并没有忘了自己以及他们之间的约定. 升上三年级后的某一天HR (homeroom, 班会)时间, 綾向大家介绍了新的转校生: 咲, 众人大吃一惊, 咲在对同学重新的自我介绍中告诉大家母亲已经出院康复了. 咲当着全班同学的面向主角表示爱意(要把りんぐ送给他), 主角欣然接受. 两人受到班上同学祝福. 撒花, Over.



都野田雅 线

(这条线稍微有点剧情.)

主角和雅都是"不恋爱派", 对恋爱学园这种强制恋爱制度都感到反感, 因此两人惺惺相惜, 成为朋友. 在共通线中主角和雅尝试一起(在夜里偷偷)逃出学园, 被发现制止, 两人于是被惩罚(主角被罚去学生会当义工).

因为恋爱学园规定学生必须送出自己的りんぐ(不然会被惩罚), 主角决定把自己的りんぐ送给雅, 因为雅和自己一样都是拒绝恋爱的. 雅同意了, 与主角交换了りんぐ, 约定假扮情侣. (对她而言这样做不但可以免受学园惩罚, 还可以避免其它爱慕男生的纠缠), 以此为契机, 两人关系变得更近, 逐渐成为好友. 雅告诉了主角她拒绝恋爱的原因(她只告诉过咲一个人, 主角是第二个): 雅是被父母强迫要求进入恋爱学园的, 雅有自己的梦想, 她希望成为一个点心制作师, 将来还想到巴黎学习点心制作, 为了实现梦想, 没有时间和精力去恋爱. 主角知道了雅的秘密后, 经常陪雅一起去逛街(点心店), 雅还让主角试食自己制作的点心. 两人关心越来越亲密, 但雅仍然和主角约定只是亲切的好朋友(親友).

主角逐渐发现自己喜欢上了雅, 但是自己和雅都已经宣称不恋爱所以才成为好朋友的, 如果向雅告白恐怕这段友情都会结束. 而且主角发现自己以前宣称的"不恋爱"只是因为忘不了青梅竹马的邻家姐姐(綾), 而雅的"不恋爱"却是因为自己的梦想, 虽然两人都是"不恋爱", 本质却完全不同, 如果向雅告白就等于背叛了她. 主角非常苦恼. 于是向咲和基友寻求建议(以"朋友的苦恼"的名义), 咲建议主角勇敢告白, 并且对他说他这种犹豫不决心态不是为了对方好, 而只是怕自己受伤. 主角于是终于下定决心.

某日晚上, 雅又来到主角房间让他试食自己制作点心, 主角顺势告白, 果然被拒, 雅惊慌失措, 当场逃离(其实是雅对自己的内心动摇了, 所以逃掉?).

主角与知花约定尝试做三天恋人.(因为知花的要求.)

雅看到知花和主角在一次的场景, 吃醋跑开, 主角追上去, 雅终于说出自己真心. 两人告白拥吻, 确认恋爱关系.

雅向知花说出了自己(对主角)的真心, 向她道歉并得到谅解.

学校中午, 雅做了便当找主角一起吃, 两人到天台结果发现四处都是亲亲热热的couple, 把雅吓坏了(雅还不习惯情侣之间的亲密和恋爱).

雅告诉主角成为专业的点心师需要花费大量的时间和精力(这一职业女性很少), 主角想雅和自己的恋情是不是妨碍了她的梦想了.

主角晚上到雅房间玩, 两人爱抚,亲吻, 正要准备H的氛围时咲来找雅(咲是雅学校唯一好友, 很关心她和主角的事情)了, 主角只能仓皇而逃.

雅在自己房间回想昨天(差点要H的事情), オナニ, 被实现约好来到她房间的主角发现.

约会(是两人交往后第一次正式约会, 但和以前一样, 就是逛了一天点心店, 送一张CG), 雅亲密挽着主角手, 两人关系更加亲密, 开始用名字称呼对方.

约会完两人来到主角(男宿舍)房间, 雅在桌子上看到一本女主角和自己很想的H书, 主角于是对她解释说: 这本书是朋友借给他的, 男生都是很H的, 但他绝对没有那这本书オナニ。雅觉得只有自己オナニ被看了不公平, 于是让主角オナニ给她看, 看到最后帮主角口交射出来饮下去. 然后两人顺势想要H. 结果主角基友突然来电话, 说马上来取之前借给主角的那本书. 雅只得也仓皇逃走.

来主角房间玩, 品尝雅做的点心, 然后第二次口交.

惊喜 party. saki 离校确定.

去海边玩一天, 游泳.

回主角房间, 雅发现每次让主角品尝完自己做的点心后给他口交成了习惯了.

H (本番)

两人为了"报复"双方父母参与指定恋爱法并强迫他们到恋爱学园, 决定给父母们一个小小的"惊喜"(surpise). 雅和主角以庆祝自己和对方开始交往为理由, 邀请双方父母来学校食堂参加自己举行的一个party, 准备工作得到了朋友们的帮助. 在party上, 两人制作了一个仿真的假蛋糕, 以雅的点心作品的名义拿到会场上, 然后然后让"蛋糕"突然爆裂, 弄得场上所有人满脸和浑身上下都是白色奶油状物体. 这就是他们对父母的小小的"报复", 不过两人父母们并没有生气, 反而非常开心看到以前坚持不恋爱的儿女们能够和对方恋爱交往. 主角趁势上雅说出求婚的话语.

浴室胸部舔奶油Play & 本番(后背位)

saki 离开了学园. 雅和主角一起品尝点心时, 怀念起saki在学校时的事情, 两人一阵伤感. 这是, 雅收到saki的邮件, 邮件内容让雅不要伤感自己离去, 自己会一直与雅心中相连.让雅保持笑容, 还说自己以后一定会来参加雅的结婚典礼, 还有雅的点心店开业时候也一定会来. 雅释怀, 对主角表示"saki会一直是自己最好的朋友, 即使两人距离分开, 心中也会紧密相连. 喜欢这种心情, 不会因为距离远去而消失". 雅对主角说, 自己以后如果去留学, 也会和主角分开, 她希望主角到时不要因此沮丧, 继续在人生道路上前行.因为自己仍然会一直想着主角. 3rd H (69爱抚 & 骑乘位).

播放 ED 动画. 之后是结局: 两人在教堂举行结婚典礼, 之后结婚喜宴的点心是雅手制的(主角有帮忙). 典礼上, 雅和主角想起以前他们两个给父母那个"惊喜"时候的事情, 感到很怀念. 雅说自己那时没想到会被主角当场求婚, 吓了一跳. 主角说当时自己是突然有一股冲动所以想雅当场求婚的, 因为自己想和雅永远在一起. 主角感概最终自己还是和父母一样, 在学生时就结婚了. 雅对主角说这意味着他们两人也一定会像主角父母一样, 永远过着像恋人一样的甜腻夫妇生活.主角和雅打趣说这样下去以后他们自己的孩子说不定也会想他们两人自己以前那样, 说出"恋とか愛とかどうでもいい"这种反对父母的恋爱观的话呢. 但是即便如此, 主角也相信, 自己也一定会与雅获得幸福. 雅对主角说: 希望他等到她回来. 雅在毕业时说服了父亲, 决定去留学了(学习点心制作), 为了实现自己(点心师)的梦想. 主角决定为了(等到雅回来时)成为能够支持雅的男人而自己也要努力. 雅和主角觉得自己很幸福, 感谢"恋爱法"让他们能与对方相遇. 当时声称"不恋爱"的他们, 因为尝到了恋爱的甜蜜和幸福和改变了. 两人从今以后的幸福, 也一定会持续. over.


学姐 (円藤琴子)线

主人公与雅逃跑被学园抓住, 主人公被罚每天放课后去学生会当志愿者义务劳动, 由此与学生会长的学姐相识. 并逐渐熟悉, 因为恋爱学园的规定, 学生必须把りんぐ送出去, 主人公于是决定把りんぐ送给了学姐, 因为学姐和自己一样也是不恋爱派 (学姐作为学生会成员有豁免权, 不谈恋爱也没有惩罚, 不过主人公只是临时来学生会打杂的, 所以没有这个特权).

学姐之所以是不恋爱派是因为学姐出生于医生世家, 父母是开医院的, 学姐从小在这种"理性"的家庭氛围里成长, 所以对 "恋爱"这种感性的事物不理解. 而主人公 (宣称自己)是不恋爱派则是因为父母是超笨蛋情侣从小被肉麻惯了所以才对 "恋爱" 产生了反感. 两人不恋爱的理由恰好相反, 所以主人公觉得也许他与学姐之间能够互补.

主人公突然发现自己喜欢上学姐了, 同时学姐也隐隐约约感觉自己对主人公有特别的心意 (这段剧情明显是 ご都合いい主義). 某个休息日, 主人公 / 雅, 基友 / 学姐 两对去双重约会 (因为恋爱学园的规定, 学姐和基友名义上是监督主人公和雅约会的), 但是约会过程自始至终主人公的心思和目光都放在学姐身上, 而学姐虽然行为在撮合主人公和雅, 但反而自己心情变得不爽了 (吃醋). 基友和雅觉察到了主人公对学姐的爱慕之情. 约会结束后, 基友和雅先行离开, 临走前用言语撺掇主人公向学姐表明心意, 于是主人公当场向学姐告白并强行索吻, 学姐心里小鹿乱撞, 慌忙逃离. 下周来到学校, 主人公与咲以及基友们相谈获取帮助, 决定要明白无误地把心意传递给学姐. 于是放课后来到学生会室, 再次向学姐明确表达自己爱意, 在優美的鼓励下, 学姐接受了主角的告白, 两人成为恋人.

开始交往之后基本上就没有什么剧情, 就是いちゃいちゃ。第一次 H 是在两人约会后回到主人公部屋里自然而然发生的, 之后几次 H 在学生会室等地方.

咲决定转学离开恋爱学园, 众人在食堂给她开送别会, 咲和众人瞒着主角和学姐, 设计让他们两人在送别会上当着在场的其它学生面互相公开表达爱意, 并当场把自己手腕上的 リング 与对方的缠联在了一起 (象征片思い -> 両思い).

学姐临近毕业, 因为可能要与主人公分开了, 感到非常不安. 主人公为了能与学姐永远在一起, 决定努力学习, 和学姐一起就读医学专业 (因为学姐早已决定要就读医学院校并继承家里的医院), 学姐非常感动, 与主人公定下一生之约.

播放 ED.

结局: 时光交替, 来年的3月,学姐迎来了毕业的时刻, 主角遵守约定, 接替学姐成为学生会长, 在学姐毕业典礼上作为在校生代表致辞. 这一天, 学姐脱去了菊理学园的校服, 主人公目送学姐离开学园的身姿, 但对于主人公和学姐而言, 这仅仅是普通的一天, 他们之间的爱情, 仍然在毫无动摇地在向未来前进. 学姐升学之前最后一个周末, 作为毕业旅行(?)主人公和学姐两人去郊外温泉旅馆住宿, 主人公看着出浴后穿着浴衣手持团扇的学姐的身姿眼睛都直了. 为了实现与学姐的约定 (一起进入医学院校), 主人公仍然在拼命努力学习. 学姐仍然很渴求主人公 (H最后明知危险却仍然要主人公中出), 不过为了两人的未来 (医学院校需要读6年, 课程很辛苦, 如果怀孕就麻烦了), 也变得稍微理性起来了. 但仍然不时挑逗主人公. 主人公开始直接称呼学姐为 "琴子"了, 而学姐则称呼主人公"祐希" (两人之间不再用敬语).


最后竟然还来一个 H scene (パイズリ + 後ろから挿入+正面), 我擦.

優美 线

单词:
自家発電:必要分を自身で賄うことを転じて…その、あのですね…、ええい、こういう事だよ!→オナニー

为了遵守恋爱学园规定, 主人公决定把 りんぐ 送给優美 (至于为什么是優美, 没什么特别理由, 主人公脑海里自然地浮现出了她, 难道是隐藏的青梅竹马属性吗), 学姐知道后对他又是一阵捉弄, 然后学姐故意安排主人公和優美两人一起每天去校园里巡视接受委托 (志愿者活动)

優美有男性恐惧症, 曾被很多男生告白过, 但每次都是当场如脱兔般逃离了. 10年前, yuumi还是小孩子时候, 头发很短, 喜欢穿裤子而不是裙子, 经常和男孩子们在一起玩足球, 棒球, 所以她自己常被人误以为是男生. 但是后来yuumi发现有了喜欢的男孩子 (暑假和yuumi在乡下一起玩的男孩子, 就是主人公), 为了他, yuumi决心变得更像女孩子, 于是留起长发, 穿上裙子, 行为举止也变得端庄, 后来胸部也开始成长了, 整个人变得女孩子气了. 结果因为太有女孩子气吸引了一堆色狼, 在街上 / 电车上经常被色迷迷的眼光看(胸部, 大腿), 还遭遇几次痴汉, 从那之后就变得不擅长与男孩子交往了. 之后也再也没有喜欢上别的男孩子.

果然是青梅竹马属性.

LiveMaker 引擎游戏资源提取

LiveMaker 引擎游戏资源提取

crass livemaker.cui插件提取exe. 提取出的图像是gal格式. 用GraphicsGale FreeEdition将其转为png或jpg文件