key@home:~$ sudo fdisk -l
设备       启动    起点       末尾       扇区   大小 Id 类型
/dev/sdb1          2048    4982527    4980480   2.4G fd Linux raid 自动检测
/dev/sdb2       4982528    9176831    4194304     2G fd Linux raid 自动检测
/dev/sdb3       9437184 1953320351 1943883168 926.9G fd Linux raid 自动检测
key@home:~$ sudo mount /dev/sdb3 /mnt
mount: /tmp/cs: 未知的文件系统类型“linux_raid_member”.

因为是RAID分区, 需要安装mdadm, lvm2

apt install mdadm lvm2
mdadm --assemble --run /dev/md2 /dev/sdb3
lvdisplay

--- Logical volume ---
  LV Path                /dev/vg2/volume_2
  LV Name                volume_2
  VG Name                vg2
  LV UUID                9hU40Y-3J1V-3uiF-vcQp-GoUj-UPEY-FLP0cG
  LV Write Access        read/write
  LV Creation host, time , 
  LV Status              NOT available    <<==关键所在,非激活
  LV Size                926.00 GiB
  Current LE             237056
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto

激活分区命令:

vgchange -ay /dev/vg2

然后lvdisplay应该显示LV status为available

然后挂载:

mount /dev/vg2/volume_2 /mnt
查看RAID分区信息:
mdadm --detail /dev/md2

停止挂载RAID
mdadm --stop /dev/md

手里有个多年前的验证网站, 采用asp加mssql,一直运行在百度云服务器上,最近百度云快到期了,续费太贵.(其实是我穷),手里也没多的WIN服务器, 所以考虑移到我linux服务器上,说实话,一路曲折,花了三四天时间才搞定.

网上找遍google/bing/baidu, 完全没有近几年LINUX跑asp+mssql的文章,都是十年前的centos 6/ ubuntu10时代的,而我服务器采用的debian11并且上面有跑别的应用,不想为架ASP/MSSQL还去DD个UBUNTU10老爷车来弄.

首先安装iasp, 这个也是上世纪产物了,早就停止开发了,并且最后的版本也停止在十年前的iasp2.1.01.tar.gz

因为iasp只支持最高apache2.0, 别装更高版本,肯定不兼容,所以我选择了httpd-2.0.59.tar.gz

第一步apache

这个简单解压出来之前编译安装就行
make && make install
默认就安装到/usr/local/apache2下了

第二步安装java

为什么要安装java呢,因为iasp是运行在java环境的, 这一步非常重要, 我试着安装了好几个版本, 这个也是花我时间最多的,因为考虑到你用什么数据库版本,对应就得安装对应的JAVA版本.
ubuntu/debian能找到mssql最老的版本也是sqlserver2017, 而java中JDBC能连接sqlserver2017的最低要求兼容版本的就是sqljdbc_6.2.2.1_cht.tar.gz(mssql-jdbc-6.2.2.jre7.jar mssql-jdbc-6.2.2.jre8.jar) ,所以要么安装7要么安装8,我最开始就安装了8, 后来跑起来后发现我ASP代码中只要调用比如date time相关时间函数, 就会出错, 跑去看异常发现"java.lang.ClassNotFoundException: sun.io.ByteToCharConverter"
google在stackOverflw一贴子才查到,原来java8已抛弃了sun/io, 但java7也仅是[deprecated]. 所以后来装了java7解决 版本选择的是jdk-7u80-linux-i586.tar.gz(记得安装32位版本)

第三步安装iasp

解压iasp2.1.01.tar.gz包
运行install.sh
/usr/jdk1.7.0_80/bin
/usr/local/iasp
Instant ASP native servlet interface
Apache 2.X
/usr/local/apache2/conf

重新编译mod_iasp.so

cd /usr/local/iasp/ iasp21/bin/apache/source/2.0
/usr/local/apache2/bin/apxs –i –c *.c
编辑apache配置文件
/usr/local/apache/conf/httpd.conf
在文件末尾部分将/usr/local/iasp/iasp21/bin/apache/linux/2.0/mod_iasp.so修改为
/usr/local/apache2/modules/mod_iasp.so

安装sqlserver2017

这个就按微软官网提示步骤安装就行了,也没啥难度
但有一点重要就是ubuntu18+默认系统使用的是openssl1.1, (那18+就是我debian11更不用说了),而sqlserver2017需要使用openssl1.0的动态库,所以需要手动指定一下 .
先停止mssql-server服务
创建两个软链接

sudo ln -s /usr/lib/x86_64-linux-gnu/libssl.so.1.0.0 /opt/mssql/lib/libssl.so
sudo ln -s /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 /opt/mssql/lib/libcrypto.so

编译mssql-server的systemd服务, /etc/systemd/system/multi-user.target.wants/mssql-server.service
增加代码
[Service]
Environment="LD_LIBRARY_PATH=/opt/mssql/lib"
再重启mssql-server服务

启动apache

/usr/local/apache2/bin/apachectl start

启动iasp

ASP里连接Sqlserver使用不了odbc驱动, 得改用JDBC
就得修改IASP的启动脚本start-server.sh, 其实就是将JAVA启动的classpath增加mssql-jdbc-6.2.2.jre7.jar, 打开/usr/local/iasp/iasp21/start-server.sh, 修改如下

/opt/jdk1.7.0_80/bin/java -mx32768000 -classpath /opt/jdk1.7.0_80/bin/../lib/classes.zip:/opt/jdk1.7.0_80/bin/../lib/tools.jar:/usr/local/iasp/iasp21/lib/jsdk.jar:/usr/local/iasp/iasp21/lib/iasplib.jar:/usr/local/iasp/iasp21/lib/activation.jar:/usr/local/iasp/iasp21/lib/asp2j.jar:/usr/local/iasp/iasp21/lib/rjax.jar:/usr/local/iasp/iasp21/lib/ejbcorba.jar:/usr/local/iasp/iasp21/lib/jndi.jar:/usr/local/iasp/iasp21/lib/samples.jar:/usr/local/iasp/iasp21/lib/hado.jar:/usr/local/iasp/iasp21/lib/pop3.jar:/usr/local/iasp/iasp21/lib/mail.jar:/usr/local/iasp/iasp21/lib/iasp_fileup.jar:/usr/local/iasp/iasp21/lib/iasp_mail.jar:/usr/local/iasp/iasp21/lib/iasp_grid.jar:/usr/local/iasp/iasp21/lib/iasp_nntp.jar:/usr/local/iasp/iasp21/lib/iasp_exec.jar:/usr/local/iasp/iasp21/lib/iasp_inet.jar:/usr/local/iasp/iasp21/lib/iasp_upload.jar:/usr/local/iasp/iasp21/lib/iasp_http.jar:/usr/local/iasp/iasp21/lib/iasp_pop3.jar:/usr/local/iasp/iasp21/lib/iasp_chart.jar:/usr/local/iasp/iasp21/lib/iasp_image.jar:/usr/local/iasp/iasp21/lib/iasp_sock.jar:/usr/local/iasp/iasp21/lib/iasp_xmldom.jar:/usr/local/iasp/iasp21/servlets:/usr/local/iasp/iasp21/lib/rjaxADODB.jar:/opt/msSQLjdbc/mssql-jdbc-6.2.2.jre7.jar: servlet.http.HttpServer

然后启动:
/usr/local/iasp/iasp21/start-server.sh

说下我在中间遇到的几个问题和解决方法:

  1. 如果你也是64位系统,编译的mod_iasp.so时, 得修改一下源码,这是iasp的一个BUG. 估计当时只考虑在32位运行导致的. 就是utils.c中的调用apr_pstrcat函数返回的是int型, 而返回的int型在64位是只占4字节的, 再将这地址转成char*,再去strlen计算, 当然就出错了.
    我看过mod_iasp源码(开源的好处啊,若干年后有人需要你的代码还可以修复使用),发现apr_string.h里面有apr_pstrcat有返回char *类型的定义.
    解决办法是在utils.c文件头增加一条#include "apr_strings.h"
  2. 安装32位的java需要支持
    apt install lib32z1代替ia32-libs
  3. asp代码调用response.Redirect无效,改用
    response.write "<script type='text/javascript'>location.href='URL';</script>"

我的运行环境就是腾迅云轻量无忧1h2G
整体运行速度和稳定性, 还有内存CPU占用率还挺满意
debian11+apache+iasp+sqlserver2017
总共大概刚好1G(sqlserver进程就占了800M = =!)
CPU几呼是0(已经关闭腾迅云预警/usr/local/qcloud/YunJing/uninst.sh的环境下)

root@VM-4-6-debian:~# uptime
 00:01:08 up 1 day,  5:20,  1 user,  load average: 0.00, 0.00, 0.00

日前,诺贝尔物理学奖得主丁肇中面对“给年轻人提建议”的问题,幽默回答:“我儿女从不听我的建议。”接受总台专访时,丁肇中回忆,母亲一开始也不相信他能学好物理,但他仍坚持自己的兴趣和理想。“一个人在世界上只走一次,我应该照我的兴趣来做。”

#!/bin/bash

voicefile=/usr/share/sounds/sound-icons/cembalo-6.wav

if [ ! -f $voicefile ];then
    echo "声音文件不存在"
    exit 0
fi

dbus-monitor 'type=method_call, interface=org.freedesktop.Notifications, member=Notify' | grep --line-buffered -E '^\s*string "QQ|Icalingua\+\+"$' | while read test; do paplay $voicefile;done

x64 inlinehook调用OutputDebugString一直崩溃, x64dbg跟踪发现崩溃在:

<ntdll.RtlCaptureContext>            
| 48:9C                              | pushfq      
| 8C49 38                            | mov word ptr ds:[rcx+38],cs                       
| 8C59 3A                            | mov word ptr ds:[rcx+3A],ds                       
| 8C41 3C                            | mov word ptr ds:[rcx+3C],es                       
| 8C51 42                            | mov word ptr ds:[rcx+42],ss                       
| 8C61 3E                            | mov word ptr ds:[rcx+3E],fs                       
| 8C69 40                            | mov word ptr ds:[rcx+40],gs                       
| 48:8941 78                         | mov qword ptr ds:[rcx+78],rax                     
| 48:8989 80000000                   | mov qword ptr ds:[rcx+80],rcx                     
| 48:8991 88000000                   | mov qword ptr ds:[rcx+88],rdx                     
| 48:8999 90000000                   | mov qword ptr ds:[rcx+90],rbx                     
| 48:8D4424 10                       | lea rax,qword ptr ss:[rsp+10]                     
| 48:8981 98000000                   | mov qword ptr ds:[rcx+98],rax                     
| 48:89A9 A0000000                   | mov qword ptr ds:[rcx+A0],rbp                     
| 48:89B1 A8000000                   | mov qword ptr ds:[rcx+A8],rsi                     
| 48:89B9 B0000000                   | mov qword ptr ds:[rcx+B0],rdi                     
| 4C:8981 B8000000                   | mov qword ptr ds:[rcx+B8],r8                      
| 4C:8989 C0000000                   | mov qword ptr ds:[rcx+C0],r9                      
| 4C:8991 C8000000                   | mov qword ptr ds:[rcx+C8],r10                     
| 4C:8999 D0000000                   | mov qword ptr ds:[rcx+D0],r11                     
| 4C:89A1 D8000000                   | mov qword ptr ds:[rcx+D8],r12                     
| 4C:89A9 E0000000                   | mov qword ptr ds:[rcx+E0],r13                     
| 4C:89B1 E8000000                   | mov qword ptr ds:[rcx+E8],r14                     
| 4C:89B9 F0000000                   | mov qword ptr ds:[rcx+F0],r15                     
| 0FAE81 00010000                    | fxsave ds:[rcx+100]                 <<崩溃行 

查资料得:
对xmm操作是需要16byte对齐, 当rcx没有16对齐时就会报错,也就是 fxsave操作地址必须16位对齐,而rcx是通过sub rsp得到,所以调用OutputDebugString时,RSP必须为0x10的倍数地址。

所以通过自己sub rsp 8x(可为8倍数), 再调用OutputDebugString,结尾add rsp 8x调整堆栈平衡解决。

头大,x64存在一些x86不用考虑的问题,害我研究了一整天。