分类存档: Tech/技术-FreeBSD

备忘:freebsd boot0cfg修改硬盘引导

在freebsd10.0下测试木有问题。(GPT分区表的硬盘可能不适用,我测试了有问题,DOS分区表MBR硬盘木有问题)

freebsd的引导做的很好,可以识别U盘等,还可以用boot0cfg进行修改启动选项。

使用freebsd启动盘启动,或者在freebsd系统下,运行boot0cfg就可以修改启动选项:

1 boot0cfg -B /dev/ada0 将硬盘ada0的mbr引导区重写。

2 boot0cfg -m 0x01 ada0 将硬盘第一个slice加入到启动选项里,其中

0x01 对应slice 1

0x02 对应slice 2

0x03 对应slice 1和2

0x04 对应slice 4

0x05 对应slice 1和3

....

0x0f对应slice 1,2,3,4

 

备忘:freebsd man中搜索关键词加亮显示(keyword highlight)

freebsd10.0测试木有问题。

freebsd 下用man看帮助,例如

man xterm

如果需要搜索wide这个关键词,则键盘输入

/wide

回车

虽然可以跳转到相关页面,但是关键词wide没有高亮显示,阅读很不方便,linux下面的man会高亮显示的。网上搜了下,解决办法是将PAGER环境变量设置为less就可以了,默认PAGER为more。

如使用shell为bash只需要在.profile中加入

export PAGER=less即可。

 

备忘:Freebsd下linux支持设置

freebsd10.0下测试木有问题。

首先需要安装/usr/ports/emulators/linux-f10

1  静态方法

修改/etc/fstab 加入

linproc   /compat/linux/proc   linprocfs rw 0 0

这样就能让一些依赖proc目录的程序如htop正常运行了

修改/etc/rc.conf加入

linux_enable="YES"

2 动态方法

kldload linux

kldload ext2fs

mount  -t linprocfs linprocfs /compat/linux/proc

备忘:freebsd 下添加字体(中文字体、其它字体)

freebsd10.0下测试没问题
从Windows下fonts目录拷贝字体文件(或从别处获取字体文件),拷贝到freebsd /usr/local/lib/X11/fonts/MyFonts(自己建的目录)。在MyFonts目录下运行:
mkfontdir(该命令创建font.dir文件)
mkfontscale(该命令创建font.scale文件)
fc-cache -fsv(缓冲字体)
然后在/etc/X11/xorg.conf文件中的第一行FontPath前添加
FontPath "/usr/local/lib/X11/fonts/MyFonts/"
大功告成!

freebsd mount_smbfs挂载windows下的共享

在freebsd10.0下测试通过。
以前用
mount_smbfs -I IP //username@IP/shareDir mydir
就可以了,现在发现直接用IP地址的方法不能用了
必须使用
mount_smbfs -I IP //username@WinHostName/shareDir mydir
就是把后面的IP换成windows的主机名。

中文字符支持需要加上-L选项,例如

-L zh_CN.eucCN或者zh_CN.GBK/zh_CN.UTF-8之类的编码

备忘:ntp服务器地址

上年纪了,今天用ntpdate更新时间的时候连ntp服务器地址都记不起来了
ntp server地址:pool.ntp.org

日立(HITACHI)PCX-5NL01-E83D0笔记本上NetBSD

从单位垃圾堆捡回来一台日立(HITACHI)PCX-5NL01-E83D0笔记本,24兆内存(板载8M+加装16M)硬盘1G,cpu是MMX133的,速度很慢,没有网卡,usb,只有串口,软驱接口,还有2个pcmiac口,预装win95,竟然电池还能待机10分钟。

拿回来把硬盘拆下来,装到我的Hp老本上,安装上freebsd,装好后把硬盘装到日立小本上,开机,装载内核时崩溃,内存太小,内核装不下,只好上netbsd,netbsd很棒,默认的内核11M,在上面安装了xorg,上了twm窗口管理器,可惜cpu太慢几乎做不了什么了。

小本和说明书、电源和一张pcmiacmoderm卡

小本和我的华硕eeePC900A合影

netbsd启动界面

netbsd自检中

twm桌面管理器下运行行clock和top

部分解决了samba速度慢的问题

samba服务器配置:

Freebsd8.2+samba3.5 网卡100M

症状:

archlinux客户端100M网卡,上传能达到约8MB/s,但是下载只能达到500KB/s

windowsxp客户端使用54M无线网卡,上传约3MB/s, 下载1MB/s

下载速度比上传慢很多,开通aio支持也没有明显改善。

改进方法:

把samba配置文件中的所有socket选项全部注释掉,下载速度终于提升了

archlinux客户端100M网卡,下载能达到6MB/s

windowsxp客户端使用54M无线网卡, 下载2MB/s

遗留问题:

但是archlinux客户端100M网卡,使用scp上传下载文件的时候速度能达到12MB/s,比samba高很多,是否我的samba还可以进一步调优还需进一步实验。

最近更换了路由器以前的是netgear wgr614v9 现在是jwnr2000,新的路由器下100M有线samba速度能够达到12MB了,无线150M网卡只有笔记本X201i自带的无线的网卡达到过11MB的samba速度,其他无线网卡只能达到9MB左右

 

Freebsd8.2下samba aio_support的问题

我的samba速度很慢,发现网上说打开aio_support(异步读写)可以加速,于是重新编译samba加入aio支持,在smb.conf中加入

aio read size

=

16384

aio write size

=

16384

后发现不能读取超过16k大小的文件了,琢磨了一下原来是freebsd没有加载aio模块,于是手动kldload aio重启samba一切正常,也可以在/boot/default/loader.conf中加入

aio_load="YES"

这样每次开机自动加载。

虽然aio打开了,可是我的samba还是速度很慢。

原创:dyndns使用经验(Arclinux or Freebsd下)

原因

以前使用www.3322.org的二级域名,但是3322的客户端更新ip的时候得到的ip不对,每次都是手动更新,所以转到www.dyndns.org的二级域名了。

//////////////////////////////

附:ddclient配置和使用方法

ddclient的Readme很简单,使用的时候把ddclient拷贝到/usr/sbin,然后在/etc/ddclient/ddclient.conf中加入

## ddclient configuration file
daemon=60
# check every 600 seconds
syslog=yes
# log update msgs to syslog
mail-failure=xxx@xxxl.com # Mail failed updates to user
#pid=/var/run/ddclient.pid
# record PID in file.
## Detect IP with our CheckIP server
use=web, web=checkip.dyndns.com/, web-skip='IP Address'
## DynDNS username and password here
login=username
password=yourpasswd
## Default options
protocol=dyndns2
server=members.dyndns.org
## Dynamic DNS hosts
your_donmain_name.dyndns.org

注意ddclient.conf的权限和所有人,不然ddclient会报错,然后手动运行ddclient就可以了,可以在/var/log/message里面看到ddclient的更新信息。

/////////////////////////////

dyndns的客户端ddclient更新ip效果很好,但是我的是动态ip,设置ddclient定时更新后发现,我的二级域名被dyndns给block了,原来,dyndns网站只要发现ip地址没有发生变化的情况下进行多次更新就会把你的二级域名给block。

我的想法

于是,我想如果做个小程序判断自己的ip是否发生变化,如果变化了在用ddclient更新,就不会被dyndns给block了。检测ip变化可以利用dyndns提供的网页ip检测,即访问网址http://checkip.dyndns.org就可以得ip了,花了个把小时把别人的一个http下载程序修改了下,基本满足了我的需要。该程序每隔20分钟检测下ip是否变化,变化了就用ddclient更新。

源程序如下:

//access http://checkip.dyndns.org/,then return your ip address

//程序采用非阻塞模式
/******* http客户端程序 httpclient.c ************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <unistd.h>
#include <netinet/in.h>
#include <limits.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <ctype.h>
//#include <stropts.h>
#include <unistd.h>
#include <fcntl.h>

//////////////////////////////httpclient.c 开始///////////////////////////////////////////

/********************************************
功能:搜索字符串右边起的第一个匹配字符
********************************************/
char * Rstrchr(char * s, char x)  {

if(!(*s))  return 0;
int i = strlen(s);
while(s[i-1]) if(strchr(s + (i - 1), x))  return (s + (i - 1));  else i--;
return 0;
}

/********************************************
功能:把字符串转换为全小写
上述代码中的:while(*s) *s=tolower(*s++);
应该改为:wh
********************************************/
void ToLowerCase(char * s)  {

while(s && *s) {*s=tolower(*s);s++;}
}

/**************************************************************
功能:从字符串src中分析出网站地址和端口,并得到用户要下载的文件
***************************************************************/
void GetHost(char * src, char * web, char * file, int * port)  {
char * pA;
char * pB;
memset(web, 0, sizeof(web));
memset(file, 0, sizeof(file));
*port = 0;
if(!(*src))  return;
pA = src;
if(!strncmp(pA, "http://", strlen("http://")))  pA = src+strlen("http://");
else if(!strncmp(pA, "https://", strlen("https://")))  pA = src+strlen("https://");
pB = strchr(pA, '/');
if(pB)  {
memcpy(web, pA, strlen(pA) - strlen(pB));
if(pB+1)  {
memcpy(file, pB + 1, strlen(pB) - 1);
file[strlen(pB) - 1] = 0;
}
}
else  memcpy(web, pA, strlen(pA));
if(pB)  web[strlen(pA) - strlen(pB)] = 0;
else  web[strlen(pA)] = 0;
pA = strchr(web, ':');
if(pA)  *port = atoi(pA + 1);
else *port = 80;
}
////////////////////////////////////////////////////////////////////
int main(int argc, char *argv[])
{
int sockfd;
char buffer[1024],buffer_bak[1024],buffer_tmp[1024];
struct sockaddr_in server_addr;
struct hostent *host;
int portnumber,nbytes;
char host_addr[256];
char host_file[1024];
char request[1024];
char pattern[]="<html><head><title>Current IP Check</title></head><body>Current IP Address";
int send, totalsend;
int k,i;
long flag=0,*longp;
char * pt;
char dyndns_site[]="http://checkip.dyndns.org/";

//this send http request to this web site will get your ip address
ToLowerCase(dyndns_site);/*将参数转换为全小写*/
//  printf("lowercase parameter.1 is: %s\n", dyndns_site);
GetHost(dyndns_site, host_addr, host_file, &portnumber);/*分析网址、端口、文件名等*/
memset(buffer_bak, 0, sizeof(buffer_bak));
memset(buffer, 0, sizeof(buffer));
memset(buffer_tmp, 0, sizeof(buffer_tmp));
sockfd=0;
while(1)
{
if((host=gethostbyname(host_addr))==NULL)/*取得主机IP地址*/
{
sleep(10);
printf("myddclient:network error 1,can not resolv host\n");
continue;
}
/* 客户程序开始建立 sockfd描述符 */
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)/*建立SOCKET连接*/
{
sleep(10);
printf("myddclient:network error 2,can not initial socket\n");
continue;
}
/* 客户程序填充服务端的资料 */
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(portnumber);
server_addr.sin_addr=*((struct in_addr *)host->h_addr);
/* 客户程序发起连接请求 */
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)/*连接网站*/
{
sleep(10);
printf("myddclient:network error 3,can not connect to host\n");
close(sockfd);
continue;
}

//set to nonblock mode
fcntl(sockfd, F_SETFL, O_NDELAY);
sprintf(request, "GET /%s HTTP/1.1\r\nAccept: */*\r\nAccept-Language: zh-cn\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\r\nHost: %s:%d\r\nConnection: Close\r\n\r\n", host_file, host_addr, portnumber);
/*取得真实的文件名*/
if(host_file && *host_file)  pt = Rstrchr(host_file, '/');
else pt = 0;
/*发送http请求request*/
send = 0;totalsend = 0;
nbytes=strlen(request);
k=0;
while(totalsend < nbytes) {
send = write(sockfd, request + totalsend, nbytes - totalsend);
if(send==-1)  {printf("myddclient:send error!%s\n", strerror(errno));k=1;   close(sockfd); break;}
totalsend+=send;
}
if(k==1)continue;

/* 连接成功了,接收http响应,response */
k=0;
i=0;
sleep(20);
memset(buffer_tmp, 0, sizeof(buffer_tmp));
nbytes=read(sockfd,buffer,1024);
flag=-1;
while(nbytes>0)
{
nbytes--;
flag++;
if(i < 4)  {
if(buffer[flag] == '\r' || buffer[flag] == '\n')  i++;
else i = 0;
}
else  {
buffer_tmp[k]=buffer[flag];
k++;if(k==1024)k=1023;
i++;
if(i==1024)i=1023;
}
}
k=0;
for(i=0;i<strlen(pattern);i++)
if(buffer_tmp[i]!=pattern[i])
{
k=1;
break;
}
if(strcmp(buffer_tmp,buffer_bak)!=0&&k==0)
{
system("/usr/sbin/ddclient");
printf("myddclient ok!\n");
}
else
{
if(k==0)
{
// printf("need not update!\n");
}
else
{
printf("myddclient:error\n get html page is %s!\n",buffer_tmp);
// flag++;
//longp=(long*)buffer_bak;
//*longp=flag;
}
}
memset(buffer_bak, 0, sizeof(buffer_bak));
strcpy(buffer_bak,buffer_tmp);
memset(buffer_tmp,0,sizeof(buffer_tmp));
close(sockfd);
sockfd=0;
sleep(1200);
/* 结束通讯 */

}
}
//////////////////////////////httpclient.c 结束///////////////////////////////////////////

//////////////////////////////httpclient.c 结束///////////////////////////////////////////

第 1 页,共 6 页12345...最旧 »