軟件是對質(zhì)量的不懈追求

          #

          Linux編輯器vim中刪除行尾的^M

          Linux編輯器vim中刪除行尾的^M

          有時候,在 Linux 中使用打開曾在 Windows 中編輯過的文件時,會在行尾看到 ^M 字符。看起來總是感覺很別扭。
          刪除方法如下:
          在 Vim 的命令模式中輸入 :%s/^M$//g 后,回車即會自動刪除該文件中的所有 ^M 字符。
          注意: ^M 要用 Ctrl + v,  Ctrl + m 來輸入,M 后面的 $ 代表匹配行尾的內(nèi)容,最后的 g 則表示每行中匹配到的內(nèi)容都要置換。

          posted @ 2009-11-17 11:28 BlakeSu 閱讀(376) | 評論 (0)編輯 收藏

          進程的地址空間

          一個程序經(jīng)過編譯連接后形成的地址空間是一個虛擬地址空間,而Linux在內(nèi)存尋址時簡化了分段
          機制,使得虛擬地址與線性地址是一致的,比如程序test_wait.c代碼如下:
              #include <stdio.h>
              #include 
          <stdlib.h>                                                                                          
              #include 
          <unistd.h>
              
          int main(int argc, char **argv)
              {
                      
          int i;
                      unsigned 
          char *buff;
                      buff 
          = (char *)malloc(sizeof(char)*1024);
                      printf(
          "pid is :%d\n", getpid());
                     
          for (i = 0; i < 60; i++) {
                             sleep(
          60);
                     }  
                     
          return 0;
             }
          經(jīng)過編譯后形成的文件是test_wait,然后用命令objdump反匯編后如下(只取部分代碼):

          $ objdump -d test_wait
          test_wait:     file format elf32-i386
          Disassembly of section .init:
          08048304 <_init>:
           8048304:   55                       push   %ebp
           8048305:   89 e5                    mov    %esp,%ebp
           8048307:   53                       push   %ebx
           8048308:   83 ec 04                 sub    $0x4,%esp
           804830b:   e8 00 00 00 00           call   8048310 <_init+0xc>
           8048310:   5b                       pop    %ebx
           8048311:   81 c3 e4 1c 00 00        add    $0x1ce4,%ebx
           8048317:   8b 93 fc ff ff ff        mov    -0x4(%ebx),%edx
           804831d:   85 d2                    test   %edx,%edx
           8048301:   e8 2e 00 00 00           call   8048334 <__gmon_start__@plt>
           8048306:   e8 15 01 00 00           call   8048420

          可以看到,其中的地址就是虛擬地址,整個虛擬地址空間大小為3GB,再加上可以通過系統(tǒng)調(diào)用進入
          內(nèi)核的1GB空間,于是每個進程可以擁有4GB的虛擬地址空間(也叫虛擬內(nèi)存)。某個進程的虛擬地
          址空間可以通過/proc文件系統(tǒng)看到:
          $ ./test_wait
          pid is :9840
          重新開一個終端:

          cat /proc/9840/maps
          08048000-08049000 r-xp 00000000 08:01 212891     /home/chen/mem/test_wait
          08049000-0804a000 r--p 00000000 08:01 212891     /home/chen/mem/test_wait
          0804a000-0804b000 rw-p 00001000 08:01 212891     /home/chen/mem/test_wait
          096d5000-096f6000 rw-p 096d5000 00:00 0          [heap]
          b7dee000-b7def000 rw-p b7dee000 00:00 0
          b7def000-b7f47000 r-xp 00000000 08:01 409724     /lib/tls/i686/cmov/libc-2.8.90.so
          b7f47000-b7f49000 r--p 00158000 08:01 409724     /lib/tls/i686/cmov/libc-2.8.90.so
          b7f49000-b7f4a000 rw-p 0015a000 08:01 409724     /lib/tls/i686/cmov/libc-2.8.90.so
          b7f4a000-b7f4d000 rw-p b7f4a000 00:00 0
          b7f59000-b7f5c000 rw-p b7f59000 00:00 0
          b7f5c000-b7f76000 r-xp 00000000 08:01 392460     /lib/ld-2.8.90.so
          b7f76000-b7f77000 r-xp b7f76000 00:00 0          [vdso]
          b7f77000-b7f78000 r--p 0001a000 08:01 392460     /lib/ld-2.8.90.so
          b7f78000-b7f79000 rw-p 0001b000 08:01 392460     /lib/ld-2.8.90.so
          bf964000-bf979000 rw-p bffeb000 00:00 0          [stack]

          關(guān)于此文件的詳細(xì)信息可以參看:
          http://www.kerneltravel.net/?p=287
          由上面的信息可以看到
          08048000-08049000地址段的標(biāo)志是r-xp(讀,執(zhí)行)是代碼段,
          08049000-0804a000的標(biāo)志是rw-p(讀寫)是數(shù)據(jù)段
          096d5000-096f6000是堆也叫空洞,只有當(dāng)程序中調(diào)用malloc()申請空間時才有堆段。
          bf964000-bf979000 是堆棧段
          這樣我們可以看到進程的用戶空間的分配了。如下圖:
           
           

          可以看出代碼段在最低地址依次往上是數(shù)據(jù)段,空洞、堆棧段在最高地址,棧指針向下移動。
          進程的虛擬地址在保存在內(nèi)核中的task_struct(PCB)結(jié)構(gòu)中,定義如下:
          struct task_struct { //進程結(jié)構(gòu)體
          //……
          struct mm_struct *mm;//描述進程的整個用戶空間
          }
          而stuct mm_struct 結(jié)構(gòu)中包含了虛擬空間的結(jié)構(gòu)體字段
          mmap(struct vm_area_struct * mmap),所以可以通過模塊編程來查看進程的虛擬地址空間。
          關(guān)于模塊編程可以看這里:
          http://www.kerneltravel.net/?p=80,程序清單如下:


           #include <linux/module.h>                                                                                     
           #include 
          <linux/init.h>
           #include 
          <linux/interrupt.h>
           #include 
          <linux/sched.h>
           
          static int pid;
           module_param(pid,
          int,0644);
           
          static int __init memtest_init(void)
           {
                   
          struct task_struct *p;
                   
          struct vm_area_struct *temp;
                   printk(
          "My module worked!\n");
                   p 
          = find_task_by_vpid(pid);
                   temp 
          = p->mm->mmap;
                   
          while(temp) {
                           printk(
          "start:%p\tend:%p\n", (unsigned long *)temp->vm_start,
           (unsigned 
          long *)temp->vm_end);
                           temp 
          = temp->vm_next;
                   }  
                   
          return 0;
           }
           
          static void __exit memtest_exit(void)
           {
                   printk(
          "Unloading my module.\n");
                   
          return;
           }
           module_init(memtest_init);
           module_exit(memtest_exit);
           MODULE_LICENSE(
          "GPL");  

          編譯模塊,運行剛才的程序test_wait,然后帶參數(shù)插入模塊,如下:
          $ ./test_wait &
          pid is :9413
          $ sudo insmod mem.ko pid=9413
          [ 2690.715913] My module worked!
          [ 2690.715992] start:08048000    end:08049000
          [ 2690.716005] start:08049000    end:0804a000
          [ 2690.717029] start:0804a000    end:0804b000
          [ 2690.717065] start:096d5000    end:096f6000
          [ 2690.717096] start:b7dee000    end:b7def000
          [ 2690.717126] start:b7def000     end:b7f47000
          [ 2690.717157] start:b7f47000     end:b7f49000
          [ 2690.717187] start:b7f49000     end:b7f4a000
          [ 2690.717217] start:b7f4a000     end:b7f4d000
          [ 2690.717248] start:b7f59000     end:b7f5c000
          [ 2690.717304] start:b7f5c000     end:b7f76000
          [ 2690.717334] start:b7f76000     end:b7f77000
          [ 2690.717364] start:b7f77000     end:b7f78000
          [ 2690.717395] start:b7f78000     end:b7f79000
          [ 2690.717425] start:bf964000     end:bf979000
          可以看出和剛才/proc文件系統(tǒng)中的地址是一樣的。
          在任意一個時刻,一個CPU只有一個進程在運行,所以雖然有時候很多進程的虛擬地址值有相同的
          ,但是由于每次只有一個進程運行,在當(dāng)某個進程運行時cpu就將其虛擬地址也切換進來,這樣就保
          證了每個進程都擁有4GB的地址空間。

          posted @ 2009-11-16 13:15 BlakeSu 閱讀(438) | 評論 (2)編輯 收藏

          LINUX調(diào)優(yōu)方法總結(jié)

          ----------------------------------------------------------------------------------------------------------------------------
          大 多數(shù) Linux 發(fā)布版都定義了適當(dāng)?shù)木彌_區(qū)和其他 Transmission Control Protocol(TCP)參數(shù)。可以修改這些參數(shù)來分配更多的內(nèi)存,從而改進網(wǎng)絡(luò)性能。設(shè)置內(nèi)核參數(shù)的方法是通過 proc 接口,也就是通過讀寫 /proc 中的值。幸運的是,sysctl 可以讀取 /etc/sysctl.conf 中的值并根據(jù)需要填充 /proc,這樣就能夠更輕松地管理這些參數(shù)。清單 2 展示在互聯(lián)網(wǎng)服務(wù)器上應(yīng)用于 Internet 服務(wù)器的一些比較激進的網(wǎng)絡(luò)設(shè)置。
          # Use TCP syncookies when needed
          net.ipv4.tcp_syncookies = 1
          # Enable TCP window scaling
          net.ipv4.tcp_window_scaling: = 1
          # Increase TCP max buffer size
          net.core.rmem_max = 16777216
          net.core.wmem_max = 16777216
          # Increase Linux autotuning TCP buffer limits
          net.ipv4.tcp_rmem = 4096 87380 16777216
          net.ipv4.tcp_wmem = 4096 65536 16777216
          # Increase number of ports available
          net.ipv4.ip_local_port_range = 1024 65000
           
          將這些設(shè)置添加到 /etc/sysctl.conf 的現(xiàn)有內(nèi)容中。第一個設(shè)置啟用 TCP SYN cookie。當(dāng)從客戶機發(fā)來新的 TCP 連接時,數(shù)據(jù)包設(shè)置了 SYN 位,服務(wù)器就為這個半開的連接創(chuàng)建一個條目,并用一個 SYN-ACK 數(shù)據(jù)包進行響應(yīng)。在正常操作中,遠(yuǎn)程客戶機用一個 ACK 數(shù)據(jù)包進行響應(yīng),這會使半開的連接轉(zhuǎn)換為全開的。有一種稱為 SYN 泛濫(SYN flood) 的網(wǎng)絡(luò)攻擊,它使 ACK 數(shù)據(jù)包無法返回,導(dǎo)致服務(wù)器用光內(nèi)存空間,無法處理到來的連接。SYN cookie 特性可以識別出這種情況,并使用一種優(yōu)雅的方法保留隊列中的空間(細(xì)節(jié)參見 參考資料 一節(jié))。大多數(shù)系統(tǒng)都默認(rèn)啟用這個特性,但是確保配置這個特性更可靠。
          啟用 TCP 窗口伸縮使客戶機能夠以更高的速度下載數(shù)據(jù)。TCP 允許在未從遠(yuǎn)程端收到確認(rèn)的情況下發(fā)送多個數(shù)據(jù)包,默認(rèn)設(shè)置是最多 64 KB,在與延遲比較大的遠(yuǎn)程客戶機進行通信時這個設(shè)置可能不夠。窗口伸縮會在頭中啟用更多的位,從而增加窗口大小。
          后面四個配置項增加 TCP 發(fā)送和接收緩沖區(qū)。這使應(yīng)用程序可以更快地丟掉它的數(shù)據(jù),從而為另一個請求服務(wù)。還可以強化遠(yuǎn)程客戶機在服務(wù)器繁忙時發(fā)送數(shù)據(jù)的能力。
          最后一個配置項增加可用的本地端口數(shù)量,這樣就增加了可以同時服務(wù)的最大連接數(shù)量。
          在下一次引導(dǎo)系統(tǒng)時,或者下一次運行 sysctl -p /etc/sysctl.conf 時,這些設(shè)置就會生效。
           
          ----------------------------------------------------------------------------------------------------------------------------
          磁盤子系統(tǒng)的調(diào)優(yōu)
          磁盤在 LAMP 架構(gòu)中扮演著重要的角色。靜態(tài)文件、模板和代碼都來自磁盤,組成數(shù)據(jù)庫的數(shù)據(jù)表和索引也來自磁盤。對磁盤的許多調(diào)優(yōu)(尤其是對于數(shù)據(jù)庫)集中于避免磁盤訪問,因為磁盤訪問的延遲相當(dāng)高。因此,花一些時間對磁盤硬件進行優(yōu)化是有意義的。
          首先要做的是,確保在文件系統(tǒng)上禁用 atime 日志記錄特性。atime 是最近訪問文件的時間,每當(dāng)訪問文件時,底層文件系統(tǒng)必須記錄這個時間戳。因為系統(tǒng)管理員很少使用 atime,禁用它可以減少磁盤訪問時間。禁用這個特性的方法是,在 /etc/fstab 的第四列中添加 noatime 選項。

          演示如何啟用 noatime 的 fstab 示例
                         
          /dev/VolGroup00/LogVol00 /                      ext3    defaults,noatime        1 1
          LABEL=/boot             /boot                   ext3    defaults,noatime        1 2
          devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
          tmpfs                   /dev/shm                tmpfs   defaults        0 0
          proc                    /proc                   proc    defaults        0 0
          sysfs                   /sys                    sysfs   defaults        0 0
          LABEL=SWAP-hdb2         swap                    swap    defaults        0 0
          LABEL=SWAP-hda3         swap                    swap    defaults        0 0
           

          有多種磁盤硬件組合,而且 Linux 不一定能夠探測出訪問磁盤的最佳方式。可以使用 hdparm 命令查明和設(shè)置用來訪問 IDE 磁盤的方法。hdparm -t /path/to/device 執(zhí)行速度測試,可以將這個測試結(jié)果作為性能基準(zhǔn)。為了使結(jié)果盡可能準(zhǔn)確,在運行這個命令時系統(tǒng)應(yīng)該是空閑的。
          在 /dev/hd 上執(zhí)行的速度測試
                         
          # hdparm -t /dev/hda
          /dev/hda:
           Timing buffered disk reads:  182 MB in  3.02 seconds =  60.31 MB/sec
           

           hdparm 的常用選項
          選項 描述
          -vi 向磁盤查詢它支持的設(shè)置以及它正在使用的設(shè)置。
          -c 查詢/啟用 (E)IDE 32 位 I/O 支持。hdparm -c 1 /dev/hda 啟用這個設(shè)置。
          -m 查詢/設(shè)置每中斷多扇區(qū)模式。如果設(shè)置大于零,設(shè)置值就是每個中斷可以傳輸?shù)淖畲笊葏^(qū)數(shù)量。
          -d 1 -X 啟用直接內(nèi)存訪問(DMA)傳輸并設(shè)置 IDE 傳輸模式。hdparm 手冊頁詳細(xì)說明了在 -X 后面可以設(shè)置的數(shù)字。只有在 -vi 說明目前并未使用最快速的模式的情況下,才需要進行這個設(shè)置。

          不幸的是,對于 Fiber Channel and Small Computer Systems Interface(SCSI)系統(tǒng),調(diào)優(yōu)依賴于具體的驅(qū)動器。
          必須將有幫助的設(shè)置添加到啟動腳本中,比如 rc.local。

          ----------------------------------------------------------------------------------------------------------------------------
          TCP/IP子系統(tǒng)的調(diào)優(yōu)
          所有的TCP/IP調(diào)優(yōu)參數(shù)都位于/proc/sys/net/目錄. 例如, 下面是最重要的一些調(diào)優(yōu)參數(shù), 后面是它們的含義:
            1. /proc/sys/net/core/rmem_max — 最大的TCP數(shù)據(jù)接收緩沖
            2. /proc/sys/net/core/wmem_max — 最大的TCP數(shù)據(jù)發(fā)送緩沖
            3. /proc/sys/net/ipv4/tcp_timestamps — 時間戳在(請參考RFC 1323)TCP的包頭增加12個字節(jié)
            4. /proc/sys/net/ipv4/tcp_sack — 有選擇的應(yīng)答
            5. /proc/sys/net/ipv4/tcp_window_scaling — 支持更大的TCP窗口. 如果TCP窗口最大超過65535(64K), 必須設(shè)置該數(shù)值為1
            6. rmem_default — 默認(rèn)的接收窗口大小
            7. rmem_max — 接收窗口的最大大小
            8. wmem_default — 默認(rèn)的發(fā)送窗口大小
            9. wmem_max — 發(fā)送窗口的最大大小
            /proc目錄下的所有內(nèi)容都是臨時性的, 所以重啟動系統(tǒng)后任何修改都會丟失.
            建議在系統(tǒng)啟動時自動修改TCP/IP參數(shù):
            把下面代碼增加到/etc/rc.local文件, 然后保存文件, 系統(tǒng)重新引導(dǎo)的時候會自動修改下面的TCP/IP參數(shù):
            echo 256960 > /proc/sys/net/core/rmem_default
            echo 256960 > /proc/sys/net/core/rmem_max
            echo 256960 > /proc/sys/net/core/wmem_default
            echo 256960 > /proc/sys/net/core/wmem_max
            echo 0 > /proc/sys/net/ipv4/tcp_timestamps
            echo 1 > /proc/sys/net/ipv4/tcp_sack
            echo 1 > /proc/sys/net/ipv4/tcp_window_scaling
            TCP/IP參數(shù)都是自解釋的, TCP窗口大小設(shè)置為256960, 禁止TCP的時間戳(取消在每個數(shù)據(jù)包的頭中增加12字節(jié)), 支持更大的TCP窗口和TCP有選擇的應(yīng)答.
            上面數(shù)值的設(shè)定是根據(jù)互連網(wǎng)連接和最大帶寬/延遲率來決定.
            注: 上面實例中的數(shù)值可以實際應(yīng)用, 但它只包含了一部分參數(shù).
            另外一個方法: 使用 /etc/sysctl.conf 在系統(tǒng)啟動時將參數(shù)配置成您所設(shè)置的值:
            net.core.rmem_default = 256960
            net.core.rmem_max = 256960
            net.core.wmem_default = 256960
            net.core.wmem_max = 256960
            net.ipv4.tcp_timestamps = 0
            net.ipv4.tcp_sack =1
            net.ipv4.tcp_window_scaling = 1
          ----------------------------------------------------------------------------------------------------------------------------
          文件子系統(tǒng)的調(diào)優(yōu)

          ulimit -a 用來顯示當(dāng)前的各種用戶進程限制。
          Linux對于每個用戶,系統(tǒng)限制其最大進程數(shù)。為提高性能,可以根據(jù)設(shè)備資源情況,
          設(shè)置各linux 用戶的最大進程數(shù),下面我把某linux用戶的最大進程數(shù)設(shè)為10000個:
              ulimit -u 10000
              對于需要做許多 socket 連接并使它們處于打開狀態(tài)的 Java 應(yīng)用程序而言,
              最好通過使用 ulimit -n xx 修改每個進程可打開的文件數(shù),缺省值是 1024。
              ulimit -n 4096 將每個進程可以打開的文件數(shù)目加大到4096,缺省為1024
              其他建議設(shè)置成無限制(unlimited)的一些重要設(shè)置是:
              數(shù)據(jù)段長度:ulimit -d unlimited
              最大內(nèi)存大小:ulimit -m unlimited
              堆棧大小:ulimit -s unlimited
             CPU 時間:ulimit -t unlimited
              虛擬內(nèi)存:ulimit -v unlimited
              暫時地,適用于通過 ulimit 命令登錄 shell 會話期間。
              永久地,通過將一個相應(yīng)的 ulimit 語句添加到由登錄 shell 讀取的文件中, 即特定于 shell 的用戶資源文件,如:
          1)、解除 Linux 系統(tǒng)的最大進程數(shù)和最大文件打開數(shù)限制:
                 vi /etc/security/limits.conf
                 # 添加如下的行
                 * soft noproc 11000
                 * hard noproc 11000
                 * soft nofile 4100
                 * hard nofile 4100
             說明:* 代表針對所有用戶
                             noproc 是代表最大進程數(shù)
                             nofile 是代表最大文件打開數(shù)
          2)、讓 SSH 接受 Login 程式的登入,方便在 ssh 客戶端查看 ulimit -a 資源限制:
                 a、vi /etc/ssh/sshd_config
                   把 UserLogin 的值改為 yes,并把 # 注釋去掉
                 b、重啟 sshd 服務(wù):
                       /etc/init.d/sshd restart
          3)、修改所有 linux 用戶的環(huán)境變量文件:
          vi /etc/profile
          ulimit -u 10000
          ulimit -n 4096
          ulimit -d unlimited
          ulimit -m unlimited
          ulimit -s unlimited
          ulimit -t unlimited
          ulimit -v unlimited
           
          /**************************************
          有時候在程序里面需要打開多個文件,進行分析,系統(tǒng)一般默認(rèn)數(shù)量是1024,(用ulimit -a可以看到)對于正常使用是夠了,但是對于程序來講,就太少了。
          修改2個文件。
          1./etc/security/limits.conf
          vi /etc/security/limits.conf
          加上:
          * soft nofile 8192
          * hard nofile 20480
          2./etc/pam.d/login
          session required /lib/security/pam_limits.so
          **********
          另外確保/etc/pam.d/system-auth文件有下面內(nèi)容
          session required /lib/security/$ISA/pam_limits.so
          這一行確保系統(tǒng)會執(zhí)行這個限制。
          ***********
          3.一般用戶的.bash_profile
          #ulimit -n 1024
          重新登陸ok

          ----------------------------------------------------------------------------------------------------------------------------

          內(nèi)存子系統(tǒng)的調(diào)優(yōu)
            內(nèi)存子系統(tǒng)的調(diào)優(yōu)不是很容易,需要不停地監(jiān)測來保證內(nèi)存的改變不會對服務(wù)器的其他子系統(tǒng)造成負(fù)面影響。如果要改變虛擬內(nèi)存參數(shù)(在/proc/sys/vm),建議您每次只改變一個參數(shù)然后監(jiān)測效果。對與虛擬內(nèi)存的調(diào)整包括以下幾個項目:
            配置Linux內(nèi)核如何更新dirty buffers到磁盤。磁盤緩沖區(qū)用于暫存磁盤的數(shù)據(jù)。相對于內(nèi)存來講,磁盤緩沖區(qū)的速度很慢。因此,如果服務(wù)器使用這類內(nèi)存,性能會成問題。當(dāng)緩沖區(qū)內(nèi) 的數(shù)據(jù)完全dirty,使用:sysctl -w vm.bdflush="30 500 0 0 500 3000 60 20 0"
            vm.bdflush有9個參數(shù),但是建議您只改變其中的3個:
            1 nfract, 為排隊寫入磁盤前,bdflush daemon允許的緩沖區(qū)最大百分比
          2 ndirty, 為bdflush即刻寫的最大緩沖區(qū)的值。如果這個值很大,bdflush需要更多的時間完成磁盤的數(shù)據(jù)更新。
            7 nfract_sync, 發(fā)生同步前,緩沖區(qū)變dirty的最大百分比
            配置kswapd daemon,指定Linux的內(nèi)存頁數(shù)量
            sysctl -w vm.kswapd="1024 32 64"
            三個參數(shù)的描述如下:
          – tries_base 相當(dāng)于內(nèi)核每次所的“頁”的數(shù)量的四倍。對于有很多交換信息的系統(tǒng),增加這個值可以改進性能。
          – tries_min 是每次kswapd swaps出去的pages的最小數(shù)量。
          – swap_cluster 是kswapd 即刻寫如的pages數(shù)量。數(shù)值小,會提高磁盤I/O的性能;數(shù)值大可能也會對請求隊列產(chǎn)生負(fù)面影響。
            如果要對這些參數(shù)進行改動,請使用工具vmstat檢查對性能的影響。其它可以改進性能的虛擬內(nèi)存參數(shù)為:
            _ buffermem
          _ freepages
          _ overcommit_memory
          _ page-cluster
          _ pagecache
          _ pagetable_cache

          ----------------------------------------------------------------------------------------------------------------------------

          網(wǎng)絡(luò)子系統(tǒng)的調(diào)優(yōu)
            操作系統(tǒng)安裝完畢,就要對網(wǎng)絡(luò)子系統(tǒng)進行調(diào)優(yōu)。對其它子系統(tǒng)的影響:影響CPU利用率,尤其在有大量TCP連接、塊尺寸又非常小時,內(nèi)存的使用會明顯增加。
            如何預(yù)防性能下降
            如下的sysctl命令用于改變安全設(shè)置,但是它也可以防止網(wǎng)絡(luò)性能的下降。這些命令被設(shè)置為缺省值。
            ◆關(guān)閉如下參數(shù)可以防止黑客對服務(wù)器IP地址的攻擊
          sysctl -w net.ipv4.conf.eth0.accept_source_route=0
          sysctl -w net.ipv4.conf.lo.accept_source_route=0
          sysctl -w net.ipv4.conf.default.accept_source_route=0
          sysctl -w net.ipv4.conf.all.accept_source_route=0
          ◆開啟TCP SYN cookies,保護服務(wù)器避免受syn-flood攻擊,包括服務(wù)取決denial-of-service (DoS) 或者分布式服務(wù)拒絕distributed denial-of-service (DDoS) (僅適用Red Hat Enterprise Linux AS)
          sysctl -w net.ipv4.tcp_syncookies=1
          ◆以下命令使服務(wù)器忽略來自被列入網(wǎng)關(guān)的服務(wù)器的重定向。因重定向可以被用來進行攻擊,所以我們只接受有可靠來源的重定向。
          sysctl -w net.ipv4.conf.eth0.secure_redirects=1
          sysctl -w net.ipv4.conf.lo.secure_redirects=1
          sysctl -w net.ipv4.conf.default.secure_redirects=1
          sysctl -w net.ipv4.conf.all.secure_redirects=1

          另外,你可以配置接受或拒絕任何ICMP重定向。ICMP重定向是器傳輸信息的機制。比如,當(dāng)網(wǎng)關(guān)接收到來自所接網(wǎng)絡(luò)主機的 Internet數(shù)據(jù)報時,網(wǎng)關(guān)可以發(fā)送重定向信息到一臺主機。網(wǎng)關(guān)檢查路由表獲得下一個網(wǎng)關(guān)的地址,第二個網(wǎng)關(guān)將數(shù)據(jù)報路由到目標(biāo)網(wǎng)絡(luò).關(guān)閉這些重定向 得命令如下:
          sysctl -w net.ipv4.conf.eth0.accept_redirects=0
          sysctl -w net.ipv4.conf.lo.accept_redirects=0
          sysctl -w net.ipv4.conf.default.accept_redirects=0
          sysctl -w net.ipv4.conf.all.accept_redirects=0
          ◆如果這個服務(wù)器不是一臺路由器,那么它不會發(fā)送重定向,所以可以關(guān)閉該功能:
          sysctl -w net.ipv4.conf.eth0.send_redirects=0
          sysctl -w net.ipv4.conf.lo.send_redirects=0
          sysctl -w net.ipv4.conf.default.send_redirects=0
          sysctl -w net.ipv4.conf.all.send_redirects=0
          ◆配置服務(wù)器拒絕接受廣播風(fēng)暴或者smurf 攻擊attacks:
          sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1
          ◆忽略所有icmp包或者pings:
          sysctl -w net.ipv4.icmp_echo_ignore_all=1
          ◆有些路由器針對廣播禎發(fā)送無效的回應(yīng),每個都產(chǎn)生警告并在內(nèi)核產(chǎn)生日志.這些回應(yīng)可以被忽略:
          sysctl -w net.ipv4.icmp_ignore_bogus_error_responses=1
          針對TCP和UDP的調(diào)優(yōu)
            下邊的命令用來對連接數(shù)量非常大的服務(wù)器進行調(diào)優(yōu).
            ◆對于同時支持很多連接的服務(wù)器,新的連接可以重新使用TIME-WAIT套接字. 這對于Web服務(wù)器非常有效:
          sysctl -w net.ipv4.tcp_tw_reuse=1
          如果你使用該命令,還要啟動TIME-WAIT 套接字狀態(tài)的快速循環(huán)功能:
          sysctl -w net.ipv4.tcp_tw_recycle=1
          圖Figure 10-7顯示出將這些功能啟用,連接數(shù)量明顯降低.因為每個TCP傳輸都包含遠(yuǎn)程客戶端的信息緩存,所以有利于提高性能.緩存中存放round-trip時間、最大segment大小、擁塞窗口的信息。
          ◆ 參數(shù)tcp_fin_timeout 是套接字關(guān)閉時,保持FIN-WAIT-2狀態(tài)的時間。一個TCP連接以three-segment SYN序列開始, 以three-segment FIN序列結(jié)束.均不保留數(shù)據(jù).通過改變tcp_fin_timeout的值, 從FIN序列到內(nèi)存可以空閑出來處理新連接的時間縮短了,使性能得到改進.改變這個值的前要經(jīng)過認(rèn)真的監(jiān)測,避免因為死套接字造成內(nèi)存溢出.
          sysctl -w net.ipv4.tcp_fin_timeout=30
          ◆服務(wù)器的一個問題是,同一時刻的大量TCP連接里有很多的連接被打開但是沒有使用. TCP的keepalive功能檢測到這些連接,缺省情況下,在2小時之后丟掉. 2個小時的可能導(dǎo)致內(nèi)存過度使用,降低性能.因此改成1800秒(30分鐘)是個更好的選擇:
          sysctl -w net.ipv4.tcp_keepalive_time=1800
          ◆對于所有的隊列,設(shè)置最大系統(tǒng)發(fā)送緩存(wmem) 和接收緩存(rmem)到8MB
          sysctl -w net.ipv4.core.wmem_max=8388608
          sysctl -w net.ipv4.core.rmem_max=8388608
          這些設(shè)置指定了創(chuàng)建TCP套接字時為其分配的內(nèi)存容量. 另外,使用如下命令發(fā)送和接收緩存.該命令設(shè)定了三個值:最小值、初始值和最大值:
          sysctl -w net.ipv4.tcp_rmem="4096 87380 8388608"
          sysclt -w net.ipv4.tcp.wmem="4096 87380 8388608"
          第三個值必須小于或等于wmem_max和rmem_max。
            ◆(SUSE LINUX Enterprise Server適用) 通過保留路徑驗證來源數(shù)據(jù)包。缺省情況下,路由器轉(zhuǎn)發(fā)所有的數(shù)據(jù)包,即便是明顯的異常網(wǎng)絡(luò)流量。通過啟動和是的過濾功能,丟掉這些數(shù)據(jù)包:
          sysctl -w net.ipv4.conf.eth0.rp_filter=1
          sysctl -w net.ipv4.conf.lo.rp_filter=1
          sysctl -w net.ipv4.conf.default.rp_filter=1
          sysctl -w net.ipv4.conf.all.rp_filter=1
          ◆當(dāng)服務(wù)器負(fù)載繁重或者是有很多客戶端都是超長延時的連接故障,可能會導(dǎo)致half-open連接數(shù)量的增加。這對于Web服務(wù)器很來講很平 常,尤其有很多撥號客戶時.這些half-open連接保存在 backlog connections 隊列中.將這個值最少設(shè)置為4096 (缺省為1024). 即便是服務(wù)器不接收這類連接,設(shè)置這個值還能防止受到denial-of-service (syn-flood)的攻擊.
          sysctl -w net.ipv4.tcp_max_syn_backlog=4096
          ◆設(shè)置ipfrag參數(shù),尤其是NFS和Samba服務(wù)器。這里,我們可以設(shè)置用于重新組合IP碎片的最大、最小內(nèi)存。當(dāng)ipfrag_high_thresh值被指派,碎片會被丟棄直到達(dá)到ipfrag_low_thres值。
          當(dāng)TCP數(shù)據(jù)包傳輸發(fā)生錯誤時,開始碎片整理。有效的數(shù)據(jù)包保留在內(nèi)存,同時損壞的數(shù)據(jù)包被轉(zhuǎn)發(fā)。例如,設(shè)置可用內(nèi)存范圍從256 MB到384 MB
          sysctl -w net.ipv4.ipfrag_low_thresh=262144
          sysctl -w net.ipv4.ipfrag_high_thresh=393216
          ----------------------------------------------------------------------------------------------------------------------------
          網(wǎng)絡(luò)安全設(shè)置:
          TCP SYN Flood 攻擊
          TCP SYN Flood是一種常見,而且有效的遠(yuǎn)端(遠(yuǎn)程)拒絕服務(wù)(Denial of Service)攻擊方式,它透過一定的操作破壞TCP三次握手建立正常連接,佔用並耗費系統(tǒng)資源,使得提供TCP服務(wù)的主機系統(tǒng)無法正常工作。 由於TCP SYN Flood是透過網(wǎng)路底層對服務(wù)器Server進行攻擊的,它可以在任意改變自己的網(wǎng)路IP地址的同時,不被網(wǎng)路上的其他設(shè)備所識別,這樣就給防範(fàn)網(wǎng)路犯 罪部門追查犯罪來源造成很大的困難。
          系統(tǒng)檢查
            一般情況下,可以一些簡單步驟進行檢查,來判斷系統(tǒng)是否正在遭受TCP SYN Flood攻擊。
            1、 服務(wù)端無法提供正常的TCP服務(wù)。連接請求被拒絕或超時。
            2、透過 netstat -an 命令檢查系統(tǒng),發(fā)現(xiàn)有大量的SYN_RECV連接狀態(tài)。
              3. iptables的設(shè)置,引用自CU
            防止同步包洪水(Sync Flood)
            # iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
            也有人寫作
            #iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
            --limit 1/s 限制syn并發(fā)數(shù)每秒1次,可以根據(jù)自己的需要修改
          防止各種端口掃描
            # iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
            Ping洪水攻擊(Ping of Death)
            # iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
           

          ----------------------------------------------------------------------------------------------------------------------------
          暫定步驟:
          修改/etc/profile文件,加入:
          ulimit -u 10240
          ulimit -n 4096
          ulimit -d unlimited
          ulimit -m unlimited
          ulimit -s unlimited
          ulimit -t unlimited
          ulimit -v unlimited
          修改/etc/rc.d/rc.local,加入:
          echo ‘131072′ > /proc/sys/fs/file-max
          echo ‘131072′ > /proc/sys/fs/inode-max
          (1G內(nèi)存值修改成:65535 2G內(nèi)存值修改成:131072    4G內(nèi)存值修改成:262144)
          修改/etc/sysctl.conf文件,加入:
          net.core.rmem_default = 8388608
          net.core.rmem_max = 8388608
          net.core.wmem_default = 8388608
          net.core.wmem_max = 8388608
          net.ipv4.tcp_timestamps = 0
          net.ipv4.tcp_sack =1
          net.ipv4.tcp_window_scaling = 1
          net.core.netdev_max_backlog=3000
          #Modify i-node
          sys.fs.file-max= 65535
          sys.fs.inode-max= 65535
          #Set System Memory
          vm.bdflush="30 500 0 0 500 3000 60 20 0"
          vm.kswapd="1024 32 64"
          #Disable HackAttack!
          net.ipv4.conf.eth0.accept_source_route=0
          net.ipv4.conf.lo.accept_source_route=0
          net.ipv4.conf.default.accept_source_route=0
          net.ipv4.conf.all.accept_source_route=0
          net.ipv4.conf.lo.accept_redirects=0
          net.ipv4.conf.all.accept_redirects=0
          net.ipv4.conf.eth0.accept_redirects=0
          net.ipv4.conf.default.accept_redirects=0
          net.ipv4.conf.lo.secure_redirects=0
          net.ipv4.conf.all.secure_redirects=0
          net.ipv4.conf.eth0.secure_redirects=0
          net.ipv4.conf.default.secure_redirects=0
          net.ipv4.conf.eth0.send_redirects=0
          net.ipv4.conf.lo.send_redirects=0
          net.ipv4.conf.default.send_redirects=0
          net.ipv4.conf.all.send_redirects=0
          net.ipv4.tcp_syncookies=1
          net.ipv4.icmp_echo_ignore_broadcasts=1
          net.ipv4.icmp_ignore_bogus_error_responses=1
          #Web Servers
          net.ipv4.tcp_tw_reuse=1
          net.ipv4.tcp_tw_recycle=1
          net.ipv4.tcp_fin_timeout=30
          net.ipv4.tcp_keepalive_time=1800
          net.ipv4.core.wmem_max=16777216
          net.ipv4.core.rmem_max=16777216
          net.ipv4.tcp_rmem="4096 87380 8388608"
          net.ipv4.tcp.wmem="4096 87380 8388608"
          net.ipv4.tcp_max_syn_backlog=8192
          防火墻安全:
          iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
          也有人寫作
          iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
          --limit 1/s 限制syn并發(fā)數(shù)每秒1次,可以根據(jù)自己的需要修改
          防止各種端口掃描
          iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
          Ping洪水攻擊(Ping of Death)
          iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
          備注說明:(相對比較激進的網(wǎng)絡(luò)參數(shù)調(diào)整)
          # Use TCP syncookies when needed
          net.ipv4.tcp_syncookies = 1
          # Enable TCP window scaling
          net.ipv4.tcp_window_scaling: = 1
          # Increase TCP max buffer size
          net.core.rmem_max = 16777216
          net.core.wmem_max = 16777216
          # Increase Linux autotuning TCP buffer limits
          net.ipv4.tcp_rmem = 4096 87380 8388608
          net.ipv4.tcp_wmem = 4096 65536 8388608
          # Increase number of ports available
          net.ipv4.ip_local_port_range = 1024 65000
          ----------------------------------------------------------------------------------------------------------------------------
          LINUX安全設(shè)置步驟:
          刪除所有那些不能在你系統(tǒng)上使用的默認(rèn)用戶和組賬戶:  lp,sync,shutdown,halt, news, uucp, operator, games, gopher
          ROOT自動從shell注銷
          編輯你的配置文件”vi /etc/profile”,在某個地方加入如下行,
          “HISTFILESIZE=”
          TMOUT=3600
          我們?yōu)樽兞?#8221;TMOUT=”輸入的這個值使用秒表示的、代表一個小時(60*60=3600秒)。如果你將此行加入你的 “/etc/profile” 文件,那么在一小時的非活動狀態(tài)之后將要系統(tǒng)里的所有用戶自動注銷。你可以在用戶私人的”.bashrc”文件里面
          設(shè)置這個變量,可以在一個確定的時間以后自動注銷他們。
          禁止并且卸載所有沒有用的服務(wù)
          你必須禁止別切卸載所有你不用的的服務(wù),那樣的話,你就能少擔(dān)心一些。看看你的”/etc/inetd.conf”文件, 用注釋的方法禁用(在一行的開始加個#),然后給inetd進程發(fā)送一個SIGHUP命令去更新到當(dāng)前的”inetd.conf”文件。這樣做:
          第一步把”/etc/inetd.conf”更改許可權(quán)限成600,那樣的話,就只有root可以讀和寫。
          [Root@kapil /]# chmod 600 /etc/inetd.conf
          第二步確保”/etc/inetd.conf”的所有者是root。
          第 三步編輯inetd.conf文件(vi /etc/inetd.conf),并且禁止一些服務(wù),就像:ftp, telnet, shell, login, exec, talk, ntalk, imap, pop-2, pop-3, finger, auth等等,除非你打算用它。關(guān)閉這些服務(wù)就降低一些風(fēng)險。
          第四步給你的inetd進程發(fā)送一個HUP信號[root@kapil /]# killall -HUP inetd
          第五步設(shè)置”/etc/inetd.conf”文件為不可更改,使用 chattr 命令,這樣的話,沒人能修改那個文件。*簡單的設(shè)置文件為不可更改,執(zhí)行如下命令:
          [root@kapil /]# chattr +i /etc/inetd.conf
          這將防止對”inetd.conf”文件的任何更改(意外的更改或者其他更改)。只有超級用戶root能設(shè)置或者清除這個文件屬性。修改inetd.conf  *簡單的取消不可更改的設(shè)置,執(zhí)行如下命令:
          [root@kapil /]# chattr -i /etc/inetd.conf
          免疫”/etc/services”文件
          你必須免疫 “/etc/services” 文件,防止未經(jīng)授權(quán)的刪除、增加服務(wù)。
          免疫 “/etc/services” 文件,使用命令:
          [root@kapil /]# chattr +i /etc/services
          禁止Control-Alt-Deletc鍵盤關(guān)機命令
          在你的”/etc/inittab”文件里面注釋掉如下的行(用一個”#”)。
          這樣做,編輯inittab文件(vi /etc/inittab),更換:
          ca::ctrlaltdel:/sbin/shutdown -t3 -r now
          讀入:
          #ca::ctrlaltdel:/sbin/shutdown -t3 -r now
          現(xiàn)在,按照如下提示輸入,讓更改生效:
          [root@kapil /]# /sbin/init q
          為腳本文件整理”/etc/rc.d/init.d”下的權(quán)限
          整理腳本文件的許可權(quán)限,可靠的開始和結(jié)束所有你需要在引導(dǎo)時運行的常態(tài)進程,這樣做:
          [root@kapil/]# chmod -R 700 /etc/rc.d/init.d/*
          這意味著只有root可以被允許讀,寫,和執(zhí)行目錄里面的腳本文件。
          隱藏你的系統(tǒng)信息
          默認(rèn)狀態(tài)下,當(dāng)你登錄到linux機器時,他告訴你Linux分布商的名字,版本,核心版本和服務(wù)器名字。這對一個駭客來說從你的服務(wù)器得到這些信息足夠了以必須立刻用一個”Login:”提示符提示用戶。
          第一步
          這樣做,編輯”/etc/rc.d/rc.local”文件,放置”#”在如下行的前面。
          # This will overwrite /etc/issue at every boot.  So, make any changes you
          # want to make to /etc/issue here or you will lose them when you reboot.
          #echo “” >; /etc/issue
          #echo “$R” >;>; /etc/issue
          #echo “Kernel $(uname -r) on $a $(uname -m)” >;>; /etc/issue
          #
          #cp -f /etc/issue /etc/issue.net
          #echo >;>; /etc/issue
          第二步
          然后,刪除如下文件:在”/etc/”目錄下的”issue.net” 和 “issue”:
          [root@kapil /]# rm -f /etc/issue
          [root@kapil /]# rm -f /etc/issue.net
          禁止未用的 SUID/SGID 程序
          一個常規(guī)用戶如果設(shè)置為SUID root,將能夠作為root運行程序。一個系統(tǒng)管理員必須最小化使用這些 SUID/GUID程序, 而且禁止那些不需要的程序。
          第1步
          從root擁有的程序里發(fā)現(xiàn)所有有`s’ 位的程序,用此命令:
          [root@kapil]# find / -type f \( -perm -04000 -o -perm -02000 \) \-exec ls -lg {} \;
          * 在被選中的程序上禁止suid 位,鍵入如下命令:
          [root@kapil /]# chmod a-s [program]
          關(guān)閉ipv6
          vi /etc/modprobe.conf,在文件中添加以下兩行
          alias net-pf-10 off
          alias ipv6 off
          ----------------------------------------------------------------------------------------------------------------------------

          posted @ 2009-11-15 13:02 BlakeSu 閱讀(304) | 評論 (0)編輯 收藏

          剖析Linux系統(tǒng)中硬鏈接與軟鏈接的區(qū)別

          首先要弄清楚,在Linux系統(tǒng)中,內(nèi)核為每一個新創(chuàng)建的文件分配一個Inode(索引結(jié)點),每個文件都有一個惟一的inode號。文件屬性保存在索引結(jié)點里,在訪問文件時,索引結(jié)點被復(fù)制到內(nèi)存在,從而實現(xiàn)文件的快速訪問。

          鏈接是一種在共享文件和訪問它的用戶的若干目錄項之間建立聯(lián)系的一種方法。Linux中包括兩種鏈接:硬鏈接(Hard Link)和軟鏈接(Soft Link),軟鏈接又稱為符號鏈接(Symbolic link)。

          一、硬鏈接

          硬鏈接說白了是一個指針,指向文件索引節(jié)點,系統(tǒng)并不為它重新分配inode。可以用:ln命令來建立硬鏈接。語法:

          ln [options] existingfile newfile
          ln[options] existingfile-list directory

          用 法: 第一種:為”existingfile”創(chuàng)建硬鏈接,文件名為”newfile”。第二種:在”directory”目錄中, 為”existingfile-list”中包含的所有文件創(chuàng)建一個同名的硬鏈接。常用可選[options] –f 無論”newfile”存在與否,都創(chuàng)建鏈接。-n 如果”newfile”已存在,就不創(chuàng)建鏈接。

          下面舉一些例子:

          $ ls –il
          13058 -rwx - - - - - - 1 longcheng longcheng 48 8月 5 16:38 file1
          13059 -rwx - - - - - - 1 longcheng longcheng 57 8月 5 16:40 file2
          $ ln file2 file2hard
          $ ls –il
          13058 -rwx - - - - - - 1 longcheng longcheng 48 8月 5 16:38 file1
          13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2
          13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2hard

          注 意在創(chuàng)建鏈接前,file1 顯示的鏈接數(shù)目為1,創(chuàng)建鏈接后(1)file1和file1hard的鏈接數(shù)目都變?yōu)?;(2) file1和file1hard在inode號是一樣的(3) file1和file1hard顯示的文件大小也是一樣。可見進行了ln命令的操作結(jié)果:file1和file1hard是同一個文件的兩個名字,它們具 有同樣的索引節(jié)點號和文件屬性,建立文件file1的硬鏈接,就是為file1的文件索引節(jié)點在當(dāng)前目錄上建立一個新指針。如下圖,你可以刪除其中任何一 個,如rm file2 ,每次只會刪除一個指針,

          鏈接數(shù)同時減一,只有將所有指向文件內(nèi)容的指針,也即鏈接數(shù)減為0時,內(nèi)核才會把文件內(nèi)容從磁盤上刪除。當(dāng)前目錄邏輯結(jié)構(gòu):(不好意思圖沒有顯示出來)。

          還可以在不同目錄,但同一文件系統(tǒng)中建立文件的硬鏈接。設(shè)file1、file2在目錄/home/longcheng/dir1中,下面的命令,在/home/longcheng中建立file2的硬鏈接。

          ln file2 /home/longcheng/file2hard

          下面的程序,是將dir1目錄中所有文件,在目錄dir2中建立硬鏈接

          $mkdir dir2
          $ln /home/longcheng/dir1/* /home/longcheng/dir2

          如果使用了 ln –f existingfile newfile,如果newfile已經(jīng)存在,則無論原來newfile是什么文件,只用當(dāng)前用戶對它有寫權(quán)限,newfile就成為exisitngfile的硬鏈接文件。

          盡 管硬鏈接節(jié)省空間,也是Linux系統(tǒng)整合文件系統(tǒng)的傳統(tǒng)方式,但是存在一下不足之處:(1)不可以在不同文件系統(tǒng)的文件間建立鏈接(2)只有超級用戶才 可以為目錄創(chuàng)建硬鏈接。雖然很多樹上說root用戶可以創(chuàng)建,但是筆者在學(xué)習(xí)過程中發(fā)現(xiàn)即使是root用戶也不能創(chuàng)建,我的系統(tǒng)是Redhat,內(nèi)核 2.4、2.6都試過,在其他系統(tǒng)中不知道是不是可以。

          二、軟鏈接(符號鏈接)

          軟鏈接克服了硬鏈接的不足,沒有任何文件系統(tǒng)的限制,任何用戶可以創(chuàng)建指向目錄的符號鏈接。因而現(xiàn)在更為廣泛使用,它具有更大的靈活性,甚至可以跨越不同機器、不同網(wǎng)絡(luò)對文件進行鏈接。

          建立軟鏈接,只要在ln后面加上選項 –s,下面舉個例子

          $ ls -il
          13058 -rwx - - - - - - 1 longcheng longcheng 48 8月 5 16:38 file1
          13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2
          13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2hard
          $ln –s file1 file1soft
          $ls -il
          13058 -rwx - - - - - - 1 longcheng longcheng 48 8月 5 16:38 file1
          13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2
          13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2hard
          13061 lrwxrwxrwx 1 longcheng longcheng 5 8月 5 16:58 file1soft->file1

          從 上面鏈接后的結(jié)果可以看出來軟鏈接與硬鏈接,區(qū)別不僅僅是在概念上,在實現(xiàn)上也是不同的。區(qū)別:硬鏈接原文件&鏈接文件公用一個inode號,說明他們是 同一個文件,而軟鏈接原文件&鏈接文件擁有不同的inode號,表明他們是兩個不同的文件;在文件屬性上軟鏈接明確寫出了是鏈接文件,而硬鏈接沒有寫出 來,因為在本質(zhì)上硬鏈接文件和原文件是完全平等關(guān)系;鏈接數(shù)目是不一樣的,軟鏈接的鏈接數(shù)目不會增加;文件大小是不一樣的,硬鏈接文件顯示的大小是跟原文 件是一樣的,這用強調(diào),因為是等同的嘛,而這里軟鏈接顯示的大小與原文件就不同了,file1大小是48B,而file1soft是5B,這里面的5實際 上就是“file1”的大小。

          總之,建立軟鏈接就是建立了一個新文件。當(dāng)訪問鏈接文件時,系統(tǒng)就會發(fā)現(xiàn)他是個鏈接文件,它讀取鏈接文件找到真正要訪問的文件。

          在不同系統(tǒng)之間建立軟鏈接、對目錄建立鏈接,這里就不舉例了,讀者可以自己去嘗試,我也是在不斷實踐中學(xué)習(xí)的。

          當(dāng) 然軟鏈接也有硬鏈接沒有的缺點,因為鏈接文件包含有原文件的路徑信息,所以當(dāng)原文件從一個目錄下移到其他目錄中,再訪問鏈接文件,系統(tǒng)就找不到了,而硬鏈 接就沒有這個缺陷,你想怎么移就怎么移;還有它要系統(tǒng)分配額外的空間用于建立新的索引節(jié)點和保存原文件的路徑。補充一下:可以通過symlink來查看鏈 接文件,可以用 man symlink來學(xué)習(xí)。

          posted @ 2009-11-14 19:31 BlakeSu 閱讀(175) | 評論 (0)編輯 收藏

          殺手級全局css重置方法匯總

          a-killer-collection-of-global-css-reset-styles


          殺手級全局css重置方法匯總

          由于各個瀏覽器對頁面元素的默認(rèn)邊距等設(shè)置不同,在開發(fā)跨瀏覽器的大型網(wǎng)站時,需要對這些默認(rèn)設(shè)置進行重置。

          這篇文章就是對各種重置方法的匯總。

          posted @ 2009-11-14 17:19 BlakeSu 閱讀(164) | 評論 (0)編輯 收藏

          讓你意想不到:世界網(wǎng)頁之最

          這個世界無奇不有,就連做網(wǎng)頁都要拼個高低長短,當(dāng)你上網(wǎng)百般無聊之際,不妨看一看網(wǎng)絡(luò)中的世界之最吧!

          1.最寬網(wǎng)頁

          你可曾想過,網(wǎng)站就是一道空白的墻壁,然后你可以自由的在墻壁上涂鴉,發(fā)揮你的想象力。

          號稱世界最寬的網(wǎng)站“bluesfear”,是由眾多的藝術(shù)工作者提供一副又一副的創(chuàng)意作品,拉著滾動條好像在坐火車那般,沿途欣賞風(fēng)景。

          bluesfear目前的寬度還在不斷增長中,它還邀請全世界各路設(shè)計師,在“墻上”作畫,讓該網(wǎng)站一直延伸下去,喜歡創(chuàng)作的你也可以設(shè)計一張能夠跟最后一張連續(xù)的圖片提交上去。

          ●網(wǎng)址:http://worm.bluesfear.com/index2.html

          2.最高網(wǎng)頁

          有了最寬網(wǎng)頁,就來看看最高的網(wǎng)頁吧!這個目前高1萬8千939公里的網(wǎng)頁“worlds-highest-website”,瀏覽者可以手動滾動網(wǎng)頁,或使用電梯。如果你向使用滑鼠滾輪看網(wǎng)頁最下面的圖片,應(yīng)該是不可能,除非你非常有耐力。

          ●網(wǎng)址:http://worlds-highest-website.com/

          az

          3.最貴網(wǎng)頁

          英國nottingham大學(xué)生亞力,因籌集自己的大學(xué)學(xué)費而又不想跟銀行借貸款,突發(fā)奇想的用了10分鐘就建立了一個名叫百萬首頁的網(wǎng)站,然后將這個網(wǎng)站的首頁平均分成1萬份,每一份只是一個小小的格子。

          他宣稱每個格子賣100美元,買家可以在自己購買的格子中隨意放任何東西,包括商標(biāo)、名字、或者特意設(shè)計的圖片鏈接等等。于是一個幾乎是零成本的網(wǎng)頁在經(jīng)過Alex的創(chuàng)意后,總價值就變成了一個高達(dá)百萬美元的網(wǎng)頁。 中國站.長.站

          ●網(wǎng)址:http://www.milliondollarhomepage.com

          4.最小網(wǎng)頁

          由阿蘭·奧登設(shè)計的世界最小的網(wǎng)站“guimp”,它的首頁的大小只相當(dāng)于一個圖標(biāo),此外什么也沒有。雖然設(shè)計小,但五臟俱全,里面還有游戲、博客、相冊等,不過這網(wǎng)站非常考你的視力,也許想看也看不到。

          ●網(wǎng)址:http://www.guimp.com

          posted @ 2009-11-14 17:14 BlakeSu 閱讀(176) | 評論 (0)編輯 收藏

          MySQL用戶管理

          MySQL管理員應(yīng)該知道如何設(shè)置MySQL用戶賬號,指出哪個用戶可以連接服務(wù)器,從哪里連接,連接后能做什么。MySQL 3.22.11開始引入兩條語句使得這項工作更容易做:GRANT語句創(chuàng)建MySQL用戶并指定其權(quán)限,而REVOKE語句刪除權(quán)限。兩條語句扮演了 mysql數(shù)據(jù)庫的前端角色,并提供與直接操作這些表的內(nèi)容不同的另一種方法。CREATE和REVOKE語句影響4個表:授權(quán)表

          內(nèi)容

          user 能連接服務(wù)器的用戶以及他們擁有的任何全局權(quán)限
          db 數(shù)據(jù)庫級權(quán)限
          tables_priv 表級權(quán)限
          columns_priv 列級權(quán)限


          還有第5個授權(quán)表(host),但它不受GRANT和REVOKE的影響。

          當(dāng)你對一個用戶發(fā)出一條GRANT語句時,在user表中為該用戶創(chuàng)建一條記錄。如果語句指定任何全局權(quán)限(管理權(quán)限或適用于所有數(shù)據(jù)庫的權(quán)限),這些 也記錄在user表中。如果你指定數(shù)據(jù)庫、表和列級權(quán)限,他們被分別記錄在db、tables_priv和columns_priv表中。

          用GRANT和REVOKE比直接修改授權(quán)表更容易些,然而,建議你閱讀一下《MySQL安全性指南》。這些表異常重要,而且作為一名管理員,你應(yīng)該理解它們?nèi)绾纬紾RANT和REVOKE語句的功能水平。

          在下面的章節(jié)中,我們將介紹如何設(shè)置MySQL用戶賬號并授權(quán)。我們也涉及如何撤權(quán)和從授權(quán)表中刪除用戶。

          你可能也想考慮使用mysqlaccess和mysql_setpermission腳本,它是MySQL分發(fā)的一部分,它們是Perl腳本,提供GRANT語句的另一種選擇設(shè)置用戶賬號。mysql_setpermission需要安裝DBI支持。

          1 創(chuàng)建用戶并授權(quán)

            GRANT語句的語法看上去像這樣:GRANT privileges (columns) ON what TO user IDENTIFIED BY "password" WITH GRANT OPTION 
          要使用該語句,你需要填寫下列部分:

          privileges

          授予用戶的權(quán)限,下表列出可用于GRANT語句的權(quán)限指定符:

          權(quán)限指定符 權(quán)限允許的操作
          ALTER 修改表和索引
          CREATE 創(chuàng)建數(shù)據(jù)庫和表
          DELETE 刪除表中已有的記錄
          DROP 拋棄(刪除)數(shù)據(jù)庫和表
          INDEX 創(chuàng)建或拋棄索引
          INSERT 向表中插入新行
          REFERENCE 未用
          SELECT 檢索表中的記錄
          UPDATE 修改現(xiàn)存表記錄
          FILE 讀或?qū)懛?wù)器上的文件
          PROCESS 查看服務(wù)器中執(zhí)行的線程信息或殺死線程
          RELOAD 重載授權(quán)表或清空日志、主機緩存或表緩存。
          SHUTDOWN 關(guān)閉服務(wù)器
          ALL 所有;ALL PRIVILEGES同義詞
          USAGE 特殊的“無權(quán)限”權(quán)限


            上表顯示在第一組的權(quán)限指定符適用于數(shù)據(jù)庫、表和列,第二組數(shù)管理權(quán)限。一般,這些被相對嚴(yán)格地授權(quán),因為它們允許用戶影響服務(wù)器的操作。第三組權(quán)限特殊,ALL意味著“所有權(quán)限”,UASGE意味著無權(quán)限,即創(chuàng)建用戶,但不授予權(quán)限。

          columns

            權(quán)限運用的列,它是可選的,并且你只能設(shè)置列特定的權(quán)限。如果命令有多于一個列,應(yīng)該用逗號分開它們。

          what

          權(quán)限運用的級別。權(quán)限可以是全局的(適用于所有數(shù)據(jù)庫和所有表)、特定數(shù)據(jù)庫(適用于一個數(shù)據(jù)庫中的所有表)或特定表的。可以通過指定一個columns字句是權(quán)限是列特定的。

          user

          權(quán)限授予的用戶,它由一個用戶名和主機名組成。在MySQL中,你不僅指定誰能連接,還有從哪里連接。這允許你讓兩個同名用戶從不同地方連接。MySQL讓你區(qū)分他們,并彼此獨立地賦予權(quán)限。

          MySQL中的一個用戶名就是你連接服務(wù)器時指定的用戶名,該名字不必與你的Unix登錄名或Windows名聯(lián)系起來。缺省地,如果你不明確指定一個 名字,客戶程序?qū)⑹褂媚愕牡卿浢鳛镸ySQL用戶名。這只是一個約定。你可以在授權(quán)表中將該名字改為nobody,然后以nobody連接執(zhí)行需要超級 用戶權(quán)限的操作。

          password

          賦予用戶的口令,它是可選的。如果你對新用戶沒有指定 IDENTIFIED BY子句,該用戶不賦給口令(不安全)。對現(xiàn)有用戶,任何你指定的口令將代替老口令。如果你不指定口令,老口令保持不變,當(dāng)你用IDENTIFIED BY時,口令字符串用改用口令的字面含義,GRANT將為你編碼口令,不要象你用SET PASSWORD 那樣使用password()函數(shù)。

          WITH GRANT OPTION子句是可選的。如果你包含它,用戶可以授予權(quán)限通過GRANT語句授權(quán)給其它用戶。你可以用該子句給與其它用戶授權(quán)的能力。

          用戶名、口令、數(shù)據(jù)庫和表名在授權(quán)表記錄中是大小寫敏感的,主機名和列名不是。
          一般地,你可以通過詢問幾個簡單的問題來識別GRANT語句的種類:

          誰能連接,從那兒連接?
          用戶應(yīng)該有什么級別的權(quán)限,他們適用于什么?
          用戶應(yīng)該允許管理權(quán)限嗎?
          下面就討論一些例子。

          1.1 誰能連接,從那兒連接?


          你可以允許一個用戶從特定的或一系列主機連接。有一個極端,如果你知道降職從一個主機連接,你可以將權(quán)限局限于單個主機

          :GRANT ALL ON samp_db.* TO boris@localhost IDENTIFIED BY "ruby"GRANT ALL ON samp_db.* TO fred@res.mars.com IDENTIFIED BY "quartz"

          (samp_db.*意思是“samp_db數(shù)據(jù)庫的所有表)

          另一個極端是,你可能有一個經(jīng)常旅行并需要能從世界各地的主機連接的用戶max。在這種情況下,你可以允許他無論從哪里連接:

          GRANT ALL ON samp_db.* TO max@% IDENTIFIED BY "diamond"

          “%”字符起通配符作用,與LIKE模式匹配的含義相同。在上述語句中,它意味著“任何主機”。所以max和max@%等價。這是建立用戶最簡單的方法,但也是最不安全的。

          取其中,你可以允許一個用戶從一個受限的主機集合訪問。例如,要允許mary從snake.net域的任何主機連接,用一個%.snake.net主機指定符:

          GRANT ALL ON samp_db.* TO mary@.snake.net IDENTIFIED BY "quartz";

          如果你喜歡,用戶標(biāo)識符的主機部分可以用IP地址而不是一個主機名來給定。你可以指定一個IP地址或一個包含模式字符的地址,而且,從MySQL 3.23,你還可以指定具有指出用于網(wǎng)絡(luò)號的位數(shù)的網(wǎng)絡(luò)掩碼的IP號:

          GRANT ALL ON samp_db.* TO boris@192.168.128.3 IDENTIFIED BY "ruby" GRANT ALL ON samp_db.* TO fred@192.168.128.% IDENTIFIED BY "quartz" GRANT ALL ON samp_db.* TO rex@192.168.128.0/17 IDENTIFIED BY "ruby"

          第一個例子指出用戶能從其連接的特定主機,第二個指定對于C類子網(wǎng)192.168.128的IP模式,而第三條語句中,192.168.128.0/17指定一個17位網(wǎng)絡(luò)號并匹配具有192.168.128頭17位的IP地址。 

          如果MySQL抱怨你指定的用戶值,你可能需要使用引號(只將用戶名和主機名部分分開加引號)。

          GRANT ALL ON samp_db.president TO "my friend"@"boa.snake.net"

          1.2 用戶應(yīng)該有什么級別的權(quán)限和它們應(yīng)該適用于什么?

          你可以授權(quán)不同級別的權(quán)限,全局權(quán)限是最強大的,因為它們適用于任何數(shù)據(jù)庫。要使ethel成為可做任何事情的超級用戶,包括能授權(quán)給其它用戶,發(fā)出下列語句:

          GRANT ALL ON *.* TO ethel@localhost IDENTIFIED BY "coffee" WITH GRANT OPTION

          ON子句中的*.*意味著“所有數(shù)據(jù)庫、所有表”。從安全考慮,我們指定ethel只能從本地連接。限制一個超級用戶可以連接的主機通常是明智的,因為它限制了試圖破解口令的主機。

          有 些權(quán)限(FILE、PROCESS、RELOAD和SHUTDOWN)是管理權(quán)限并且只能用"ON *.*"全局權(quán)限指定符授權(quán)。如果你愿意,你可以授權(quán)這些權(quán)限,而不授權(quán)數(shù)據(jù)庫權(quán)限。例如,下列語句設(shè)置一個flush用戶,他只能發(fā)出flush語句。 這可能在你需要執(zhí)行諸如清空日志等的管理腳本中會有用:

          GRANT RELOAD ON *.* TO flushl@localhost IDENTIFIED BY "flushpass"

          一般地,你想授權(quán)管理權(quán)限,吝嗇點,因為擁有它們的用戶可以影響你的服務(wù)器的操作。
          數(shù)據(jù)庫級權(quán)限適用于一個特定數(shù)據(jù)庫中的所有表,它們可通過使用ON db_name.*子句授予:

          GRANT ALL ON samp_db TO bill@racer.snake.net INDETIFIED BY "rock" GRANT SELECT ON samp_db TO ro_user@% INDETIFIED BY "rock"

          第一條語句向bill授權(quán)samp_db數(shù)據(jù)庫中所有表的權(quán)限,第二條創(chuàng)建一個嚴(yán)格限制訪問的用戶ro_user(只讀用戶),只能訪問samp_db數(shù)據(jù)庫中的所有表,但只有讀取,即用戶只能發(fā)出SELECT語句。

          你可以列出一系列同時授予的各個權(quán)限。例如,如果你想讓用戶能讀取并能修改現(xiàn)有數(shù)據(jù)庫的內(nèi)容,但不能創(chuàng)建新表或刪除表,如下授予這些權(quán)限:

          GRANT SELECT,INSERT,DELETE,UPDATE ON samp_db TO bill@snake.net INDETIFIED BY "rock"

          對于更精致的訪問控制,你可以在各個表上授權(quán),或甚至在表的每個列上。當(dāng)你想向用戶隱藏一個表的部分時,或你想讓一個用戶只能修改特定的列時,列特定權(quán)限非常有用。如:

          GRANT SELECT ON samp_db.member TO bill@localhost INDETIFIED BY "rock"GRANT UPDATE (expiration) ON samp_db. member TO bill@localhost

          第一條語句授予對整個member表的讀權(quán)限并設(shè)置了一個口令,第二條語句增加了UPDATE權(quán)限,當(dāng)只對expiration列。沒必要再指定口令,因為第一條語句已經(jīng)指定了。

          如果你想對多個列授予權(quán)限,指定一個用逗號分開的列表。例如,對assistant用戶增加member表的地址字段的UPDATE權(quán)限,使用如下語句,新權(quán)限將加到用戶已有的權(quán)限中:

          GRANT UPDATE (street,city,state,zip) ON samp_db TO assistant@localhost

          通 常,你不想授予任何比用戶確實需要的權(quán)限寬的權(quán)限。然而,當(dāng)你想讓用戶能創(chuàng)建一個臨時表以保存中間結(jié)果,但你又不想讓他們在一個包含他們不應(yīng)修改內(nèi)容的數(shù) 據(jù)庫中這樣做時,發(fā)生了要授予在一個數(shù)據(jù)庫上的相對寬松的權(quán)限。你可以通過建立一個分開的數(shù)據(jù)庫(如tmp)并授予開數(shù)據(jù)庫上的所有權(quán)限來進行。例如,如 果你想讓來自mars.net域中主機的任何用戶使用tmp數(shù)據(jù)庫,你可以發(fā)出這樣的GRANT語句:

          GRANT ALL ON tmp.* TO ""@mars.net

          在你做完之后,用戶可以創(chuàng)建并用tmp.tbl_name形式引用tmp中的表(在用戶指定符中的""創(chuàng)建一個匿名用戶,任何用戶均匹配空白用戶名)。

          1.3 用戶應(yīng)該被允許管理權(quán)限嗎?

          你 可以允許一個數(shù)據(jù)庫的擁有者通過授予數(shù)據(jù)庫上的所有擁有者權(quán)限來控制數(shù)據(jù)庫的訪問,在授權(quán)時,指定WITH GRANT OPTION。例如:如果你想讓alicia能從big.corp.com域的任何主機連接并具有sales數(shù)據(jù)庫中所有表的管理員權(quán)限,你可以用如下 GRANT語句:

          GRANT ALL ON sales.* TO alicia@%.big.corp.com INDETIFIED BY "applejuice" WITH GRANT OPTION

          在 效果上WITH GRANT OPTION子句允許你把訪問授權(quán)的權(quán)利授予另一個用戶。要注意,擁有GRANT權(quán)限的兩個用戶可以彼此授權(quán)。如果你只給予了第一個用戶SELECT權(quán) 限,而另一個用戶有GRANT加上SELECT權(quán)限,那么第二個用戶可以是第一個用戶更“強大”。

          2 撤權(quán)并刪除用戶

          要取消一個用戶的權(quán)限,使用REVOKE語句。REVOKE的語法非常類似于GRANT語句,除了TO用FROM取代并且沒有INDETIFED BY和WITH GRANT OPTION子句:

          REVOKE privileges (columns) ON what FROM user

          user部分必須匹配原來GRANT語句的你想撤權(quán)的用戶的user部分。privileges部分不需匹配,你可以用GRANT語句授權(quán),然后用REVOKE語句只撤銷部分權(quán)限。

          REVOKE語句只刪除權(quán)限,而不刪除用戶。即使你撤銷了所有權(quán)限,在user表中的用戶記錄依然保留,這意味著用戶仍然可以連接服務(wù)器。要完全刪除一個用戶,你必須用一條DELETE語句明確從user表中刪除用戶記錄:

          %mysql -u root mysqlmysql>DELETE FROM user ->WHERE User="user_name" and Host="host_name";mysql>FLUSH PRIVILEGES; 

          DELETE語句刪除用戶記錄,而FLUSH語句告訴服務(wù)器重載授權(quán)表。(當(dāng)你使用GRANT和REVOKE語句時,表自動重載,而你直接修改授權(quán)表時不是。)

          posted @ 2009-11-14 17:11 BlakeSu 閱讀(160) | 評論 (0)編輯 收藏

          JavaScript的Number對象

          Number對象的屬性
          屬性 說明
          MAX_VALUE 最大有效數(shù)字
          MIN_VALUE 最小有效數(shù)字
          NaN 非數(shù)字
          POSITIVE_INFINITY 正無窮大
          NEGATIVE_INFINITY 負(fù)無窮大
          Number對象的方法
          方法 說明
          toExponential() 轉(zhuǎn)化為科學(xué)計數(shù)法,參數(shù)為小數(shù)點后保留的位數(shù)
          toFixed() 設(shè)定保留的小數(shù)位數(shù),參數(shù)為小數(shù)閏數(shù),為空則無小數(shù)部分,采用四舍五入方法進行
          toLocaleString() 轉(zhuǎn)化為本地表示方法,涉及到小數(shù)點,千分號的表示
          toString() 轉(zhuǎn)化為字符串,參數(shù)為轉(zhuǎn)化時參照的進制,默認(rèn)為十進制
          toPrecision() 設(shè)定數(shù)字的精確度,參數(shù)為精度要求
          valueOf() 返回數(shù)字的數(shù)值(由Number轉(zhuǎn)化為簡單數(shù)值類型)

          posted @ 2009-11-14 14:13 BlakeSu 閱讀(163) | 評論 (0)編輯 收藏

          scrollLeft,scrollWidth,clientWidth,offsetWidth完全詳解

          scrollHeight: 獲取對象的滾動高度。
          scrollLeft:設(shè)置或獲取位于對象左邊界和窗口中目前可見內(nèi)容的最左端之間的距離
          scrollTop:設(shè)置或獲取位于對象最頂端和窗口中可見內(nèi)容的最頂端之間的距離
          scrollWidth:獲取對象的滾動寬度
          offsetHeight:獲取對象相對于版面或由父坐標(biāo) offsetParent 屬性指定的父坐標(biāo)的高度
          offsetLeft:獲取對象相對于版面或由 offsetParent 屬性指定的父坐標(biāo)的計算左側(cè)位置
          offsetTop:獲取對象相對于版面或由 offsetTop 屬性指定的父坐標(biāo)的計算頂端位置
          event.clientX 相對文檔的水平座標(biāo)
          event.clientY 相對文檔的垂直座標(biāo)

          event.offsetX 相對容器的水平坐標(biāo)
          event.offsetY 相對容器的垂直坐標(biāo)
          document.documentElement.scrollTop 垂直方向滾動的值
          event.clientX+document.documentElement.scrollTop 相對文檔的水平座標(biāo)+垂直方向滾動的量

          以上主要指IE之中,F(xiàn)ireFox差異如下:
          IE6.0、FF1.06+:
          clientWidth = width + padding
          clientHeight = height + padding
          offsetWidth = width + padding + border
          offsetHeight = height + padding + border
          IE5.0/5.5:
          clientWidth = width - border
          clientHeight = height - border
          offsetWidth = width
          offsetHeight = height
          (需要提一下:CSS中的margin屬性,與clientWidth、offsetWidth、clientHeight、offsetHeight均無關(guān))

          測試代碼:

           

           

           

          測試代碼:

          <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "[url=http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd]http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd[/url]">
          <html xmlns="[url=http://www.w3.org/1999/xhtml]http://www.w3.org/1999/xhtml[/url]" lang="gb2312">
          <head>
          <head>
          <title> 代碼實例:關(guān)于clientWidth、offsetWidth、clientHeight、offsetHeight的測試比較 </title>
          <meta http-equiv="content-type" content="text/html; charset=gb2312" />
          <meta name="author" content="楓巖,CnLei.y.l@gmail.com">
          <meta name="copyright" content="[url=http://www.cnlei.com]http://www.cnlei.com[/url]" />
          <meta name="description" content="關(guān)于clientWidth、offsetWidth、clientHeight、offsetHeight的測試比較" />
          <style type="text/css" media="all">
          body {font-size:14px;}
          a,a:visited {color:#00f;}
          #Div_CnLei {
          width:300px;
          height:200px;
          padding:10px;
          border:10px solid #ccc;
          background:#eee;
          font-size:12px;
          }
          #Div_CnLei p {margin:0;padding:10px;background:#fff;}
          </style>
          <script type="text/javascript">
          function Obj(s){
          return document.getElementById(s)?document.getElementById(s):s;
          }
          function GetClientWidth(o){
          return Obj(o).clientWidth;
          }
          function GetClientHeight(o){
          return Obj(o).clientHeight;
          }
          function GetOffsetWidth(o){
          return Obj(o).offsetWidth;
          }
          function GetOffsetHeight(o){
          return Obj(o).offsetHeight;
          }
          </script>
          </head>
          <body>
          <p>點擊下面的鏈接:</p>
          <div id="Div_CnLei">
          <p><a href="javascript:alert(GetClientWidth('Div_CnLei'));">GetClientWidth();</a>  <a href="javascript:alert(GetClientHeight('Div_CnLei'));">GetClientHeight();</a></p>
          <p><a href="javascript:alert(GetOffsetWidth('Div_CnLei'));">GetOffsetWidth();</a>  <a href="javascript:alert(GetOffsetHeight('Div_CnLei'));">GetOffsetHeight();</a></p>
          </div>
          <div id="Description">
          <p><strong>IE6.0、FF1.06+:</strong><br />
          clientWidth = width + padding = 300+10×2 = 320<br />
          clientHeight = height + padding = 200+10×2 = 220<br />
          offsetWidth = width + padding + border = 300+10×2+10×2= 340<br />
          offsetHeight = height + padding + border = 200+10×2+10×2 = 240</p>
          <p><strong>IE5.0/5.5:</strong><br />
          clientWidth = width - border = 300-10×2 = 280<br />
          clientHeight = height - border = 200-10×2 = 180<br />
          offsetWidth = width = 300<br />
          offsetHeight = height = 200</p>
          </div>
          </body>
          </html>

          posted @ 2009-11-14 14:12 BlakeSu 閱讀(163) | 評論 (0)編輯 收藏

          firefox event.srcElement

          event.srcElement從字面上可以看出來有以下關(guān)鍵字:事件,源 他的意思就是:當(dāng)前事件的源,

          我們可以調(diào)用他的各種屬性 就像:document.getElementById(”")這樣的功能,

          經(jīng)常有人問 firefox 下的 event.srcElement 怎么用,在此詳細(xì)說明:

          IE下,event對象有srcElement屬性,但是沒有target屬性;Firefox下,event對象有target屬性,但是沒有srcElement屬性.但他們的作用是相當(dāng)?shù)模矗?/p>

          firefox 下的 event.target = IE 下的 event.srcElement

          解決方法:使用obj(obj = event.srcElement ? event.srcElement : event.target;)來代替IE下的event.srcElement或者Firefox下的event.target.

          posted @ 2009-11-14 14:11 BlakeSu 閱讀(543) | 評論 (0)編輯 收藏

          僅列出標(biāo)題
          共12頁: First 上一頁 3 4 5 6 7 8 9 10 11 下一頁 Last 
          主站蜘蛛池模板: 即墨市| 平山县| 镇沅| 聂荣县| 涡阳县| 临江市| 临高县| 铜陵市| 长沙市| 博湖县| 阿拉善左旗| 兴义市| 五华县| 酉阳| 吉安县| 临潭县| 满洲里市| 舒城县| 鄯善县| 紫云| 太原市| 凌海市| 阿坝| 普定县| 铜陵市| 西乡县| 桃园县| 琼海市| 迁西县| 黔南| 政和县| 吉木乃县| 博湖县| 英山县| 河曲县| 上高县| 德令哈市| 永嘉县| 拉萨市| 密云县| 巩义市|