Archive

Archive for the ‘Linux’ Category

IPV6 Tracker : 从 PPA 安装 Transmission 2.21

February 22nd, 2011 leeing No comments

这两天一直在安装配置 Transmission,由于Ubuntu 源中的 Transmission 版本是2.0.5,经过试用之后,发现默认对 IPV6 的支持不好,无法连接北邮人BT的Tracker,于是开始了漫漫的修改源码+编译的旅程(关于编译,又是很多稀奇古怪的问题出现),虽然最终成功编译出二进制文件,但很奇怪的是自行编译的 Transmission 一旦打开一个种子,很快就CPU占用率飙升,最终进程 transmission-daemon 僵死 – -!

Transmission 2.21的Changelog:

  • Fix compile error in the the 2.20 tarball
  • File re-verification is no longer needed in some situations
  • Fix “Too many open files” error
  • Show the total downloading and seeding time per torrent
  • Fix webseeds
  • Better support for IPv6-only trackers
  • Add the ability to shutdown Transmission sessions via RPC
  • NAT-PMP and UPnP now also map the UDP port
  • Update the DHT code to dht-0.18
  • Faster parsing of bencoded data
  • Improve support for running scripts when a torrent finishes downloading
  • Fix reannounce interval when trackers return a 404 error
  • Fix checksum error on platforms running uClibc 0.9.27 or older
  • Fix memmem() errors on Solaris

Read more…

Categories: BT, Ubuntu Tags: , , ,

defunct 进程 (僵尸进程)

February 22nd, 2011 leeing No comments

由于北邮人BT已经不支持 IPV4 接入,在Ubuntu中用apt-get install transmission-deamon 安装的 Transmission 根本就连接不上 Tracker。

下载来 Transmission 的源代码修改以后自行编译,不过不知道什么原因,其后台进程启动后,用Web-UI 打开一个Torrent文件,不久客户端就无法再进行连接,用top命令查看,显示:transmission-da <defunct> 占用为 100%。

带有defunct标志的进程都为“僵尸进程”,后来搜索了一下:

僵尸”进程是一个早已死亡的进程,但在进程表(processs table)中仍占了一个位置(slot)。由于进程表的容量是有限的,所以,defunct进程不仅占用系统的内存资源,影响系统的性能,而且如果其数目太多,还会导致系统瘫痪。

产生的原因:
每个Linux进程在进程表里都有一个进入点(entry),核心程序执行该进程时使用到的一切信息都存储在进入点。当用ps命令察看系统中的进程信息时,看到的就是进程表中的相关数据。当以fork()系统调用建立一个新的进程后,核心进程就会在进程表中给这个新进程分配一个进入点,然后将相关信息存储在该进入点所对应的进程表内。这些信息中有一项是其父进程的识别码。当这个进程走完了自己的生命周期后,它会执行exit()系统调用,此时原来进程表中的数据会被该进程的退出码(exit code)、执行时所用的CPU时间等数据所取代,这些数据会一直保留到系统将它传递给它的父进程为止。由此可见,defunct进程的出现时间是在子进程终止后,但是父进程尚未读取这些数据之前。

一般来说,重启是最好的方案。

Categories: Linux, Ubuntu Tags: , ,

APUE 中的 ourhdr.h 头文件

September 17th, 2010 leeing No comments

《UNIX 环境高级编程》中几乎所有的示例代码都包含了 ourhdr.h 文件,这是作者自行写的一个实现,其源代码如下:

#ifndef ourhdr_h
#define ourhdr_h

#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define MAXLINE 4096

#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)

#define DIR_MODE (FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)

typedef void Sigfunc(int);

#if defined(SIG_IGN) && !defined(SIG_ERR)
#define SIG_ERR ((Sigfunc *)-1)
#endif

#define min(a,b) ((a) < (b) ? (a) : (b))
#define max(a,b) ((a) > (b) ? (a) : (b))

char *path_alloc(int *);
int open_max(void);
void clr_fl(int, int);
void set_fl(int, int);
void pr_exit(int);
void pr_mask(const char*);
Sigfunc *signal_intr(int, Sigfunc *);

int tty_cbreak(int);
int tty_raw(int);
int tty_reset(int);
void tty_atexit(void);
#ifdef ECHO
struct termios *tty_termios(void);
#endif

void sleep_us(unsigned int);
ssize_t readn(int, void *, size_t);
ssize_t writen(int, const void *, size_t);
int deamon_init(void);

int s_pipe(int *);
int recv_fd(int, ssize_t(*func)(int, const void*, size_t));

int send_fd(int, int);
int send_err(int, int, const char*);
int serv_listen(const char*);
int serv_accept(int, uid_t *);
int cli_conn(const char *);
int buf_args(char *, int (*func)(int, char **));

int ptym_open(char *);
int ptys_open(int, char *);
#ifdef TIOCGWINSZ
pid_t pty_fork(int *, char *, const struct termios *, const struct winsize *);

#endif

int lock_reg(int, int, int, off_t, int, off_t);
#define read_lock(fd, offset, whence, len) \
lock_reg(fd, F_SETLK, F_RDLCK, offset, whence, len)
#define readw_lock(fd, offset, whence, len) \
lock_reg(fd, F_SETLKW, F_RDLCK, offset, whence, len)
#define write_lock(fd, offset, whence, len) \
lock_reg(fd, F_SETLK, F_WRLCK, offset, whence, len)
#define writew_lock(fd, offset, whence, len) \
lock_reg(fd, F_SETLKW, F_WRLCK, offset, whence, len)
#define un_lock(fd, offset, whence, len) \
lock_reg(fd, F_SETLK, F_UNLCK, offset, whence, len)
pid_t lock_test(int, int, off_t, int, off_t);

#define is_readlock(fd, offset, whence, len) \
lock_test(fd, F_RDLCK, offset, whence, len)
#define is_writelock(fd, offset, whence, len) \
lock_test(fd, F_WRLCK, offset, whence, len)

void err_dump(const char*, ...);
void err_msg(const char*, ...);
void err_quit(const char*, ...);
void err_ret(const char*, ...);
void err_sys(const char*, ...);

void log_msg(const char*, ...);
void log_open(const char*, int, int);
void log_quit(const char*, ...);
void log_ret(const char*, ...);
void log_sys(const char*, ...);

void TELL_WAIT(void);
void TELL_PARENT(pid_t);
void TELL_CHILD(pid_t);
void WAIT_PARENT(void);
void WAIT_CHILD(void);

#endif
Categories: C++, Linux Tags:

Chromium : Google chrome for linux

April 17th, 2010 leeing No comments

用了两天的 Chromium,也就是 Google chrome ,感觉在 linux 下面对字体的渲染比 Firefox 要好,在 Mint 8 下安装也是很简单的:

1. 添加源:

deb http://ppa.launchpad.net/chromium-daily/ppa/ubuntu karmic main
deb-src http://ppa.launchpad.net/chromium-daily/ppa/ubuntu karmic main

2. 添加 PGP key :

$ sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xfbef0d696de1c72ba5a835fe5a9bf3bb4e5e17b5

3. 安装

$ sudo apt-get update
$ sudo apt-get install chromium-browser

4. Enjoy ~

Categories: Linux, Mint, Ubuntu Tags: , ,

Ubuntu:mount of filesystem failed

April 14th, 2010 leeing No comments

今天一开机,Mint 就黑屏,显示:

mount of filesystem failed
a maintenance shell will now be started.
Control-D will terminate this shell and re-try
root@mint:~#

后来查了一下,据说这是 an odd issue that rarely happens,不过解决方法也很简单:
首先列出 linux 的分区:

fdisk  -l

我的输出是这样的:

Disk /dev/sda: 80.0 GB, 80032038912 bytes
255 heads, 63 sectors/track, 9730 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0xcf62cf62

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        2805    22531131    7  HPFS/NTFS
/dev/sda2            2806        9730    55625062+   f  W95 Ext'd (LBA)
/dev/sda5            2806        5355    20482843+   7  HPFS/NTFS
/dev/sda6            5356        8160    22531131    7  HPFS/NTFS
/dev/sda7            8161        8344     1477948+  82  Linux swap / Solaris
/dev/sda8            8345        9001     5277321   83  Linux
/dev/sda9            9002        9730     5855661   83  Linux

可以看到 Linux 分区在 /dev/sda8 和 /dev/sda9 ,然后用下面的命令修复:

fsck.ext4 /dev/sda8
fsck.ext4 /dev/sda9

注意这是针对 ext4 文件系统的。

Categories: Linux, Mint, Ubuntu Tags: , ,