2008-09-28

用kexec快速切换内核

详见:http://www.linuxsir.org/main/node/296

总的来说:



  1. 内核版本必需为 2.6.13 或以上,因为自该版本起内置了 kexec 系统调用的程序。

  2. 内核编译需加入 kexec 支援
    Processor type and features --->

    [*] kexec system call (EXPERIMENTAL)


  3. 系统需要安装 kexec-tools

  4. 用 /sbin/kexec 加载另一内核,语法是:
    kexec -l <kernel-image> --append="<command-line-options>" 
    如:
    kexec -l /boot/lfskernel-2.6.25.4 --append="root=/dev/sda6 ro nomce vga=0x317"

  5. 想重启内核,就以 kexec -e 来切换。




//EOF Read More...

2008-09-26

FtpViewer 初始版本源代码

源代码下载:http://sites.google.com/site/dave3068/Home/my-project/FtpViewer_src.zip

见:http://sites.google.com/site/dave3068/Home/my-project

history:
2008-09-26 最初版本。
2008-09-27 有所改进,界面有所改进、增加删除功能。(今后不会再增加功能,有违做这个软件的初衷)

注:
为何不加入上传下载功能?
毕竟我写这个工具的初衷是:某FTP提供限额文件存放服务,而我的限额到了,我想看看哪些东西占用空间,并将其删除,并没有其它需求。
而对于FTP的上传、下载:每个操作系统安装后一般都默认自带了命令行的ftp工具,通过脚本可以很方便的实现文件的上传、下载。所以我认为没必要再提供多余的操作。


//EOF Read More...

sun.net.ftp.FtpClient 编码问题解决

使用 sun.net.ftp.FtpClient 在遇到中文文件名和中文目录名时会出现些问题。

  1. list() 得到的文件名乱码,这个很好解决:

    /**
    * 字符编码转换:ISO-8859-1 => GBK
    *
    * @param str
    * @return
    * @throws UnsupportedEncodingException
    */
    public static String iso2Gbk(String str)
    throws UnsupportedEncodingException {
    return new String(str.getBytes("ISO-8859-1"), "GBK");
    }


  2. 遇到某中文目录时会无法进入,这个问题困扰我好几天(这几天一直在摆弄这个)。
    发现服务端接收到的中文目录名都成乱码了,一开始我以为通过 new String() 的方式也可以解决。
    其实不然,怎么试都不行,好象在 sun.net.ftp.FtpClient 里面会自动转换成 ISO 的编码。
    今天偶然有机会看到 sun.net.ftp.FtpClient 的源码才发现果然如此。
    sun.net.ftp.FtpClient 有个超类 sun.net.NetworkClient 在里面会将所有传输出去的编码都转换成 ISO 的。看来问题出在这里了。
    同时 sun.net.NetworkClient 还有个:

    /* Name of encoding to use for output */
    protected static String encoding;

    这个可以控制其编码,于是乎:

    /**
    * 设置连接编码
    *
    * @param encodingStr
    */
    public static void setEncoding(String encodingStr) {
    sun.net.NetworkClient .encoding = encodingStr;
    }

    将编码设置成 GBK 问题即解决。


至此,遇到的两个编码问题都已解决,一切都是那么轻松 ^_^ 。

//EOF Read More...

2008-09-25

回来了!LinuxSir 终于回来了!

历时一个半月。LinuxSir 终于又回来了 !!!

//EOF Read More...

2008-09-22

Java 获取FTP文件大小

使用 sun.net.ftp.FtpClient。


package h.davy;

import h.davy.ftp.FtpFileInfo;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

import sun.net.TelnetInputStream;
import sun.net.ftp.FtpClient;

public class Test {

private static int test() {
FtpClient ftp = null;
try {
ftp = new FtpClient();
ftp.openServer("192.168.1.27");
ftp.login("t01", "12345");
// ftp.login("anonymous", "anonymous@do.c");

System.out.println(ftp.pwd()); // 当前目录
System.out.println(ftp.system());

System.out.println("===============================");
ftp.ascii();
// 获取目录文件列表详细信息
TelnetInputStream listStream = ftp.list();
byte[] buf = new byte[2048];
int n = 0;
while (true) {
if (0 > (n = listStream.read(buf, 0, buf.length)))
break;
System.out.println(n);
String fileName = new String(buf, 0, n);
System.out.println(fileName);
}
listStream.close(); // 需要这个关闭流

System.out.println("===============================");
getFilesInfo(ftp, "/");
System.out.println("===============================");
System.out.println(getFileSize(ftp, "/test.tar.bz2"));
System.out.println(getFileSize(ftp, "/phpMyAdmin/index.php"));
System.out.println("===============================");
getFilesInfo(ftp, "/phpMyAdmin");
// 退出登录
ftp.sendServer("QUIT\r\n");
} catch (IOException e) {
e.printStackTrace();
} finally {
// try {
// ftp.closeServer();
// } catch (IOException e) {
// e.printStackTrace();
// }
}
return -1;
}

/**
* 获取某文件大小
*
* @param ftp
* @param filePath
* @return
* @throws IOException
*/
static long getFileSize(FtpClient ftp, String filePath) throws IOException {
ftp.binary(); // 需要切换到 Binary 模式
ftp.sendServer(String.format("SIZE %s\r\n", filePath));
StringBuffer sb = new StringBuffer();
while (true) {
int c = ftp.serverInput.read();
char ch = (char) c;
if (c < 0 || ch == '\n') { // end of stream || end of line
StringTokenizer tk = new StringTokenizer(sb.toString());
int index = 0;
while (tk.hasMoreTokens()) {
String token = tk.nextToken();
if (index == 1) {
try {
return Long.parseLong(token);
} catch (NumberFormatException e) {
return -1L;
}
}
index++;
}
}
if (ch == '\n')
continue;
else if (c <= 0)
break;
sb.append(ch);
}
return -1L;
}

/**
* 获取某目录中的所有文件
*
* @param ftp
* @param path
* @return
* @throws IOException
*/
static List<FtpFileInfo> getFilesInfo(FtpClient ftp, String path)
throws IOException {
List<FtpFileInfo> ret = new ArrayList<FtpFileInfo>();

ftp.cd(path); // 切换到指定目录
ftp.ascii(); // 需要切换到 ASCII 模式
TelnetInputStream listStream = ftp.list();
StringBuffer sb = new StringBuffer();
while (true) {
int c = listStream.read();
char ch = (char) c;
if (c < 0 || ch == '\n') { // end of stream || end of line
FtpFileInfo ffi = new FtpFileInfo();
StringTokenizer tk = new StringTokenizer(sb.toString());
int index = 0;
while (tk.hasMoreTokens()) {
String token = tk.nextToken();
switch (index) {
case 0: // file attribute string
// 这里可以根据 attribute string 分析该文件是否为目录。
// (若为目录第一个字符为"d")
ffi.setAttributeStr(token);
break;
case 1: // ??
break;
case 2: // owner
break;
case 3: // group
break;
case 4: // file size
try {
ffi.setFileSize(Long.parseLong(token));
} catch (NumberFormatException e) {
e.printStackTrace();
}
break;
case 5: // month
case 6: // day
case 7: // time
break;
case 8: // file name
ffi.setFileName(token);
break;
}
index++;
}
ret.add(ffi);
sb.setLength(0);
}
if (ch == '\n') {
continue;
} else if (c <= 0)
break;
sb.append(ch);
}
listStream.close(); // 需要这个关闭流
return ret;
}

/**
* @param args
*/
public static void main(String[] args) {
System.out.println(test());
}

}


注:其中的 FtpFileInfo 仅仅是个人定义的一个 Java Bean 没什么实质的内容。

注:对于 ftp.list() 打开的流需要关闭,要不然后续读取操作会被挂起。


//EOF Read More...

2008-09-21

some photos

http://www.getdropbox.com/gallery/163800/1/2008-09-17?h=c63c62

//EOF Read More...

2008-09-15

SGER 回来了!

回来了!回来了!终于回来了!
http://bbs.sger.net/ 终于回来了!
好激动啊! 可惜丢失了3个多月的数据。

另外期待 linuxsir 也能尽快回来!

//EOF Read More...