Category: Linux

Deleting tons of files in Linux (Argument list too long)

Quick Linux Tip:

If you’re trying to delete a very large number of files at one time (I deleted a directory with 485,000+ today), you will probably run into this error:

/bin/rm: Argument list too long.

The problem is that when you type something like “rm -rf *”, the “*” is replaced with a list of every matching file, like “rm -rf file1 file2 file3 file4″ and so on. There is a reletively small buffer of memory allocated to storing this list of arguments and if it is filled up, the shell will not execute the program.

To get around this problem, a lot of people will use the find command to find every file and pass them one-by-one to the “rm” command like this:

find . -type f -exec rm -v {} \;

My problem is that I needed to delete 500,000 files and it was taking way too long.

I stumbled upon a much faster way of deleting files – the “find” command has a “-delete” flag built right in! Here’s what I ended up using:

find . -type f -delete

Using this method, I was deleting files at a rate of about 2000 files/second – much faster!

You can also show the filenames as you’re deleting them:

find . -type f -print -delete

…or even show how many files will be deleted, then time how long it takes to delete them:

root@devel# ls -1 | wc -l && time find . -type f -delete
100000
real    0m3.660s
user    0m0.036s
sys     0m0.552s
Advertisements

MySQL 5.7 Multi-Source Replication – Automatically Combining Data From Multiple Databases Into One

MySQL’s multi-source replication allows you to replicate data from multiple databases into one database in parallel (at the same time). This post will explain and show you how to set up multi-source replication. (WARNING: This is a very long and detailed post. You might want to grab a sandwich and a drink. Continue reading

ZFS Pool Related Commands

# zpool create datapool c0t0d0 Create a basic pool named datapool
# zpool create -f datapool c0t0d0 Force the creation of a pool
# zpool create -m /data datapool c0t0d0 Create a pool with a different mount point than the default.
# zpool create datapool raidz c3t0d0 c3t1d0 c3t2d0 Create RAID-Z vdev pool
# zpool add datapool raidz c4t0d0 c4t1d0 c4t2d0 Add RAID-Z vdev to pool datapool
# zpool create datapool raidz1 c0t0d0 c0t1d0 c0t2d0 c0t3d0 c0t4d0 c0t5d0 Create RAID-Z1 pool
# zpool create datapool raidz2 c0t0d0 c0t1d0 c0t2d0 c0t3d0 c0t4d0 c0t5d0 Create RAID-Z2 pool
# zpool create datapool mirror c0t0d0 c0t5d0 Mirror c0t0d0 to c0t5d0
# zpool create datapool mirror c0t0d0 c0t5d0 mirror c0t2d0 c0t4d0 disk c0t0d0 is mirrored with c0t5d0 and disk c0t2d0 is mirrored withc0t4d0
# zpool add datapool mirror c3t0d0 c3t1d0 Add new mirrored vdev to datapool
# zpool add datapool spare c1t3d0 Add spare device c1t3d0 to the datapool
## zpool create -n geekpool c1t3d0 Do a dry run on pool creation

Show Pool Information

# zpool status -x Show pool status
# zpool status -v datapool Show individual pool status in verbose mode
# zpool list Show all the pools
# zpool list -o name,size Show particular properties of all the pools (here, name and size)
# zpool list -Ho name Show all pools without headers and columns

File-system/Volume related commands

# zfs create datapool/fs1 Create file-system fs1 under datapool
# zfs create -V 1gb datapool/vol01 Create 1 GB volume (Block device) in datapool
# zfs destroy -r datapool destroy datapool and all datasets under it.
# zfs destroy -fr datapool/data destroy file-system or volume (data) and all related snapshots

Set ZFS file system properties

# zfs set quota=1G datapool/fs1 Set quota of 1 GB on filesystem fs1
# zfs set reservation=1G datapool/fs1 Set Reservation of 1 GB on filesystem fs1
# zfs set mountpoint=legacy datapool/fs1 Disable ZFS auto mounting and enable mounting through /etc/vfstab.
# zfs set sharenfs=on datapool/fs1 Share fs1 as NFS
# zfs set compression=on datapool/fs1 Enable compression on fs1

File-system/Volume related commands

# zfs create datapool/fs1 Create file-system fs1 under datapool
# zfs create -V 1gb datapool/vol01 Create 1 GB volume (Block device) in datapool
# zfs destroy -r datapool destroy datapool and all datasets under it.
# zfs destroy -fr datapool/data destroy file-system or volume (data) and all related snapshots

Show file system info

# zfs list List all ZFS file system
# zfs get all datapool” List all properties of a ZFS file system

Mount/Umount Related Commands

# zfs set mountpoint=/data datapool/fs1 Set the mount-point of file system fs1 to /data
# zfs mount datapool/fs1 Mount fs1 file system
# zfs umount datapool/fs1 Umount ZFS file system fs1
# zfs mount -a Mount all ZFS file systems
# zfs umount -a Umount all ZFS file systems

ZFS I/O performance

# zpool iostat 2 Display ZFS I/O Statistics every 2 seconds
# zpool iostat -v 2 Display detailed ZFS I/O statistics every 2 seconds

ZFS maintenance commands

# zpool scrub datapool Run scrub on all file systems under data pool
# zpool offline -t datapool c0t0d0 Temporarily offline a disk (until next reboot)
# zpool online Online a disk to clear error count
# zpool clear Clear error count without a need to the disk

Import/Export Commands

# zpool import List pools available for import
# zpool import -a Imports all pools found in the search directories
# zpool import -d To search for pools with block devices not located in /dev/dsk
# zpool import -d /zfs datapool Search for a pool with block devices created in /zfs
# zpool import oldpool newpool Import a pool originally named oldpool under new name newpool
# zpool import 3987837483 Import pool using pool ID
# zpool export datapool Deport a ZFS pool named mypool
# zpool export -f datapool Force the unmount and deport of a ZFS pool

Snapshot Commands

# zfs snapshot datapool/fs1@12jan2014 Create a snapshot named 12jan2014 of the fs1 filesystem
# zfs list -t snapshot List snapshots
# zfs rollback -r datapool/fs1@10jan2014 Roll back to 10jan2014 (recursively destroy intermediate snapshots)
# zfs rollback -rf datapool/fs1@10jan2014 Roll back must and force unmount and remount
# zfs destroy datapool/fs1@10jan2014 Destroy snapshot created earlier
# zfs send datapool/fs1@oct2013 &gt /geekpool/fs1/oct2013.bak Take a backup of ZFS snapshot locally
# zfs receive anotherpool/fs1 &lt /geekpool/fs1/oct2013.bak Restore from the snapshot backup backup taken
# zfs send datapool/fs1@oct2013 | zfs receive anotherpool/fs1 Combine the send and receive operation
# zfs send datapool/fs1@oct2013 | ssh node02 “zfs receive testpool/testfs” Send the snapshot to a remote system node02

Clone Commands

# zfs clone datapool/fs1@10jan2014 /clones/fs1 Clone an existing snapshot
# zfs destroy datapool/fs1@10jan2014 Destroy clone

So sánh và kiểm tra trong Bash shell

Luồng điều khiển trong chương trình được xử lý bởi các mệnh đề so sánh và kiểm tra. Bash cung cấp cho chúng ta vài tùy chọn để thực hiện việc so sánh và kiểm tra này. Chúng ta có thể ifif else, và các phép toán luận lý để thực hiện các phép kiểm tra và các phép toán so sánh nhất định để so sánh các đối tượng dữ liệu. Trong bài viết này, chúng ta sẽ tìm hiểu cách so sánh và kiểm tra trong Bash shell.

1. Kiểm tra trong Bash shell

Việc kiểm tra trong Bash shell được thực hiện bằng cấu trúc

[ condition ]

Cấu trúc trên sẽ trả về 1 trong 2 kết quả:

  • True => nếu condition đúng
  • False => nếu condition sai

2. if, if-else

if và if-else là các cấu trúc điều khiển luồng làm việc của chương trình, chúng thường được gọi là các cấu trúc điều kiện, tức là ứng với từng điều kiện thì chúng ta sẽ thực thi khối chương trình tương ứng cho điều kiện đó, trong trường hợp này chúng ta có 2 điều kiện là đúng (TRUE) và sai (FALSE). Cấu trúc if và if – else

if condition;
then
    commands;
fi

Nếu condition đúng thì thực hiện commands.

if condition;
then
    commands_01;
else
    commands_02;
fi

Nếu condition đúng thì thực hiện commands_01, ngược lại, nếu condition sai thì thực hiện commands_02. Chúng ta có thể sử dụng 2 cấu trúc if và if else lồng vào nhau như sau:

if condition;
then
    commands;
else if condition;
then
    commands;
else
    commands;
fi

Trong thực tế chúng ta thường kết hợp 2 cấu trúc kiểm tra và điều kiện vào nhau để thực hiện việc kiểm tra và thực thi luồng xử lý như sau:

if [ condition ];
then
    commands;
fi

if [ condition ];
then
    commands;
else
    commands;
fi

Hoặc chúng ta có thể viết ở dạng ngắn gọn như sau:

  • [ condition ] && action => thực hiện nếu điều kiện condition là đúng (TRUE).
  • [ condition ] || action => thực hiện nếu điều kiện condition là sai (FALSE).

Với && là phép toán luận lý AND và || là phép toán luận lý OR.

3. So sánh số học

Sử dụng các phép toán so sánh số học dưới đây bên trong cấu trúc kiểm tra [] ở phần 1.

  • -eq => Bằng nhau (Equal)
  • -ne => Không bằng nhau (Not equal)
  • -lt => Nhỏ hơn (Less than)
  • -gt => Lớn hơn (Greater than)
  • -le => Nhỏ hơn hoặc bằng (Less or equal)
  • -ge => Lớn hơn hoặc bằng (Greater or equal)

vd:

var=10
[ $var -eq 0 ] => FALSE

4. So sánh chuỗi

Sử dụng các cấu trúc sau để thực hiện việc so sánh chuỗi trong Bash shell

  • [[ $str1 = $str2 ]] hoặc [[ $str1 == $str2 ]]

Trả về TRUE nếu 2 biến str1 và str2 có nội dung giống nhau. FALSE nếu ngược lại.

  • [[ $str1 != $str2 ]]

Trả về TRUE nếu 2 biến str1 và str2 có nội dung giống nhau. FALSE nếu ngược lại.

  • [[ $str1 > $str2 ]]

Trả về TRUE nếu srt1 lớn hơn str2 tính theo bảng chữ cái. FALSE nếu ngược lại.

vd:

str1="HELLO"
str2="Hello"
[[ $str1 > $str2 ]] =>TRUE
  • [[ $str1 < $str2 ]]

Trả về TRUE nếu srt1 nhỏ hơn str2 tính theo bảng chữ cái. FALSE nếu ngược lại.

  • [[ -z $str1 ]]

Trả về TRUE nếu $str1 là 1 chuỗi rỗng. FALSE nếu ngược lại

  • [[ -n $str1 ]]

Trả về TRUE nếu $str1 là 1 chuỗi khác rỗng. FALSE nếu ngược lại.

Lưu ý:

  • Khi sử dụng dấu =, nếu trước và sau nó không có khoảng trắng thì khai báo đó sẽ được hiểu là phép gán.

vd:

var=”value”

  • Ngược lại, nếu trước và sau dấu = có khoảng trắng, thì khai báo đó được hiểu là phép so sánh

vd:

$var = “value”

5. Kiểm tra hệ thống tập tin

Sử dụng các phép toán kiểm tra hệ thống tập tin dưới đây bên trong cấu trúc kiểm tra [] ở phần 1.

  • [ -f $file_var]

Trả về TRUE nếu file_var là 1 tập tin.

  • [ -x $var ]

Trả về TRUE nếu var là tập tin và có quyền thực thi (executable)

  • [ -d $var ]

Trả về TRUE nếu var là 1 thư mục.

  • [ -e $var ]

Trả về TRUE nếu var tồn tại

  • [ -w $var ]

Trả về TRUE nếu var là 1 tập tin và có quyền ghi (writable)

  • [ -r $var ]

Trả về TRUE nếu var là 1 tập tin và có quyền đọc (readable)

  • [ -L $var ]

Trả về TRUE nếu var là 1 liên kết mềm (symlink)

vd:

fpath="/etc/passwd"
if [ -e $fpath ]; then
    echo File exists;
else
    echo Does not exist;
fi

6. Kết hợp nhiều phép kiểm tra với nhau

Chúng ta có thể kết hợp nhiều điều kiện kiểm tra với nhau bằng việc sử dụng các toán tử luận lý gồm:

  • AND hoặc &&  => Trả về TRUE  khi tất cả các điều kiện đều thỏa

vd:

str1="Not empty "
str2=""
if [[ -n $str1 ]] && [[ -z $str2 ]];
then
    echo TRUE
fi

 

  • OR hoặc || => Trả về TRUE khi 1 trong các điều kiện thỏa

vd:

str1="Not empty "
if [[ -n $str1 ]] || [[ -z $str1 ]];
then
    echo TRUE
fi

Chúng ta hoàn thành bài tìm hiểu về các so sánh và kiểm tra trong Bash shell tại đây. Chúc các bạn thành công!

So sánh các giao thức VPN: PPTP vs. L2TP vs. OpenVPN vs. SSTP vs. IKEv2

Các kỹ thuật mã hóa VPN được phát triển và chứng nhận bởi National Institute of Standards and Technology, tuy nhiên với vụ Edward Snowden tiết lộ về các bị mật mà NSA đang cố gắng bẽ khóa công nghệ này là một thông tin gây sốc. Điều này đặt dấu chấm hỏi liệu   “các công nghệ VPN này có thực sự bảo mật”? Và để trả lời cầu hỏi này, chúng tối nhận thấy đây là thời điểm để viết về chủ đề này.

Continue reading