24 Eylül 2019 Salı

Linux Loader

Giriş
Bazı notlarım şöyle

1. Loader Nedir?
Açıklaması şöyle.
The shell invokes the loader function, which copies the code and data in the executable file a.out into memory, and then transfers control to the beginning of the program. The loader is a program called execve, which loads the code and data of the executable object file into memory and then runs the program by jumping to the first instruction.
2. Loader Tarafından Kullanılan Path
Loader'ın yükleyeceği path'ler şurada dizinde tanımlı ve sıraları önemli.
/etc/ld.so.conf.d/
Bu dosyalarda değişiklik yaparsak şu komutu çalıştırmak gerekli.
ldconfig
3. Loader Nerede?
Loader şudur.
/lib64/ld-linux-x86-64.so.2
Örnek
Şöyle yaparız
$ ldd /lib64/ld-linux-x86-64.so.2
        statically linked
Örnek
ld-linux.so.2 aslında bir loader. Centos 6'da uygulamadan çıkmak yeterli değil. Bir sebepten ld-linux.so.2 loader'ını da kill etmek gerekir.

Örnek
Loader ile bir uygulama çalıştırmak için şöyle yaparız.
# /lib64/ld-linux-x86-64.so.2 ./chmod
chmod: missing operand
4. loader ve malloc
loader libc.so dosyasını yüklemeden kendi içindeki malloc metodunu kullanır. Açıklaması şöyle.
Technically the dynamic linker doesn’t need object resolution and relocation for itself, since it’s fully resolved as-is, but it does define symbols and it has to take care of those when resolving the binary it’s “interpreting”, and those symbols are updated to point to their implementations in the loaded libraries. In particular, this affects malloc — the linker has a minimal version built-in, with the corresponding symbol, but that’s replaced by the C library’s version once it’s loaded and relocated (or even by an interposed version if there is one), with some care taken to ensure this doesn’t happen at a point where it might break the linker.
Örnek
Bir projede Centos 7 ile derlenmiş binary dosyayı Centos 6 üzerinde çalıştırmak gerekti.
Nasıl yapacağımı buradan okudum.

Şöyle yaptık.

1. ldd komutu ile binary dosyanın bağımlı olduğu tüm .so dosyalarını buldum. Bağımlılıklar arasında ld-linux.so.2 dosyası da vardı.
2. Bu dosyaları ve binary dosyayı Centos 6'da açtığım bir dizine kopyaladım.
3. env PRE_LOAD= ... ld-linux.so myprogram şeklinde çalıştırdım


journalctl komutu - systemd Servislerinin Tüm Loglarını Toplar

Giriş
systemd servislerinin tüm loglarını journald servisi merkezi olarak toplar. Ancak journald logları binary formatta saklar. 

journalctl komutuyla binary formattaki loglar incelenebilir. journalctl komutu less uygulamasını kullanarak logları gösterir. Açıklaması şöyle.
The output is paged through less by default, and long lines are "truncated" to screen width. The hidden part can be viewed by using the left-arrow and right-arrow keys. Pagingcan be disabled; see the --no-pager option and the "Environment" section below.
Bu komut /var/log dizinindeki dosyaları taramaktan daha kolay olabilir.

SYSTEMD_COLORS Ortam Değişkeni
Örnek
Şöyle yaparız
alias journalctl='SYSTEMD_COLORS=false journalctl'journalctl
-b seçeneği
boot zamanında beri anlamına gelir.
Örnek
Şöyle yaparız
journalctl -fxb --no-hostname --no-full
Açıklaması şöyle
Here's how you can get the full system journal. I use this command for my updated system logs (f = follow, x = Add message explanations where available, b = since boot):
-f seçeneği
follow anlamına gelir
Örnek
Şöyle yaparız
journalctl -f
-l seçeneği
Tüm logları izlemek istersek şöyle yaparız
journalctl -lf
-p seçeneği - priority
Şöyle yaparız.
$ journalctl -p err -b
-- Logs begin at sön 2019-09-22 20:17:42 CEST, end at sön 2019-09-22 20:20:01 CE
sep 22 20:17:51 server iscsid[1289]: iSCSI daemon with pid=1290 started!
lines 1-2/2 (END)
-u seçeneği
unit/service name anlamına gelir
Örnek
vmware loglarını görmek için şöyle yaparız
journalctl -f -u vmware.service
Örnek
ssh loglarını görmek için şöyle yaparız
journalctl -u sshd -n 100







22 Eylül 2019 Pazar

Windows del komutu

/s seçeneği
subfolder'ları da dolaş anlamına gelir. Şöyle yaparız
del /f /q /s *.*           (del in current folder, and `/s` to traverse sub-folders)

ping komutu

Giriş
ping paketlerine Linux çekirdeği cevap verir bu iş için çalışan ayrı bir uygulama yoktur.

Komut Seçenekleri
ping komut en yalın haliyle şöyledir.
ping hostname
Eğer hostname yerine
ping http://www.example.com/
komut çalışmaz. Çünkü http bir URL'dir makine ismi değildir.

Shell İle Kullanmak
Örnek
Şöyle yaparız
if ping -c 1 -W 1 "docker.io"; then
  kubectl apply -f operator_online.yaml -n vitess-operator
else
  kubectl apply -f operator_offline.yaml -n vitess-operator
fi
Örnek
ping'i if ile kullanmak için şöyle yaparız.
if ping -i 1 -c 1 -W 1 website.com >/dev/null 2>&1
then
  sleep 1
else
  mutt -s "Website Down!" bruno.bvaraujo@gmail.com < wsdown.txt
  sleep 10

-4 seçeneği
Sadece IPv4 ile ping'ler
Örnek
Şöyle yaparız
ping -4 raspberrypi.local
-c seçeneği
count anlamına gelir. Kaç tane ping paketi gönderileceğini belirtir. Şöyle yaparız.
# ping -c 3 localhost
PING localhost(localhost (::1)) 56 data bytes
64 bytes from localhost (::1): icmp_seq=1 ttl=64 time=0.029 ms
64 bytes from localhost (::1): icmp_seq=2 ttl=64 time=0.035 ms
64 bytes from localhost (::1): icmp_seq=3 ttl=64 time=0.101 ms

--- localhost ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2042ms
rtt min/avg/max/mdev = 0.047/0.072/0.101/0.022 ms
-f seçeneği
fast anlamına gelir. Ping'e cevap beklemez. Bu seçeneğe Flood ping de denilmiş. Böylece bir çok makineyi arka arkaya pingleyebiliriz. Şöyle yaparız.
ping -I eth0 -c 1000000 -l 1000000 -f -i 1 -b 255.255.255.255
-I seçeneği
Interface anlamına gelir.

-i seçeneği
interval anlamına gelir. Şöyle yaparız. Root kullanıcı çok daha kısa bir aralık verebilir.
ping -i 0.2 server.com
-l seçeneği - Paket Büyüklüğü
length anlamına gelir. Normal ping paket 32 byte uzunluğundadır. Ping ile büyük paketler göndererek ağın paketi bölmeden geçirebildiği sınanabilir. Eğer paket bölünmeden gönderilemiyorsa "Packet needs to be fragmented but DF set" hata mesajı alınır.

Şöyle yaparız
ping -f -l 1024 <IP Adddress>
-W seçeneği
Wait anlamına gelir. Belirtilen süre kadar bekler. Şöyle yaparız.
$ ping -c 1 -W 1 192.168.3.1
PING 192.168.3.1 (192.168.3.1) 56(84) bytes of data.
64 bytes from 192.168.3.1: icmp_seq=1 ttl=64 time=0.351 ms
Network Delay veya Network Latency
Açıklaması şöyle.
Network latency is how long it takes for something sent from a source host to reach a destination host. There are many components to latency, and the latency can actually be different A to B and B to A.
Gidiş Geliş Gecikmesi - Round Trip Time
Açıklaması şöyle.
The round trip time is how long it takes for a request sent from a source to a destination, and for the response to get back to the original source. Basically, the latency in each direction, plus the processing time.
Ping paketinin hedefe gidip geri gelmesi için geçen süredir. Gidiş Geliş Gecikmesi genellikle 2 x Network Delay olarak karşımıza çıkar.

RTT değerinin yüksek olması ağdaki gecikmeye işaret eder deniliyor ancak bence ping sadece bağlantı kontrolü için kullanılmalı. Yüksek RTT QoS politikasından etkilnebilir. Açıklaması şöyle
Your ping latency may not have anything at all to do with how another application performs. ICMP is usually relegated to the lowest priority, and it can end up sitting in queues while other, real traffic is sent through. Some ISPs will route it in a different path than your other traffic, sending it the long way around, or through secondary connections.
RTT hesaplanırken tek bir paketin tüm rakamları değiştirmemesi için bir çeşit Moving Average hesaplaması kullanılıyor.

Paket Kaybı
Paket kaybının yüksek olması ağdaki bir sıkıntıya işaret eder.

15 Eylül 2019 Pazar

strace komutu

Giriş
Açıklaması şöyle.
strace is a diagnostic, debugging and instructional userspace utility for Linux. It is used to monitor and tamper with interactions between processes and the Linux kernel, which include system calls, signal deliveries, and changes of process state.
Açıklaması şöyle.
strace only shows when the process enters (and then leaves) the kernel due to a system call. Or when a unix signal is delivered. However there are other types of interrupts which strace does not show at all. So these include

- Page faults.
- The timer interrupt. This is used to switch to a different process, when the current one has exhausted its allocated time slice on the CPU.
-c seçeneği
Açıklaması şöyle.
-c
Count time, calls, and errors for each system call and report a summary on program exit. On Linux, this attempts to show system time (CPU time spent running in the kernel) independent of wall clock time. If -c is used with -f or -F (below), only aggregate totals for all traced processes are kept.
Örnek
Şöyle yaparız.
strace -c -p 3569 # 3569 is PID
strace: Process 3569 attached
^Cstrace: Process 3569 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
99.73    0.016000           8      1971           poll
0.16    0.000025           0       509        75 futex
0.06    0.000010           0      1985      1966 recvmsg
0.06    0.000009           0      2336           mprotect
0.00    0.000000           0       478           read
0.00    0.000000           0        13           write
0.00    0.000000           0        29           mmap
0.00    0.000000           0         9           munmap
0.00    0.000000           0        18           writev
0.00    0.000000           0       351           madvise
0.00    0.000000           0         1           restart_syscall
------ ----------- ----------- --------- --------- ----------------
100.00    0.016044                  7700      2041 total
-e seçeneği
Beliritlen sistem çağrısısını gösterir. 
Örnek
futex sistem çağrısı için şöyle yaparız
$ strace -e futex ./sleepgranularity 
futex(0x7fff800b3ad8, FUTEX_WAIT_PRIVATE, 0, {tv_sec=0, tv_nsec=4084}) = -1 ETIMEDOUT
(Connection timed out)
Örnek
open sistem çağrısı için şöyle yaparız.
strace -eopen someprogram
Örnek
open,read,write sistem çağrıları için şöyle yaparız.
some_command | strace -o less.trace -e open,read,write less
Örnek
openat,write,fork,vfork,clone,execve sistem çağrıları için şöyle yaparız
$ strace -e trace=openat,read,write,fork,vfork,clone,execve -p 2883 2> bash.strace
Çıktı olarak şunu alırız.
strace: Process 2883 attached
read(0, "l", 1)                         = 1
write(2, "l", 1)                        = 1
read(0, "s", 1)                         = 1
write(2, "s", 1)                        = 1
read(0, "\r", 1)                        = 1
write(2, "\n", 1)                       = 1
Örnek - delay
Şöyle yaparız
$ strace -e inject=unlink,unlinkat,rmdir:delay_enter=5s 
         -e unlink,unlinkat,rmdir 
          rm -rf /tmp/tmp.HudBncQ4Ni
unlinkat(4, "test", 0^Z
zsh: suspended  strace -e inject=unlink,unlinkat,rmdir:delay_enter=10s -e  rm -rf
Örnek - signal göndermek
Şöyle yaparız
strace -e inject=unlink,unlinkat,rmdir:signal=STOP
Örnek - sonuç dönmek
Şöyle yaparız
strace -e inject=unlink,unlinkat,rmdir:retval=0 -e unlink,unlinkat,rmdir ...

veya

zmodload zsh/system
strace -e inject=unlink,unlinkat,rmdir:error=EACCES -e unlink,unlinkat,rmdir ...

-ff
-ff seçeneği
-o ile kullanılırsa dosya ismi şu formatta olur.
uygulama.pid
-o seçeneği
Çıktıyı dosyaya kaydetmek için kullanılır.
Örnek
Şöyle yaparız.
strace -ff -o TRACE java MyApp
-ttt seçeneği
Timestamp'i mikrosaniye olarak gösterir. Şöyle yaparız.
strace -ttt -T -C -w foo
-T seçeneği
Sistem çağrısı içinde harcanan süreyi gösterir. Açıklaması şöyle.
time is shown in seconds, with microseconds (calculated from the nanosecond value) after the decimal point.
Örnek
Şöyle yaparız.
strace -T  sleep 2
Çıktı olarak şunu alırız.
nanosleep({tv_sec=2, tv_nsec=0}, NULL)  = 0 <2.000230>