May 22 2016

Outlook 2016 for Mac 更改邮件存放路径

Category: 技术ssmax @ 15:30:45

由于Office 2016 实现了OSX新的sanbox api,所以导致直接更改邮件存放路径,然后使用软链接link回来的做法失效

下面就是一个小日本琢磨出来的解决方案,试过有效,共享一下:

sudo su
cd "/Applications/Microsoft Outlook.app/Contents/MacOS/"
hexdump -ve '1/1 "%.2X"' "Microsoft Outlook" | \
sed "s/73616E64626F783C2F6B65793E0A093C747275652F3E/73616E64626F783C2F6B65793E0A093C66616C732F3E/g" | \
xxd -r -p > "Microsoft Outlook.patched"
# search com.apple.security.app-sandbox
# change the value to false
chown YOURUSER "Microsoft Outlook.patched"
chmod `stat -f %A "Microsoft Outlook"` "Microsoft Outlook.patched"
mv "Microsoft Outlook" ~/Desktop/Microsoft\ Outlook.bak
mv "Microsoft Outlook.patched" "Microsoft Outlook"
ln -s "/Volumes/TarDisk/Outlook" "/Users//Library/Group Containers/UBF8T346G9.Office/Outlook"

其实就是关掉了sanbox,false没有完整拼写是为了保留字节数不变,不需要重新编译。
这样就可以把目录链接到别的盘了
另外一个解决方案是实用hdiutil attch 一个mountpoint,这个比较简单一点,但是我没有闲心慢慢看下去,比较喜欢粗暴一点,哈哈。

更改之后,如果你有多个邮箱,用户名密码会保存不下来,这是因为程序签名破坏了,要对程序进行重签
先在钥匙串里面新建一个自签名证书,然后信任它,最后重签,–no-strict 这个是个坑(遇到报错 main executable failed strict validation 的话)

codesign -f -s "YOUR SELF-SIGNED CERT NAME" --no-strict --deep "/Applications/Microsoft Outlook.app/"


Nov 15 2013

MYSQL的效率果然是低下

Category: 技术ssmax @ 23:11:51

3月份提了一个mysql的bug,现在是11月了,终于确认了。。。

http://bugs.mysql.com/bug.php?id=68568

被oracle收购了之后果然就不是想继续开发下去的节奏了,唉,可惜了好好的一个免费产品。


Aug 19 2013

继续折腾内核 3.2.50

Category: 技术ssmax @ 21:11:14

今天继续折腾内核了,升级到 3.2.50

查了一下资料 , ubuntu 12.04 和 debian 7 都是使用3.2版本的内核了。

找了debian的kernel deb包,在pool的linux下面,解压获得debian最新的config文件,基本该有的都有了,比ubuntu的靠谱一点,编译了以后资源占用不高。

这个版本应该可以稳定了。不错不错。

CONFIG_DEBUG_INFO 记得设置为n,要不编译出来的文件那就一个大啊,所有模块都支持gdb,大10倍。。。


Aug 17 2013

继续折腾内核 centos 5.9 to 3.0.91 kernel

Category: 技术ssmax @ 13:28:53

前两天升级内核到3.0.90,用的是centos 5.9的 oldconfig,但是由于2.6.18的config文件实在是太老了,用它来做oldconfig,发现很多新内核的特性没有编译进来,最简单的哦iptalbes NAT模块都没有。。。

所以这几天都在折腾内核,折腾了几次之后,决定用centos 6.4的config文件做基础,来进行oldconfig,6.4的config文件从对应的rpm里面提取,编译的过程中遇到不少坑,现记录如下:

1、坑一
新config的scsi_mod会默认编译进内核,而不是作为模块存在了

CONFIG_SCSI_MOD=y
CONFIG_SCSI=y

但是CONFIG_BLK_DEV_SD依旧是m,那样导致scsi_mod编译到内核了,而sa_mod 依然在外面,最后mkinitrd的时候,由于scsi_mod 没有了,所以sa_mod 也不会带到initrd引导里面,导致我在vmware测试的时候老是说找不到盘。。。

调试了非常久的时间,中间还学会了一招,在内核启动崩溃的时候,虚拟机有个很方便的设置,配置一个串行接口,输出到文件,然后
kernel后面加参数 console=ttyS0 就会输出到这个文件,调试内核就方便很多。

所以,编译的时候记得要不就把三个都编译进内核,要不三个都m,要不就自己解压initrd把module加上去。

CONFIG_SCSI_MOD=y
CONFIG_SCSI=y
CONFIG_BLK_DEV_SD=y

#当然不要忘记这两个
CONFIG_SYSFS_DEPRECATED=y
CONFIG_SYSFS_DEPRECATED_V2=y

2、坑二
hwclock在新内核里面无法使用,这个问题是由于新内核已经使用了新的RTC设计

CONFIG_RTC_CLASS=y

当这个参数存在的时候,无法再使用CONFIG_RTC这个参数来支持旧的RTC设置,这两个模块是互斥的,但是在说明文档里面没有详细说明
CONFIG_RTC_CLASS 会生成一个 /dev/rtc0 的设备,大小类分别是 254 0 , 而不是原来的10 135,这个大小类的char设备在CONFIG_RTC_CLASS配置里面不再存在了。

但是mkinitrd命令生成initrd的时候,还是会在init脚本里面加上一句

mknod /dev/rtc c 10 135

所以如果你要想hwclock可用,要不就升级hwclock版本,新版本支持读取rtc0设备
要不就解压initrd,自己修改init脚本,如下操作:

mkdir /root/init
cd /root/init
zcat /boot/initrd-3.0.91.img | cpio -di

#编辑init文件,找到rtc,改为
mknod /dev/rtc c 254 0

#保存退出,当然现在可以在启动时加上你自己喜欢的模块,或者去掉你不想要的模块了
#这里也要检查下和旧版本的区别,以防启动不了

find . | cpio -c -o | gzip -9 -c > /boot/initrd-3.0.91.img 

这样重新引导之后,就可以直接使用hwclock来同步系统和主板的时间了

3、坑三
网卡顺序在不同内核里面,会由于MSI的读取和udev的版本而呈现不同的顺序,我在服务器上面启动内核的时候,eth0和eth1的模块都是bnx2
在旧的内核里面mac0对应eth0, mac1对应eth1,但是在新版本的读取里面,就反过来了,mac1对应eth0, mac0对应eth1
导致原来的配置文件出问题了,网卡没有启动。。。
在网上查了很久,总结了好几个解决办法
第一个,启动加参数pci=nomsi,没有测试过,但是觉得既然系统引入了这个功能,总有它的用处,所以没改
第二个,改udev规则,在udev启动网卡的时候,设定具体的mac地址,/etc/udev/rules.d/60-net.rules,写死在这里,个人觉得也没有这个必要吧
第三个,自己琢磨出来的,在看udev规则的时候,看到这样一句

cat /etc/udev/rules.d/60-net.rules
ACTION=="add", SUBSYSTEM=="net", IMPORT{program}="/lib/udev/rename_device"
SUBSYSTEM=="net", RUN+="/etc/sysconfig/network-scripts/net.hotplug"

怎么有个rename的程序。。。看样子有戏,查资料
rename_device, which searches the ifcfg-* files for a HWADDR that matches the new device and uses the DEVICE setting from that file to give a name to the new interface.

看到这里,恍然大悟,centos为了这种情况,已经出来应对方案了,只要在
/etc/sysconfig/network-scripts/ifcfg-eth*
网卡的配置文件里面,写好了HWADDR 和DEVICE ,就会自动按照这个参数重命名

如下:

BOOTPROTO=static
ONBOOT=yes
DEVICE=eth0
TYPE=Ethernet
IPADDR=123.123.123.123
NETMASK=255.255.255.0
GATEWAY=123.123.123.1
HWADDR=00:12:34:56:78:23

记得两个网卡都设置下HWADDR,就行了,重启之后,udev启动网卡的时候,就会按照这个配置里面的设置,重命名网卡。

4、不知算不算坑
新内核启动之后,一切正常,但是几个kworker的进程,时不时的占用着一些cpu资源(在vmware里面),我记得以前在kvm和vmware的vps里面安装centos 6,也碰到过类似问题。
这个kworker好像是响应bios事件的,网上说了一堆,但暂时没有发现什么好办法。。。

在服务器上面,就有一个kimpi0的进程,也是类似的占用,该死dell服务器带有ipmi模块,刚好新内核把impi_si 也编译到内核中了。。。
但是我们的ipmi没有使用,所以还是把这个禁用掉吧,由于已经编译到内核,没办法不加载。。
在kernel加上参数:

kernel /vmlinuz-3.0.91 ro root=LABEL=/ ipmi_si.force_kipmid=0

先应付着吧,再观察几天看看,自己编译内核真是一个体力+技术活,没有测试好的config不敢放到服务器上面跑,但是服务器环境毕竟和vmware的不一样,来回折腾啊。
以后有水平了再针对服务器做精简内核吧,现在还是参考别人的成熟经验,适合多数服务器的配置。

希望这次编译的稳定,就可以开启ssd的TRIM了!估计也是这些原因,最后centos还是不支持从5直接升级到6。。。


Aug 15 2013

centos 5.x 升级内核到 3.0 以上

Category: 技术ssmax @ 15:17:32

公司的机器终于有申请到ssd硬盘了,昨天插上去服务器,但是发现centos 5.x 虽然可以支持ext4,但是ext4的模块不支持TRIM(discard)功能,用hdpram虽然可以手动TRIM,但不是太保险,查了一下资料,内核太老了,5.x一直是2.6.18.x的内核,centos 6 就可以完美支持TRIM了,但是centos 5.x 不能直接在线升级到 6 ,必须重装系统,不想弄到系统重装这么大件事。

故继续翻资料,发现TRIM支持比较好要到3.0的内核了,好,试试编译内核吧,很久没有玩过了。

1、首先到 https://www.kernel.org/ 找合适的内核,longterm 版本的内核有 2.6.32 (centos 6 就是这个),2.6.34,3.0.90 等等,一不做二不休,直接搞到3.0以上吧,下载内核,解压

2、准备必要的编译工具:

> yum install gcc ncurses ncurses-devel 

2、进入解压目录,要配置内核了,我选择用原来centos 5 的一些内核参数

> cp /boot/config-2.6.18-348.12.1.el5 ./.config
> make oldconfig
> 全部回车,选择默认,或者按照你们自己的需要选择

3、config完毕后,需要手动改写几个参数,vim .config
CONFIG_SAMPLES=n

这个参数可以避免编译阶段 samples/hidraw/hid-example.c编译失败,samples里面有引用当前环境的一些headers

CONFIG_SYSFS_DEPRECATED=y
CONFIG_SYSFS_DEPRECATED_V2=y

这两个参数让内核使用旧版的sysfs,由于centos的确太tmd老了,如果不选择这个选项,文件系统等等无法直接装载

4、修改好.config 文件之后,就要编译了

> make 
#等好多分钟
> make modules_install
# 安装 /lib/modules 目录
> make install
# 安装 vmlinux 到 /boot
> 修改 /boot/grub/menu.lst 使default选择新内核启动

完成了之后就reboot吧。。

5、reboot之后,看看各个服务的启动情况,本来很happy,但是突然看到 udev的一个超时报错

udevd-event: wait_for_sysfs waitnig for xxxxxxx ioerr_cnt failed

这个是怎么回事呢。。。
继续翻资料,发现还是udev太老的问题,新版本已经不需要这些事件了。修改udev配置文件
/etc/udev/rules.d/05-udev-early.rules

#ACTION=="add", SUBSYSTEM=="scsi", WAIT_FOR_SYSFS="ioerr_cnt"
# 注释掉上面这行,加上下面这行
ACTION=="add", SUBSYSTEM=="scsi", KERNEL=="[0-9]*:[0-9]*", WAIT_FOR_SYSFS="ioerr_cnt"

重启,错误消失,但是不知道对scsi硬盘控制器会有什么不良影响,以上流程在vmware(scsi控制器),dell 2950 上面的centos 5.9最新版本试验通过。。。
安装的是3.0.90版本,安装完了以后再去查,发现已经更新到3.0.91 了,太tmd勤快了。

最后一点,记得在yum.conf里面去掉kernel*的检查,要不啥时候update一下就不知不觉升级了2.6.18的内核。。。
exclude=kernel*

各位折腾正式服务器环境之前敬请测试。


Jun 26 2013

PHP 中的libcurl增加 CURLOPT_MAXFILESIZE 参数

Category: 技术ssmax @ 10:04:39

编辑一下,php 5.5.0 的发布文档里面已经表示新版php已经增加了此参数,所以如果各位的php是最新的5.5或以上,可以忽略下面的文字啦,呵呵。

libcurl有一个很有用的参数

MAXFILESIZE,可以根据content length来判断是否超过文件下载大小,但是php默认的版本没有编译这个参数进去。

根据libcurl 的 源代码所示

https://github.com/bagder/curl/blob/master/docs/libcurl/symbols-in-versions

CURLOPT_MAXFILESIZE             7.10.8
CURLOPT_MAXFILESIZE_LARGE       7.11.0

CURLOPT_MAXFILESIZE 是从 7.10.8版本开始存在的

修改php源代码:
ext/curl/interface.c

寻找关键字 CURLOPT_IPRESOLVE(该功能也是7.10.8版本开始存在,也是long类型变量)
插入CURLOPT_MAXFILESIZE 的判断,由于同样是long类型,所以不需要做什么特殊处理


#if LIBCURL_VERSION_NUM > 0x070a07 /* CURLOPT_IPRESOLVE is available since curl 7.10.8 */
        REGISTER_CURL_CONSTANT(CURLOPT_IPRESOLVE);
        REGISTER_CURL_CONSTANT(CURL_IPRESOLVE_WHATEVER);
        REGISTER_CURL_CONSTANT(CURL_IPRESOLVE_V4);
        REGISTER_CURL_CONSTANT(CURL_IPRESOLVE_V6);
        REGISTER_CURL_CONSTANT(CURLOPT_MAXFILESIZE);
#endif
......

#if LIBCURL_VERSION_NUM > 0x070a07 /* CURLOPT_IPRESOLVE is available since curl 7.10.8 */
                case CURLOPT_IPRESOLVE:
                case CURLOPT_MAXFILESIZE:
#endif

编辑完成后,重新编译PHP,即可在php的curl_setopt中,使用CURLOPT_MAXFILESIZE参数,指定下载文件的限制大小,单位为bytes。


Jun 14 2013

MYSQL 主从同步文档的大坑

Category: 技术ssmax @ 15:15:42

http://dev.mysql.com/doc/refman/5.1/en/replication-rules-db-options.html

mysql 主从同步的参数

replicate-do-db   指定同步某个DB

如果大家有一个需求,只同步某一些DB,就需要用

replicate-do-db=dbA

replicate-do-db=dbB

ok,这里还很明确,但是如果大家又想不同步dbA里面某个表。。文档里面的坑就出现了

按照文档的意思,如果 db level中没有匹配到,就会转入table level的匹配。ok,按照文档,我配置成这样:

replicate-do-db=dbB
replicate-ignore-table=dbA.question
replicate-wild-do-table=dbA.%

结果,dbA就全部不会同步了。。。但是根据文档中的示意图,理论上是可以的啊

其实坑就在这里了,如果存在 replicate-do-db, 最后如果不是excute的结果,是不会进入 table level的判断的。

所以要达到我们的需求,就需要这样配置:

replicate-do-db=dbA

replicate-do-db=dbB
replicate-ignore-table=dbA.question
replicate-wild-do-table=dbA.%

看官看到这里必定会问,为什么要用 replicate-wild-do-table 多此一举呢?如果没有了这一句,一切不是都很清晰吗。。。

问题就是 replicate-do-db 只会同步 USE DB 之后的语句,并不会同步直接DB.table 非指定DB域的语句,所以很多时候,还是要加上 replicate-wild-do-table, 会稳妥一点。

好了,我们都以为 replicate-do-db 和 replicate-wild-do-table 可以一起用,其实。。。这里的坑更变态。

根据刚才的规则,如果存在 replicate-do-db,语句必须在db级是execute的,才会进入 table级别的判断。。。所以,这里的

replicate-wild-do-table 压根就达不到大家预料的效果,比如大家USE dbC之后,再更新dbA中的数据,发现在

replicate-do-db=dbA

replicate-wild-do-table=dbA.%

这样的配置中,根本达不到想要的效果,大家USE dbC之后,再更新dbA中的数据,结果还是没有同步到从,所以最后,MYSQL的文档写了一句:

To make it easier to determine what effect an option set will have, it is recommended that you avoid mixing “do”and “ignore” options, or wildcard and nonwildcard options. An example of the latter that may have unintended effects is the use of --replicate-do-db and --replicate-wild-do-table together, where --replicate-wild-do-table uses a pattern for the database name that matches the name given for --replicate-do-db.

尽量不要混合使用,除非你已经测试过了。。。


May 17 2013

系统负载命令备忘

Category: 技术ssmax @ 19:25:45

sysstat 查看系统负载,里面有cpu占用和中断,上下文切换等信息

iostat 查看io负载,主要是读写次数速度cpu占用等

sar 比较强大的命令,啥都可以看,我一般用来看中断,sar -I XALL -d 3 10

或者从 /proc/interrupts 看

 

今天重新打开了服务器上面的irqbalance, 不知道从什么时候开始我就把这个服务给k掉了。

网卡比较繁忙,不知道是不是这里引起服务器负载过高,先观察下。


Oct 29 2012

ps 备忘

Category: 技术ssmax @ 21:22:30

       To see every process on the system using standard syntax:
          ps -e
          ps -ef
          ps -eF
          ps -ely

       To see every process on the system using BSD syntax:
          ps ax
          ps axu

       To print a process tree:
          ps -ejH
          ps axjf

       To get info about threads:
          ps -eLf
          ps axms


Sep 27 2012

Bug改好了。。。

Category: 技术ssmax @ 16:10:49
  • mod_caucho: linux timeout issue millis vs sec in read timeout (#5203, rep by ssmax)
  • http: sendfile needs to open file using O_RDONLY (#5202, rep by ssmax)

恩,中午的烧排骨真不错。


Next Page »