分类: *BSD

学习BSD-UNIX系统

  • samba passwd的几种方式

    passdb backend就是用户后台的意思。目前有三种后台:smbpasswd、tdbsam和ldapsam。sam应该是security account manager(安全账户管理)的简写。

     

    1.smbpasswd

     

    passdb backend = smbpasswd

     

    该方式是使用smb自己的工具smbpasswd来给系统用户(真实用户或者虚拟用户)设置一个Samba密码,客户端就用这个密码来访问Samba的资源。smbpasswd文件默认在/etc/samba目录下,不过有时候要手工建立该文件。

     

    smbpasswd -a 用户名 #添加一个samba用户

    smbpasswd -d 用户名 #禁用一个samba用户

    smbpasswd -e 用户名 #恢复一个samba用户

    smbpasswd -x 用户名 #删除一个samba用户

     

    2.tdbsam

     

    passdb backend = tdbsam

     

    该方式则是使用一个数据库文件来建立用户数据库。数据库文件叫passdb.tdb,默认在/etc/samba目录下。passdb.tdb 用户数据库可以使用smbpasswd –a来建立Samba用户,不过要建立的Samba用户必须先是系统用户。我们也可以使用pdbedit命令来建立Samba账户并由其pdbedit管 理。

     

    用户的建立可以先用mksmbpasswd建立一个smppasswd文件,然后用pdbedit将文件里的用户导入数据库。

     

    cat /etc/passwd | mksmbpasswd > /etc/samba/smbpasswd

     

    pdbedit命令的参数很多,我们列出几个主要的:

     

    pdbedit -i smbpasswd:/etc/samba/smbpasswd

    pdbedit -a username:新建Samba账户。

    pdbedit -x username:删除Samba账户。

    pdbedit -L:列出Samba用户列表,读取passdb.tdb数据库文件。

    pdbedit -Lv:列出Samba用户列表的详细信息。

    pdbedit -c “[D]” –u username:暂停该Samba用户的账号。

    pdbedit -c “[]” –u username:恢复该Samba用户的账号。

     

    3.ldapsam

     

    passdb backend = smbpasswd

     

    该方式则是基于LDAP的账户管理方式来验证用户。首先要建立LDAP服务,然后设置“passdb backend = ldapsam:ldap://LDAP Server”。

     

    注:samba3.x的早期版本默认使用tdb库也就是smb.conf默认设定为passdb backend = tdbsam,只需要注释掉该行添加smb passwd file = /etec/samba/smbpasswd即可使用smbpasswd存储加密密钥。samba3.5.6更加规范了passdb backend参数的使用,取消了smb passwd file设定,如果简单注释掉passdb backend参数,密钥文件也不会被存储到smbpasswd。所以很多人说怎么修改smb.conf的配置,smbpasswd文件都无法生成,就算 手工创建,内容也是0字节。

     

    这里只能说samba版本升级了,规则也变化了。现在无论是使用tdb数据库存储密钥还是smbpasswd文本存储密钥都要设定相对应的 passdb backend参数。要用传统的文本方式存储只需这样设定passdb backend = smbpasswd:/etc/samba/smbpasswd(后面跟的是绝对路径)>,不要再画蛇添足的写上smb passwd file = /etec/samba/smbpasswd,该参数已经不适用于新版本的samba了。

     

    注意,这里的用户名必须是linux中存在的用户,可以使用useradd命令在系统中添加一个用户,然后再增加一个对应的samba用户,也 就是一个用户名使用的是两套密码。一个是系统用户密码,另一个密码存储在/etc/samba/smbpasswd文件中的samba密码,这样可以防止 系统用户密钥外泄带来的安全隐患。

     

    除了上面的措施外,samba还提供了一个更安全的方法,用户名映射功能,这样做的好处是防止系统内的真实用户名暴露,在smb.conf中增 加username map = /etc/samba/smbuser设定,再手工建立该文件。username map参数详解,比如有一个系统用户名为shaogroup.com,同时我们也设定其为samba的登录名,虽然是两套独立的密码,但依然告诉了用户,我系统内 也存在shaogroup.com这个用户。严格的说这也是违背系统安全规则的,不法人士可能会利用该用户名暴力猜解获得系统内帐户权限。samba提供的用户名 映射功能,只需编辑smbuser文件,格式为:真实的用户名 = 映射出的用户名(随便自定义);shaogroup.com = nas_guest nas_nobody(可以映射出多个用户名,注意中间的空格)。设定完成后,我们只需将nas_guest告诉用户即可,无须担心真实的 shaogroup.com用户名暴露。

  • FreeBSD系统优化防止ddos

    1)这个话题有点大,我相信我做的只是其中很小的一部分,同时很多人也会问我,是不是要编译内核,这边的回答是不需要编译任何内核,只需要copy文件,然后重启一下服务器就可以了。

     

    2)加载文件修改

    # vi /boot/loader.conf #加入如下文本

    kern.dfldsiz=”2147483648″ # Set the initial data size limit

    kern.maxdsiz=”2147483648″ # Set the max data size

    kern.ipc.nmbclusters=”0″ # Set the number of mbuf clusters

    kern.ipc.nsfbufs=”66560″ # Set the number of sendfile(2) bufs

    ##解释:

    a. 第一,第二行主要是为了突破1G内存设置的

    b. 第三行其实是bsd的一个bug,当系统并发达到一个数量级的时候,系统会crash,这个是非常糟糕的事情,所幸更改了这个参数后,在高并发的时候,基本可以没有类似情况,当然非常bt的情况,还得进一步想办法

    c. 第四行是读取的文件数,如果你下载的文件比较大,且比较多,加大这个参数,是非常爽的

     

    3)Sysctl修改

    #vi /etc/rc.local

    sysctl kern.ipc.maxsockets=100000 ##增加并发的socket,对于ddos很有用

    sysctl kern.ipc.somaxconn=65535 ##打开文件数

    sysctl net.inet.tcp.msl=2500 ##timeout时间

     

    4)通过上述的简单优化,会给你带来意外的惊喜,如果有兴趣的兄弟,可以尝试一下看看,绝无副作用。

  • freebsd卸载及重新安装程序

    以php5-pcre为例:

    cd /usr/ports/devel/php5-pcre

    make deinstall rmconfig clean

    make build

    make install

    make clean

    apachectl gracefull

     

     

    完整删除软件

    进入 cd /var/db/pkg

    找到你要删除的软件

    pkg_delete nginx-0.5.33

    也可以使用如[pkg_delete p5-D* ]通配符,一次删除多个软件

  • FreeBSD与Linux下date取日期的方法

    今天日期(CST格式):

    FreeBSD:

    test# date

    2011年 03月 22日 星期二 09:27:47 CST

    Debian:

    [root@shaobo ~]# date

    2011年 03月 22日 星期二 09:27:47 CST

     

    今天日期(数字格式):

    FreeBSD:

    test# date +%Y%m%d

    20110322

    Debian:

    [root@shaobo ~]# date +%Y%m%d

    20110322

     

    昨天日期(数字格式):

    FreeBSD:

    test# date -v -1d +%Y%m%d

    20110321

    Debian:

    [root@shaobo ~]# date +%Y%m%d –date=’1 days ago’

    20110321

    [root@shaobo ~]# date –date=’yesterday’ +%Y%m%d

    20110321

     

    前天日期(数字格式):

    FreeBSD:

    test# date -v -2d +%Y%m%d

    20110320

    Debian:

    [root@shaobo ~]# date +%Y%m%d –date=’2 days ago’

    20110320

     

    明天日期:

    FreeBSD:

    test# date -v +1d +%Y%m%d

    20110323

    Debian:

    [root@shaobo ~]# date +%Y%m%d –date=’tomorrow’

    20110323

    [root@shaobo ~]# date -d “1 day” “+%Y%m%d”

    20110323

     

    后天日期:

    FreeBSD:

    test# date -v +2d +%Y%m%d

    20110324

    Debian:

    [root@shaobo ~]# date -d “2 day” “+%Y%m%d”

    20110324

     

    date +%s 可以得到UNIX的时间戳;

    [root@shaobo ~]# date +%s

    1300758867

    [root@shaobo ~]# vi utc.sh

    #!/bin/sh

    date -d ‘1970-01-01 UTC ‘$1′ seconds’ +”%Y%m%d”

    [root@shaobo ~]# chmod +x utc.sh

    [root@shaobo ~]# ./utc.sh 1300758867

    20110322

  • FreeBSD crontab的用法

    使用权限 : 所有使用者

    使用方式 :

    crontab [ -u user ] file

    crontab [ -u user ] { -l | -r | -e }

    说明 :

    crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。

    参数 :

    crontab-e: 执行文字编辑器来设定时程表,FREEBSD内定的文字编辑器是 VI,如果你想用别的文字编辑器,可以编辑/root/.cshrc文件setenv  EDITOR  vi 改为setenv  EDITOR  ee

    crontab-r: 删除目前的时程表

    crontab-l: 列出目前的时程表

    crontab file [-u user]-用指定的文件替代目前的crontab。

     

     

    时程表的格式如下 :

    f1            f2                   f3                f4                  f5                program

    分钟    小时    月份中的第几日   月份    星期中的第几天   要执行的程序。

     

    当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其馀类推

    当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推

    当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推

    当 f1 为 a, b, c,… 时表示第 a, b, c,… 分钟要执行,f2 为 a, b, c,… 时表示第 a, b, c…个小时要执行,其馀类推

    使用者也可以将所有的设定先存放在档案 file 中,用 crontab file 的方式来设定时程表。

    Linux中,个人用户的crontab放在/var/spool/cron下

    FreeBSD中,个人用户的crontab放在/var/cron/tabs下

     

    二者都有/etc/crontab文件,在这个文件中执行crontab定时任务要加入执行用户。

     

    重启crontab使生效

    freebsd下:/etc/rc.d/cron restart

    linux下:/etc/init.d/crond restart

     

  • FreeBSD下Mount总结

    一、mount FAT/FAT32分区(C盘为例)

    mount -t msdos /dev/ad0s1 /mnt
    

    mount_msdos /dev/ad0s1 /mnt     #for 4.x
    mount_msdosfs /dev/ad0s1 /mnt   #for 5.x
    

    二、mout Windows的扩展分区(FAT/FAT32)

    命令和“一”一样,只是要记住:扩展分区从s5开始,例如mount D盘,可用:

    mount -t msdos /dev/ad0s5 /mnt
    mount_msdos /dev/ad0s5 /mnt     #for 4.x
    mount_msdosfs /dev/ad0s5 /mnt   #for 5.x
    

    三、mount NTFS分区(C盘为例)

    mount -t ntfs /dev/ad0s1 /mnt
    

    mount_ntfs /dev/ad0s1 /mnt
    

    [注意]

    1.chinese/gbfs 的 ntfs 似乎有问题,不建议玩家级用户使用

    2.要让mount上的windows 分区(或CD-ROM)显示中文,需要升级你的ports,再安装gbfs:

    #cd /usr/ports/chinese/gbfs
    #make install clean
    

    然后编译内核,注释掉”options CD9660″,”options MSDOS”。

    3.在5.1-current上不用安装gbfs,用:

    mount_msdosfs -L zh_CN.GB18030 /dev/ad0sX /mnt
    

    命令就可以支持FAT32分区上的中文文件名,当然,locale可以不用18030,zh_CN.eucCN, zh_CN.GBK都可以!

    四、mount Linux Ext2fs/Ext3fs

    在内核里面加入“options EXT2FS”,编译内核。mount 的时候用“mount_ext2fs”命令即可,ext3fs的mount也用“mount_ext2fs”。

    五、mount 普通数据光盘

    mount_cd9660 /dev/acd0 /cdrom
    

    六、mount ISO 文件

    在5.x中如下

    mdconfig -a -t vnode -f abc.iso -u 1
    mount_cd9660 /dev/md1 /cdrom
    

    4.8的版本

    vnconfig /dev/vn0 /home/xiaoche/a.iso
    mount -t cd9660 /dev/vn0 /mnt
    
    umount /mnt
    vnconfig -u /dev/vn0
    

    七、mount CD、VCD、DVD

    播放CD、VCD、DVD不用先mount上。如果你一定要mount上,可以这样:

    #mount_cd9660 -s 0 /dev/acd0 /cdrom
    

    八、mount 软盘

    1.Format:

    # /usr/sbin/fdformat -f 1440 /dev/fd0
    

    2.Run disklabel:

    # /sbin/disklabel -B -r -w /dev/fd0 fd1440
    

    3.Create New FS:

    # /sbin/newfs_msdos /dev/fd0
    

    4.Mount & Use

    #mount_msdosfs /dev/fd0 /mnt
    

    九、mount usb

    确保内核中有如下项:

    device scbus
    device da
    device cd
    

    在GENERIC中默认都有,如果没有,请编译内核。大多数U盘用的是FAT文件系统,所以用以下命令挂载:

    mount -t msdos /dev/da0 /mnt
    

    十、mount ZIP软盘

    #mount_msdosfs /dev/afd0s4 /mnt/zip
  • FreeBSD 中 vmstat 命令详解

    命令輸出的例子:

    % vmstat
     procs      memory      page                   disk   faults         cpu
     r b w     avm    fre   flt  re  pi  po    fr  sr ad0   in   sy   cs us sy id
     1 0 0    185M   212M    49   0   0   0    46   0   0 1132  830  363  0  0 99
    
    

    参数说明
    procs

    r: 在运行的进程数
    b: 在等待io的进程数(等待i/o,paging等等)
    w: 可以进入运行队列但被替换的进程
    memory

    以”K”为单位,包括虚拟内存和真实内存,正在运行或最近20秒在运行的进程所用的虚拟内存将被视为”active”。

    avm: 活动的虚拟内存
    free: 空闲的内存
    page

    统计错误页和活动页,每5秒平均一下,以秒为单位给出数值。

    flt: 错误页总数
    re: 回收的页面
    pi: 进入页面数
    po: 出页面数
    fr: 空余的页面数
    sr: 每秒通过时钟算法扫描的页面
    disk

    显示每秒的磁盘操作。磁盘名字的前两个字母加数字,默认只显示两个磁盘,如果有多的,可以加”-n”来增加数字或在命令行下把磁盘名都填上。

    faults

    显示每秒的中断数。

    in: 设备中断
    sy: 系统中断
    cy: CPU交换
    cpu

    表示CPU的使用状态。

    cs: 用户进程使用的时间
    sy: 系统进程使用的时间
    id: CPU空闲的时间
    数值说明
    如果”r”经常大于4,且”id”经常少于40,表示cpu的负荷很重。
    如果”pi”,”po”长期不等于”0″,表示内存不足。
    如果”disk”经常不等于”0″,且在”b”中的队列大于3,表示”io”性能不好。

  • FreeBSD vmstat详解

    top是给Linux设计的。在FreeBSD VM里面的Free概念和其他OS完全不同,使用top查看Free内存对于FreeBSD来说可以说没什么意义。正确的方法是看vmstat。

     # vmstat
      procs   memory          page                       disk   faults     cpu
      r b w   avm    fre      flt  re  pi   po   fr   sr ad0    in    sy   cs    us  sy id
      0 2 1   270512   20316  30   0   0    0    26   5  1223   1589  98   593   1   1  99

    最好使用vmstat t [n]命令,例如 vmstat 5 10,表示在t(5)秒时间内进行n(10)次采样。如果只使用vmstat,无法反映真正的系统情况。

    procs:
    r–>在运行的进程数
    b–>在等待io的进程数(等待i/o,paging等等)
    w–>可以进入运行队列但被替换的进程
    memoy(以kb为单位,包括虚拟内核和真实内存,正在运行或最近20秒在运行的进程所用的虚拟内存将被视为active)
    avm–>活动的虚拟内存
    free–>空闲的内存
    pages(统计错误页和活动页,每5秒平均一下,以秒为单位给出数值)
    flt–>错误页总数
    re–>回收的页面
    pi–>进入页面数
    po–>出页面数
    fr–>空余的页面数
    sr–>每秒通过时钟算法扫描的页面
    disk 显示每秒的磁盘操作(磁盘名字的前两个字母加数字,默认只显示两个磁盘,如果有多的,可以加-n来增加数字或在命令行下把磁盘名都填上。)

    fault 显示每秒的中断数
    in–>设备中断
    sy–>系统中断
    cs–>cpu交换(上下文切换)
    cpu 表示cpu的使用状态
    cs–>用户进程使用的时间
    sy–>系统进程使用的时间
    id–>cpu空闲的时间

    如果 r经常大于 4 ,且id经常少于40,表示cpu的负荷很重。
    如果pi,po 长期不等于0,表示内存不足。
    如果disk 经常不等于0, 且在 b中的队列 大于3, 表示 io性能不好。

    以下是一个繁忙批量插入MySQL数据(大概每隔20秒可以插入50万多条数据)的vmstat例子:

     procs      memory      page                    disks     faults         cpu
     r b w     avm    fre   flt  re  pi  po    fr  sr da0 da1   in   sy   cs us sy id
     1 0 63  23302M   803M   845   0   0   0     0   0   0   0   17  124  499  6  0 94
     1 0 63  23302M   796M   837   0   0   0     2   0   1   0   18  158  505  6  0 94
     1 0 63  23302M   790M   833   0   0   0     6   0  76   0  159  143  910  6  0 94
     1 0 63  23302M   784M   868   0   0   0    16   0   8   0   34  156  550  6  0 94
     2 0 63  23456M   709M  8317   2   0   0  2383   0  95   0  295 5504 1930  8  1 91
     1 0 63  21975M  1281M 18909   3   0   0 94840   0 620   0 1893 64333 7822 10  4 87
     1 0 63  21975M  1281M   415   0   0   0   342   0   1   0   29  611  566  6  0 94
     1 0 63  22093M   978M 43503   0   0   0  5140   0 2187   0 4225  582 16279  6  2 92

    循环插入到了后面,随着表越来越大,系统调用和上下文切换越来越频繁:

     procs      memory      page                    disks     faults         cpu
     r b w     avm    fre   flt  re  pi  po    fr  sr da0 da1   in   sy   cs us sy id
     1 0 63  23233M   536M 28219   0   0   0   352 51252 869   0 1864 14542 11015  2  3 95
     1 0 63  23349M   834M 12457   0   0   0     4 51247 2078   0 3945  179 14926  6  2 92
     2 0 63  27343M  3130M  9295   0   0   0  2708   0   2      0   73 6988 1377   7  1 92
     ....中间比较正常,因为插入时间比较久
     1 0 63  28788M  2934M 25760   0   0   0  5860   0   620   8 5529 42712 12924 11  2 86
     0 0 63  25963M  3081M  4379   0   0   0 24049   0   3445  15 11274 97350 31798  2  7 91
     0 0 63  33689M  1801M   388   0   0   0  4492   0 4403  15 8780 135421 35502  2  5 93

    不熟悉mysql内部机制,但是很明显,随着表越来越大,表插入速度越来越慢,因为系统调用和上下文切换越来越频繁了,浪费了很多CPU时间。
    到了mysql表里有六千万多条数据时,每插入五十万条记录,已经要耗时100s,整个mysql数据库变得很繁忙,一些几万数据的插入也慢慢不能及时处理。

    以下是一个拷贝4G文件到远程NFS的vmstat例子:

     procs      memory      page                    disks     faults         cpu
     r b w     avm    fre   flt  re  pi  po    fr  sr da0 da1   in   sy   cs us sy id
     2 0 63  19731M  2400M 24415   0   0   0 70077   0  14   0  591 3915 1770 12  1 87
     0 0 63  16352M  3594M   443   0   0   0 154948   0 2471   0 5067 17602 19448  1  2 96
     0 0 63  16352M  3594M     0   0   0   0     0   0 772   0 1590  134 6577  0  0 100
     0 0 63  16352M  3594M     0   0   0   0     0   0 856   0 1750  164 7135  0  0 100
     0 0 63  16361M  3594M  1112   0   0   0  1030   0 400   0  815 1248 3620  0  0 100
     0 0 63  16361M  3594M     0   0   0   0     0   0   0   0   15  116  488  0  0 100
     0 0 63  16352M  3594M   329   0   0   0   352   0 2186   0 4275  595 15809  0  2 98
     0 0 63  16352M  3594M     0   0   0   0     0   0 270   0  532  134 3186  0  0 100
     0 0 63  16352M  3594M     0   0   0   0     0   0 185   0  368  164 2062  0  0 100

     

    最后稳定下来,状态良好的vmstat例子:

     procs      memory      page                    disks     faults         cpu
     r b w     avm    fre   flt  re  pi  po    fr  sr da0 da1   in   sy   cs us sy id
     0 0 63  16292M  3564M     0   0   0   0     0   0   0   0   12  142  472  0  0 100

     

  • freebsd同步时间

    # ntpdate cn.pool.ntp.org

     

    这样时间就准了。

    cn.poolntp.org 是中国的时间服务器。

     

    如想每天晚上23点同步一次时间

    # ee /etc/crontab

    在最后加入

     

    #Synchronise My Server clock

    #minute hour mday month wday who command

    0 23 * * * root /usr/sbin/ntpdate cn.pool.ntp.org > /dev/null

     

    保存退出,就可以了。

  • freebsd 下vsftpd安装错误

    ===> Deinstalling for ftp/vsftpd

    ===> vsftpd-ssl not installed, skipping

    ===> Installing for vsftpd-ssl-3.0.2

    /usr/bin/env PKG_PREFIX=/usr/local /bin/sh /usr/ports/ftp/vsftpd/pkg-install vsftpd-ssl-3.0.2 PRE-INSTALL

    pw: no such user `ftp’

    pw: user ‘ftp’ already exists

    Failed to add user ftp as gid 14

    *** Error code 1

    Stop in /usr/ports/ftp/vsftpd.

    *** Error code 1

    Stop in /usr/ports/ftp/vsftpd.

     

    遇到这个问题后,搞了一天,才得到解决,也不知道是不是对所有人都实用。解决方法如下:

    直接删除ee /etc/password 和 /etc/master.passwd手动删除ftp用户,然后

    pwd_mkdb /etc/master.passwd更新一下ok

    再cd /usr/ports/ftp/vsftpd && make install clean