Sistem Operasi: Konsep & Membuat , OpenWRT dan ROM Android

Onno W. Purbo

OnnoCenter

2017 DAFTAR ISI DEDIKASI...... 9 KATA PENGANTAR...... 10 BAB 1: PENDAHULUAN...... 11 Overview Buku...... 11 Sistem Operasi...... 12 Tipe Sistem Operasi...... 12 Real-time...... 12 Multi-user...... 12 Multi-tasking vs. single-tasking...... 12 Sistem Terdistribusi...... 13 Sistem Embedded...... 13 Sejarah...... 13 Mainframe...... 13 Microcomputer...... 15 Contoh Sistem Operasi...... 16 Sistem Operasi dan UNIX-like...... 16 BSD dan turunannya...... 16 OS X...... 17 Linux and GNU...... 17 Google Chromium OS...... 18 Microsoft Windows...... 18 Lainnya...... 19 Komponen Sistem Operasi...... 19 Kernel...... 19 Eksekusi Program...... 19 Interupsi...... 19 Mode...... 20 Manajemen Memory...... 21 Memory Virtual...... 21 Multitasking...... 22 Akses Disk dan file system...... 23 Device driver...... 24 Networking...... 25 Security...... 25 User interface...... 27 Real-time ...... 29 Pengembangan Sistem Operasi sebagai Hobby...... 29 Keanekaragaman Sistem Operasi dan portabilitas...... 29 Referensi...... 30 BAB 2: LINUX: INSTALASI, CLI & REPOSITORY...... 31 Instalasi Linux...... 31 Skema Partisi untuk Sistem Operasi Linux...... 31 Apakah Partisi?...... 31 Mount point di Linux...... 32 Pengenalan Partisi di Linux...... 32 Skema Partisi Linux Yang Perlu Kita Gunakan?...... 33 Panduan Secara Umum...... 33 Skema Minimal...... 33 Skema Standard...... 34 Skema Tukang Ngoprek...... 34 Instalasi Sistem Operasi...... 34 Download file iso...... 34 Membuat LiveCD...... 34 Membuat LiveUSB...... 34 Menggunakan CD / DVD?...... 35 Menggunakan USB Drive?...... 35 Persiapan Instalasi Ubuntu...... 35 Set up wireless...... 36 Alokasi disk...... 37 Mulai Instalasi...... 37 Pilih Lokasi...... 38 Pilih Layout Keyboard...... 38 Masukan login dan password...... 39 Selesai Instalasi Ubuntu...... 39 Beberapa Perintah Command Line (CLI) untuk Survival...... 40 super user...... 40 Perintah di file sistem...... 40 Perintah untuk bekerja dengan repository...... 40 Beberapa folder / file penting...... 40 Mempelajari CLI...... 40 Membuat Repository Ubuntu Lokal menggunakan debmirror...... 41 Beberapa Persiapan Yang Perlu Dilakukan...... 41 Langkah Mendownload Repostory Menggunakan debmirror...... 41 Referensi...... 44 BAB 3: SHELL SCRIPTING...... 45 Apa itu shell?...... 45 Macam-macam shell...... 45 Pemrograman Shell...... 45 Pengetahuan Dasar untuk Shell Scripting...... 46 Simple Bash Script...... 47 Contoh Shell Script Sederhana...... 47 Pemakaian Variabel...... 49 Environment Variable...... 49 Positional Parameter...... 50 User Defined Variable...... 50 Simple I/O...... 52 Output dengan printf...... 53 Input dengan read...... 53 Seleksi dan Perulangan...... 54 test dan operator...... 54 Operator untuk integer...... 55 Operasi string...... 55 Operator file...... 55 Operator logika...... 55 Seleksi...... 56 if...... 56 statement builtin case...... 57 Perulangan...... 58 statement for...... 58 statement while...... 59 statement until...... 60 statement select...... 60 Array...... 61 Subrutin atau Fungsi...... 62 Mengirim argumen sebagai parameter ke fungsi...... 64 Cakupan Variabel...... 64 Cron...... 65 Tabel cron...... 65 operator / sintaks cron...... 66 Menjalankan Cron...... 67 Contoh Script...... 67 Referensi...... 67 BAB 4: KERNEL...... 68 Beberapa desain Kernel...... 68 Kernel monolitik...... 69 Mikrokernel...... 70 Kernel hibrida...... 71 Exokernel...... 71 Tour de ...... 72 Booting System...... 72 Perputaran Roda Sistem Operasi...... 73 Bagaimana Kernel Melihat Proses...... 74 Pembuatan dan Penghancuran proses...... 75 Menjalankan Program...... 75 Akses ke File System...... 76 Anatomi dari Tipe File System...... 77 console driver...... 78 Write ke console...... 79 Read console...... 79 Manajemen Keyboard...... 79 Switching current console...... 80 Mekanisme seleksi (selection)...... 80 ioctl() dari device...... 80 Referensi...... 81 BAB 5: COMPILE KERNEL...... 82 Dimana memperoleh source code kernel?...... 82 Dimana sebuah source code berada?...... 82 Makefile...... 82 Documentation/...... 82 arch/...... 83 crypto/...... 83 drivers/...... 83 fs/...... 83 include/...... 83 init/...... 83 ipc/...... 83 kernel/...... 83 lib/...... 84 mm/...... 84 net/...... 84 scripts/...... 84 security/...... 84 sound/...... 84 usr/...... 84 Bagaimana semua ini menjadi satu?...... 84 Mencari berbagai hal di kernel source tree...... 85 Konfigurasi Kernel...... 86 Konfigurasi Kernel Dengan Mengedit .config...... 87 Hasil Konfigurasi...... 87 Tip untuk konfigurasi kernel...... 88 Compile Kernel...... 89 Referensi...... 91 BAB 6: REMASTER LINUX...... 92 Remaster Ubuntu Linux Menggunakan UCK...... 92 Aplikasi Untuk Pendidikan...... 93 Aplikasi untuk Usaha / Bisnis...... 94 Referensi...... 96 BAB 7: OPENWRT SISTEM OPERASI UNTUK ROUTER...... 97 Download Firmware OpenWRT yang sudah jadi...... 97 Beberapa Tip untuk Membuat / Build Firmware OpenWRT...... 97 Build Firmware OpenWRT untuk Buffalo WZRHPG300NH2...... 100 Build Firmware OpenWRT untuk Linksys WRT160NL...... 104 Build Firmware OpenWRT untuk Ubiquiti NanoStation2...... 105 Flash Firmware OpenWRT ke Buffalo WZRHP300NH2...... 106 Flash Firmware OpenWRT ke Linksys WRT160NL...... 108 Flash Firmware OpenWRT ke Ubiquity...... 110 Referensi...... 110 BAB 8: TUNING TASK SCHEDULER SISTEM OPERASI...... 111 Mengapa tune kernel?...... 111 Kernel Tuning Secara Praktis Menggunakan sysctl...... 111 sysctl dan directory /proc...... 112 Konfigurasi sysctl.conf...... 113 Gambaran Teori Tuning Kernel Scheduler...... 113 Tujuan Scheduling...... 113 Preemption...... 113 Timeslice...... 113 Prioritas Process...... 114 Tuning Scheduler...... 114 Beberapa Definisi dan Klasifikasi Process...... 115 I/O-bound...... 116 processor-bound...... 116 Proses Interaktif...... 116 Proses Batch...... 116 Proses Real-Time...... 116 Tuning Scheduler Performance...... 116 O(1) Scheduler...... 117 Completely Fair Scheduler (CFQ)...... 117 Bagaimana Completely Fair Scheduler (CFS) Bekerja...... 118 Grouping Proses...... 118 Linux Scheduler Yang akan Datang...... 118 Berbagai Istilah Dalam Kernel Scheduling...... 118 Latency...... 119 Granularity...... 119 Scheduling Policies...... 119 Mengubah Atribut Secara Real-time dari proses dengan chrt...... 119 Lebih Dalam Tuning Runtime Menggunakan sysctl...... 121 Interface Debugging dan Statistik Scheduler...... 123 /proc/sched_debug...... 123 /proc/schedstat...... 125 Referensi...... 126 BAB 9: TUNING I/O SCHEDULER...... 127 Switching I/O Scheduling...... 127 I/O Elevator Yang Tersedia...... 127 CFQ (Completely Fair Queuing)...... 128 NOOP...... 128 DEADLINE...... 129 I/O Barrier Tuning...... 129 Referensi...... 130 BAB 10: TUNING MANAJEMEN MEMORY...... 131 Penggunaan Memory...... 131 Anonymous Memory...... 131 Pagecache...... 132 Buffercache...... 132 Buffer Heads...... 132 Writeback...... 132 ...... 132 VFS caches...... 132 Inode Cache...... 132 Directory Entry Cache...... 133 Mengurangi Penggunaan Memory...... 133 Mengurangi Penggunaan malloc (Anonymous)...... 133 Mengurangi Overhead Kernel Memory...... 133 Memory Controller (Memory Cgroups)...... 133 Parameter Virtual Memory Manager (VM) yang dapat di Tune...... 133 Perbandingan Reclaim...... 133 Parameter Writeback...... 134 Parameter Readahead...... 135 Lebih Lanjut Tentang Parameter VM...... 135 Non-Uniform Memory Access (NUMA)...... 135 Monitoring Perilaku VM...... 135 Referensi...... 136 BAB 11: MEMBUAT KERNEL MODUL SEDERHANA...... 137 Apakah system call?...... 137 Lebih detail tentang System call...... 137 Contoh System Call...... 138 Membuat Kernel Modul...... 140 Apakah kernel mendukung modul?...... 140 Rangka Kernel Modul Sederhana...... 140 Jalankan Module...... 141 Interface module/kernel...... 142 Referensi...... 145 BAB 12: MONITOR SISTEM OPERASI...... 146 top...... 146 htop...... 147 ps...... 147 vmstat...... 149 sar...... 149 w...... 150 uptime...... 150 free...... 150 iostat...... 151 mpstat...... 151 pmap...... 151 netstat...... 152 ss...... 153 iptraf...... 153 Referensi...... 159 BAB 13: BENCHMARK SISTEM OPERASI...... 160 Synthetic Benchmark...... 160 Benchmark Aplikasi...... 161 UnixBench...... 162 Contoh Hasil Evaluasi UnixBench untuk Rainer Server Quad Core...... 163 Referensi...... 166 BAB 14: SEPINTAS MEMBUAT ROM ANDROID SENDIRI...... 167 Pengembangan Android...... 168 Linux kernel...... 168 stack...... 169 Komunitas Open-Source...... 170 Beberapa Distribusi Android...... 171 Persiapan Membuat ROM...... 172 Kebutuhan Hardware...... 172 Kebutuhan Software...... 172 Sistem Operasi...... 172 Java Development Kit (JDK)...... 173 Paket program yang penting...... 173 Binary untuk Nexus & Pixel...... 173 Membangun Build Environment...... 173 Memilih Branch...... 173 Setup Linux build environment...... 174 Install JDK...... 174 Install paket yang dibutuhkan...... 174 Mengkonfigurasi Akses pada USB...... 175 Penggunaan Directory terpisah untuk output...... 176 Download Source Code Android...... 176 Installing Repo...... 176 Inisialisasi Repo Client...... 177 Download Android Source Tree...... 178 Penggunaan Authentication...... 179 Troubleshooting masalah jaringan...... 179 Menggunakan mirror local...... 179 Verifying Git Tags...... 180 Persiapan untuk Build...... 181 Binary proprietary...... 181 Ekstrak proprietary binary...... 182 Clean up...... 182 Set up environment...... 182 Memilih target...... 182 Build code...... 183 Untuk Device Non-Nexus...... 183 Flash dengan fastboot...... 185 Emulate an Android Device...... 185 Troubleshooting Build Errors yang Umum...... 185 Salah Versi Java...... 185 Python Version 3...... 186 Tidak ada ijin USB...... 186 Running Build...... 186 Building fastboot and adb...... 186 Booting ke mode fastboot...... 186 Unlocking bootloader...... 187 Menggunakan Flash Unlock...... 188 Contoh dan source...... 189 Validation...... 189 Selecting a device build...... 189 Flash device...... 190 Restoring device ke factory state...... 191 Build Kernel...... 191 Memilih kernel...... 191 Mengidentifikasi versi kernel...... 192 Downloading source...... 192 Downloading a prebuilt gcc...... 193 Build kernel...... 193 Referensi...... 193 BAB 15: Penutup...... 195 TENTANG PENULIS:...... 196 DEDIKASI Nurlina Purbo Ito, Reza, Atik, Derry, Dzaq, Zhafif KATA PENGANTAR

Buku ini merupakan kristalisasi materi mata kuliah sistem operasi yang dilakukan selama 5+ tahun di kampus. Hasilnya cukup mencengangkan karena berhasil membuat Percaya Diri para mahasiswa khususnya dalam mengeksplorasi dan membuat sendiri sistem operasi komputer maupun Android di handphone.

Dalam proses penyampaian materi buku ini lebih banyak mengajak para mahasiswa untuk mengeksplorasi sistem operasi itu sendiri dan melihat bahwa sistem operasi juga buatan manusia yang bisa dibuat sendiri oleh orang Indonesia. Semoga ini bisa meningkatkan percaya diri para mahasiswa.

Saya mengerti bahwa sebagian besar dosen yang mengajarkan sistem operasi di perguruan tinggi maupun di SMK kemungkinan besar tidak akan menggunakan pola yang saya ajarkan. Sebagian besar akan cenderung untuk mencari jalan yang aman untuk mengajar dan memberikan hal yang sifatnya sangat teoritis saja, tanpa memperlihatkan bagaimana cara membuat, mengcompile dan men-tune sistem operasi secara live di depan kelas. Mudah-mudahan buku ini dapat menolong para pengajar untuk bisa berani mengajar teknik praktis sistem operasi di depan kelas.

Penulis mengucapkan terima kasih kepada

• Teman-teman dosen, tutor dan IT Support di STKIP Surya & Surya University. • Para mahasiswa yang telah bekerja keras untuk memahami sistem operasi dengan baik. • Istri saya Lina Purbo dan anak2 Ito, Reza, Atik, Derry, Dzaq, Zhafif yang mendukung dalam penulisan buku ini.

Mudah-mudahan buku ini dapat menelurkan sumber daya manusia Indonesia yang handal dalam bidang sistem operasi.

Jakarta, 2017 Onno W. Purbo OnnoCenter BAB 1: PENDAHULUAN

Overview Buku Buku ini di tulis sebagai pegangan mata kuliah Sistem Operasi. Motivasi yang ada di balik buku ini agak berbeda dengan kebanyakan mata kuliah sistem operasi yang banyak di ajarkan di kampus- kampus di Indonesia. Secara sederhana, buku ini ingin membuat orang Indonesia lebih Percaya Diri dalam membuat sendiri sistem operasi! Lebih detailnya, bertujuan agar mahasiswa,

1. Mengerti akan berbagai pengertian dan konsep sistem operasi. 2. Mengerti anatomi / struktur source code sistem operasi. 3. Mengerti bagaimana cara membuat atau paling tidak mengcompile sistem operasi. 4. Mengerti bagaimana cara me-remaster sistem operasi yang sudah jadi. 5. Mengerti bagaimana membuat kernel modul / device driver sederhana. 6. Men-tune berbagai parameter sistem operasi. 7. Menilai / mengevaluasi sistem operasi apakah lebih baik atau tidak, setelah berbagai parameter kita ubah. 8. Bisa meng-compile sistem operasi Linux. 9. Bisa meng-compile sistem operasi OpenWRT. 10. Bisa meng-compile ROM Android, khususnya untuk keluarga Nexus.

Sebagian besar perintah & percobaan yang ditulis dalam buku ini di ujicoba menggunakan

Sistem Operasi Ubuntu 14.04 atau 16.04 Kernel Linux versi terakhir OpenWRT Development Trunk Partisi root (/) Minimal > 20Gbyte, lebih aman 60GByte atau lebih.

Untuk membuat ROM android sendiri yang akan di terangkan di bab terakhir akan membutuhkan spesifikasi yang baik dari pada di atas, seperti

Sistem Operasi Ubuntu 64 bit Memory + Swap 16 Gbyte Harddisk bebas 100 Gbyte

Yang paling berat dengan pembuatan ROM android sebetulnya bukan hanya spesifikasi hardware komputer yang digunakan. Teknik yang akan di jelaskan disini masih terbatas untuk keluarga Nexus dari Google. Membuat ROM Android membutuhkan bandwidth ke Internet yang lumayan besar, karena harus mendownload source code android dari Google yang besarnya puluhan, bahkan mencapai lebih dari 100Gbyte. Ini merupakan hal yang sangat mewah. Beberapa mahasiswa saya banyak mengakali dengan nongkrong di tempat-tempat yang bebas bandwidth pada malam hari seperti di Airport dll.

Memang tujuan yang ingin dicapai agak lebih berat dibandingkan mata kuliah sistem operasi yang normal di ajarkan di berbagai perguruan tinggi. Dengan keterbatasan waktu yang ada, maka fokus pengajaran lebih kepada sistem operasi open source yang terbuka dan dapat dengan mudah di explorasi. Kita agak kesulitan untuk mengajarkan teknik membuat sistem operasi Windows, karena memang source code-nya tidak tersedia secara bebas. Sistem Operasi Sebuah sistem operasi (OS) adalah sekumpulan software yang mengatur sumber daya di hardware komputer dan memberikan layanan bagi program komputer. Sistem Operasi adalah komponen penting dari sistem perangkat lunak dalam sebuah komputer. Program aplikasi biasanya membutuhkan sistem operasi untuk bisa berfungsi.

Sistem operasi time sharing menjadwal tugas agar dapat secara effisien menggunakan sistem. Hal ini termasuk menghitung alokasi biaya dari waktu processor, harddisk, printing dan berbagai sumber daya lainnya.

Untuk fungsi hardware seperti input dan output dan alokasi memory, sistem operasi berfungsi sebagai perantara antara program dengan komputer hardware. Meskipun demikian aplikasi dijalankan secara langsung oleh hardware dan biasanya akan melakukan sistem call ke fungsi di OS atau di interupsi oleh OS tersebut. Sistem operasi dapat di temukan di hampir semua alat yang mempunyai fungsi komputer mulai dari handphone, video game hingga super komputer dan web server.

Contoh sistem operasi modern termasuk Android, BSD, iOS, Linux, Mac OS X, Microsoft Windows, and IBM z/OS. Semuanya, kecuali Windows dan z/OS, mempunyai akar yang sama yaitu Unix.

Tipe Sistem Operasi

Real-time Sistem operasi real-time adalah sebuah sistem operasi multitasking yang ditujukan untuk menjalankan aplikasi real-time. Sistem Operasi real-time biasanya menspesialisasikan pada algoritma scheduling (penjadwalan) sehingga mereka dapat mencapai perilaku yang deterministik. Tujuan utama sebuah sistem operasi real-time adalah respons yang cepat dan dapat di prediksi untuk berbagai kejadian. Sistem operasi ini di rancang berdasarkan event-driven atau time-sharing atau kedua-nya. Sebuah sistem event-driven melakukan switching antar task berdasarkan prioritas atau kejadian (event) dari luar, sementara sistem operasi time-sharing melakukan switching antar task berbasis pada interupsi clock.

Multi-user Sistem operasi multi-user memungkinkan banyak pengguna untuk mengakses sistem komputer pada saat yang sama. Sistem time-sharing dan server di Internet dapat dikategorikan sebagai sistem multi-user karena mereka memungkinkan banyak pengguna untuk mengakses komputer dengan cara berbagai waktu (sharing time). Sistem operasi single user hanya satu pengguna tapi dapat menjalankan multiple program pada saat yang sama.

Multi-tasking vs. single-tasking Sebuah sistem operasi multi-tasking memungkinkan lebih dari satu program untuk berjalan pada satu saat, dilihat dari skala waktu manusia. Sebuah sistem single-tasking hanya dapat menjalankan satu program. Ada dua tipe Multi-tasking, yaitu: (1) pre-emptive dan (2) co-operative. Di pre- emptive multitasking, sistem operasi akan membagi CPU time dan mendedikasikan satu slot untuk setiap program. Di sistem operasi Unix-like, seperti, Solaris dan Linux, biasanya mendukung pre- emptive multitasking, seperti juga AmigaOS. Cooperative multitasking dapat dicapai dengan cara saling mengandalkan satu sama lain untuk memberikan waktu / slot time ke proses yang lain dengan aturan yang baku.

Sistem Terdistribusi Sebuah sistem operasi terdistribusi mengatur sebuah kelompok dari komputer yang independen dan membuat mereka tampak seperti satu buah komputer. Dengan perkembangan jaringan komputer memungkinkan sambungan dan komunikasi satu sama lain untuk membangun distributed computing. Komputasi terdistribusi dilakukan oleh lebih dari satu mesin. Jika komputer dalam satu group bekerjasama, maka mereka akan membangun sebuah distributed system / sistem terdistribusi.

Sistem Embedded Sistem operasi embedded di rancang untuk digunakan di sistem komputer embedded. Sistem operasi embedded di operasikan di mesin kecil seperti PDA. Sistem operasi ini dapat beroperasi dengan sumber daya yang sangat terbatas. Sistem operasi ini di rancang agar sangat kecil dan sangat effisien. Contoh dari sistem operasi embedded ini adalah OpenWRT.

Sejarah Pada awalnya komputer dibuat untuk menjalankan sekumpulan single task, seperti calculator. Sistem operasi belum menampakan diri sampai awal 1960. Dasar fitur sistem operasi mulai dikembangkan tahun 1950, seperti fungsi monitor yang dapat secara automatis menjalankan program yang berbeda dalam rangka mempercepat processing. Fitur hardware di tambahkan untuk membuka kemungkinan untuk menggunakan runtime library, interrupsi, dan parallel processing. Pada saat PC menjadi populer di tahun 1980-an, sistem operasi yang dibuat untuk PC secara konsep sama dengan yang digunakan di komputer yang besar.

Di tahun 1940-an, sistem elektronik digital awal tidak mempunyai sistem operasi.Sistem elektronik pada masa itu di program menggunakan sekumpulan switch mekanik atau dengan kabel jumper di papan board. Sistem ini merupakan sistem special-purpose, sebagai contoh, untuk membuat tabel balistik untuk militer atau mengatur pencetakan slip gaji dari data di punch card. Sesudah komputer aplikasi umum yang programmable dibuat, bahasa mesin (terdiri dari kalimat yang terdiri dari digit 0 dan 1 di kartu punch card) di petkenalkan untuk mempercepat proses programming. OS/360 digunakan pada sebagian besar komputer mainframe IBM di awal tahun 1966, termasuk komputer yang menolong NASA untuk menerbangkan manusia ke bulan.

Di awal tahun 1950, sebuah komputer hanya dapat menjalankan satu program pada satu waktu. Setiap pengguna menggunakan sendiri komputer untuk waktu yang terbatas sesuai dengan jadwal waktu, dengan program dan data yang ada di punch card atau punch tape. Program akan di load ke komputer, dan komputer akan bekerja sampai program selesai atau crash. Program biasanya di debug melalui panel di depan menggunakan switch dan lampu panel.

Belakangan mesin-mesin ini dilengkapi dengan program library, yang di sambungkan (di link) di program user untuk membantu operasi tertentu, seperti, input, output, dan membuat kode komputer yang dapat dibaca manusia. Ini merupakan asal muasal sistem operasi modern. Akan tetapi, mesin masih menjalankan single job pada satu waktu.

Mainframe Di tahun 1950, banyak fitur di pelopori di bidang sistem operasi, termasuk proses batch, interupsi input/output, buffering, multitasking, spooling, runtime library, link-loading, dan program untuk mengurut catatan di file. Fitur ini tidak dimasukan dalam software aplikasi sebagai pilihan bagi programmer, tapi dibuat sebagai sistem operasi yang terpisah yang digunakan oleh semua aplikasi. Di tahun 1959, sistem operasi SHARE di lepas sebagai utility integrated untuk IBM 704, selanjutnya di mainframe 709 dan 7090 walaupun kemudian digantikan oleh IBSYS/IBJOB di 709, 7090 dan 7094.

Selama tahun 1960, IBM OS/360 memperkenalkan konsep sebuah OS untuk semua produk, yang menjadi sangat penting untuk kesuksesan mesin System/360. Sistem operasi di mainframe IBM saat ini adalah turunan dari sistem awal dan aplikasi yang ditulis untuk OS/360 masih bisa berjalan di mesin yang modern.

OS/360 juga memelopori konsep yang menentukan bahwa sistem operasi akan mencatat semua penggunaan sumber daya, termasuk alokasi memori untuk program dan data, ruang file di harddisk, penguncian file saat update. Jika proses ini di putuskan karena berbagai alasan, semua sumber daya tersebut akan direklamasi oleh sistem operasi.

Alternatif sistem operasi CP-67 untuk S/360-67 memulai sebuah jalur pada sistem operasi IBM yang memfokuskan diri pada mesin virtual. Sistem operasi lainnya yang digunakan di seri mainframe IBM S/360 termasuk sistem yang dikembangkan sendiri oleh IBM: COS/360 (Compatibility Operating System), DOS/360 (Disk Operating System), TSS/360 (Time Sharing System), TOS/360 (Tape Operating System), BOS/360 (Basic Operating System), dan ACP (Airline Control Program), termasuk beberapa sistem non-IBM: MTS (Michigan Terminal System), MUSIC (Multi-User System for Interactive Computing), dan ORVYL (Stanford Timesharing System).

Control Data Corporation mengembangkan sistem operasi SCOPE di tahun 1960-an untuk batch processing. Bekerjasama dengan University of Minnesota, sistem operasi Kronos dan selanjutnya NOS dikembangkan pada tahun 1970-an, yang mendukung batch secara simultan dan penggunaan timesharing. Seperti sistem timesharing komersial lainnya, interfacenya merupakan extensi dari Dartmouth BASIC operating systems, salah satu usaha rintisan dalam timesharing dan bahasa pemrogramman. In akhir tahun 1970-an, Control Data dan University of Illinois mengembangkan sistem operasi PLATO, yang menggunakan display plasma panel dan jaringan time sharing jarak jauh. Plato termasuk cukup inovatif pada masanya, fitur seperti real-time chat, dan game grafis multi-user. Burroughs Corporation memperkenalkan B5000 di tahun 1961 dengan sistem operasi MCP, (Master Control Program). B5000 di rancang sebagai stack machine untuk mendukung bahasa tingkat tinggi tanpa bahasa mesin atau assembler, dan MCP adalah sistem operasi pertama yang ditulis secara exclusif dalam bahasa tingkat tinggi - ESPOL, sebuah dialek dari ALGOL. MCP juga memperkenalkan banyak innovasi baru, seperti implementasi komersial pertama untuk memory virtual. Dalam masa pengembangan AS400, IBM sempat mendekati Burroughs untuk membeli lisensi dari MCP agar dapat di jalankan di hardware AS400. Proposal IBM di tolak oleh manajemen Burroughs untuk melindungi produksi hardware mereka. MCP sampai hari ini masih digunakan di komputer Unisys ClearPath/MCP.

UNIVAC, pembuat komputer komersial pertama, memproduksi sistem operasi EXEC. Seperti halnya sistem mainframe awal, EXEC adalah sistem yang berorientasi batch yang mengatur drum magnetic, disk, card reader dan line printer. Di tahun 1970-an, UNIVAC membuat Real-Time Basic (RTB) system untuk mendukung time sharing skala besar, yang diturunkan Dartmouth BC system. General Electric dan MIT mengembangkan General Electric Comprehensive Operating Supervisor (GECOS), yang memperkenalkan konsep keamanan yang berlapis. Setelah di akusisi oleh Honeywell, sistem operasi ini di beri nama General Comprehensive Operating System (GCOS). Digital Equipment Corporation juga mengembangkan banyak sistem operasi untuk berbagai komputernya, termasuk TOPS-10 dan TOPS-20 time sharing system untuk 36-bit PDP-10 class system. Sebelum UNIX banyak digunakan, TOPS-10 adalah sistem operasi yang paling populer di universitas, dan di komunitas awal ARPANET.

Di akhir tahun 1960-an hingga akhir 1970-an, kemampuan hardware berevolusi juga software berhasil di porting agar berjalan di lebih dari satu sistem. Sistem awal banyak menggunakan microprogramming untuk mengimplementasi fitur pada sistem mereka untuk membuat arsitektur komputer menjadi tampak sama seperti yang lain dari seri komputer lainnya. Sebetulnya sebagian besar 360 sesudah 360/40 (kecuali 360/165 dan 360/168) sebetulnya menggunakan implementasi microprogram. implementations. Selanjutnya dipahami kompatibilitas aplikasi terbukti lebih penting.

Banyak sekali investasi software untuk sistem ini dilakukan sejak tahun 1960-an karena kebanyakan pembuat komputer akan mengembangkan sistem operasi yang cocok untuk hardware-nya. Beberapa sistem operasi yang mendukung mainframe adalah:

• Burroughs MCP – B5000, 1961 hingga Unisys Clearpath/MCP, sekarang. • IBM OS/360 – IBM System/360, 1966 hingga IBM z/OS, sekarang. • IBM CP-67 – IBM System/360, 1967 hingga IBM z/VM, sekarang. • UNIVAC EXEC 8 – UNIVAC 1108, 1967, hingga OS 2200 Unisys Clearpath Dorado, sekarang.

Microcomputer PC-DOS adalah awal sistem operasi untuk personal komputer yang berupa command line interface (CLI). Mac OS dari Apple Computer menjadi sistem operasi pertama yang menggunakan Graphical User Interface (GUI). Banyak dari fitur-nya seperti Windows dan Icon dikemudian hari menjadi ciri GUI.

Mikrokomputer pertama tidak mempunyai kapasitas atau kebutuhan untuk menjalankan sistem operasi yang rumit yang dikembangkan di mainframe atau mini. Sistem operasi minimalistik di kembangkan, kadang kali dimasukan kedalam ROM yang dikenal sebagai monitor. Salah satu sistem operasi awal yang cukup menonjol adalah CP/M, yang di dukung oleh banyak mikrokomputer awal dan sangat mirip dengan Microsoft MS-DOS, yang menjadi sangat populer karena dipilih sebagai sistem operasi IBM PC (versi IBM dari MS-DOS dari dikenal sebagai IBM DOS atau PC DOS). Di tahun 1980-an, Apple Computer Inc. (sekarang Apple Inc.) meninggalkan seri Apple II yang popular untuk memperkenalkan Apple Macintosh computer dengan innovative Graphical User Interface (GUI) dengan Mac OS.

Dengan di perkenalkannya CPU Intel 80386 dengan arsitektur 32-bit dan kemampuan paging, komputer personal mempunyai kemampuan untuk menjalankan sistem operasi multitasking seperti minikomputer dan mainframe yang awal. Microsoft meresponds dengan mengambil Dave Cutler, yang mengembangkan sistem operasi VMS di Digital Equipment Corporation. Dave memimpin pengembangkan sistem operasi Windows NT yang menjadi dasar dari sistem operasi Microsoft. Steve Jobs, salah satu pendiri Apple Inc., memulai NeXT Computer Inc., yang mengembangkan sistem operasi NEXTSTEP. NEXTSTEP dikemudian hari di beli oleh Apple Inc. dan digunakan, bersama dengan code dari FreeBSD sebagai inti dari Mac OS X.

GNU Project di awali oleh seorang activis dan programmer Richard Stallman dengan tujuan untuk membuat software yang benar-benar free (bebas) sebagai pengganti dari sistem operasi UNIX yang berhak cipta (proprietary). GNU Project secara umum sangat sukses untuk menduplikasi fungsi berbagai hal dari UNIX, tapi mengembangkan sistem operasi GNU Hurd kernel tampaknya kurang produktif. Tahun 1991, seorang mahasiswa komputer science dari finland , dengan di bantu oleh banyak relawan berkolaborasi melalui Internet, melepaskan versi pertama kernel Linux. Tak lama kemudian, merger dengan komponen GNU untuk membentuk sebuah sistem operasi yang komplit. Sejak itu, kedua komponen tersebut biasanya di kenal sebagai "Linux" oleh industri software, nama yang sangat di tentang oleh Stallman maupun Free Software Foundation, mereka lebih suka dengan nama GNU/Linux. Berkeley Software Distribution, dikenal sebagai BSD, adalah turunan UNIX yang disebarkan oleh University of California, Berkeley, dimulai sekitar tahun 1970- an. BSD di sebarkan dengan bebas dan di porting ke banyak minikomputer. BSD akhirnya memperoleh beberapa pengikut di PC, seperti, FreeBSD, NetBSD dan OpenBSD.

Contoh Sistem Operasi

Sistem Operasi UNIX dan UNIX-like Unix awalnya ditulis menggunakan bahasa assembler. Ken Thompson menulis bahasa B, berbasis pada BCPL, berdasarkan pengalamannya di projek MULTICS. Bahasa B kemudian di ganti oleh bahasa C, dan Unix, ditulis ulang dalam bahasa C, dikembangkan menjadi keluarga sistem operasi yang besar, kompleks dan saling berhubungan yang menjadi sangat berpengaruh pada semua sistem operasi modern.

Keluarga UNIX-like adalah sebuah kelompok sistem operasi yang sangat besar, dengan beberapa sub-kategori utama, termasuk, System V, BSD, dan Linux. Nama "UNIX" adalah merek dagang dari The Open Group yang me-lisensi-kan untuk digunakan di semua sistem operasi yang sesuai dengan definisi mereka. Nama "UNIX-like" lebih sering digunakan untuk menyebutkan sistem operasi yang mirip dengan UNIX yang orisinil.

Sistem Unix-like berjalan di berbagai arsitektur komputer. Mereka banyak digunakan di server untuk usaha / bisnis, juga di workstation untuk lingkungan akademik dan engineering. Varian UNIX yang free, seperti Linux dan BSD, sangat populer di wilayah ini.

Ada empat (4) sistem operasi yang di sertifikasi oleh The Open Group (pemegang merek dagang UNIX) sebagai Unix. Sistem Operasi tersebut adalah HP-UX dan IBM AIX keduanya adalah turunan dari System V original dan hanya dapat di jalankan di hardware masing-masing vendir tersebut. Sedangkan, Sistem Operasi Solaris dari Sun Microsystem dapat dijalankan di berbagai hardware, termasuk x86 dan Sparc server, dan PC. Apple OS X, yang merupakan pengganti dari Apple MacOS, mempunyai kernel hybrid berbasis dari varian BSD yang diturunkan dari NeXTSTEP, Mach, dan FreeBSD.

Unix interoperability dilakukan melalui POSIX standard. POSIX standard dapat di terapkan ke sistem operasi manapun, walaupun awalnya dikembangkan untuk varian Unix

BSD dan turunannya Subgroup dari keluarga Unix adalah keluarga Berkeley Software Distribution (BSD), termasuk FreeBSD, NetBSD, dan OpenBSD. Sistem operasi ini biasanya di temukan di web server, walaupun mereka juga dapat ditemukan di PC. Keberadaan Internet berhutang banyak pada BSD, karena banyak protokol yang banyak digunakan di komputer, untuk saling mengirim dan menerima data melalui jaringan awalnya di implementasi dan di perbaiki di BSD. Web pertama dijalankan di komputer dengan sistem operasi berbasis BSD yaitu NextStep.

BSD berakar pada Unix. Pada tahun 1974, University of California, Berkeley menginstal sistem Unix pertama. Seiring dengan waktu, mahasiswa dan staf di departemen ilmu komputer mulai menambahkan aplikasi baru untuk membuat semuanya menjadi lebih mudah, seperti editor teks. Ketika Berkely menerima komputer VAX baru pada tahun 1978 dengan sistem operasi Unix , mahasiswa memodifikasi Unix untuk dapat mengambil keuntungan dari hardware komputer. Defense Advanced Research Projects Agency dari Departemen Pertahanan AS tertarik, dan memutuskan untuk mendanai proyek tersebut. Banyak sekolah, perusahaan, dan organisasi pemerintah tertarik dan mulai menggunakan versi Berkeley Unix bukan versi resmi yang didistribusikan oleh AT & T.

Steve Jobs, saat meninggalkan Apple Inc pada tahun 1985, membentuk NeXT Inc, sebuah perusahaan yang memproduksi komputer high-end menjalankan variasi BSD disebut NeXTSTEP. Salah satu komputer tersebut digunakan oleh Tim Berners-Lee sebagai webserver pertama untuk menciptakan World Wide Web.

Pengembang seperti Keith Bostic mendorong proyek untuk mengganti kode non-bebas yang berasal dari Bell Labs. Sayang sekali setelah ini dilakukan AT & T menggugat. Akhirnya, setelah dua tahun sengketa hukum, proyek BSD lolos dan melahirkan sejumlah derivatif bebas, seperti FreeBSD dan NetBSD.

OS X OS X (sebelumnya "Mac OS X") adalah sistem operasi open core grafis yang dikembangkan dipasarkan dan dijual oleh Apple Inc., belakangan di install pada semua komputer Macintosh saat pengiriman. OS X adalah penerus MacOS original, yang menjadi sistem operasi utama Apple sejak tahun 1984. Tidak seperti pendahulunya, OS X adalah sistem operasi UNIX yang dibangun pada teknologi yang telah dikembangkan di NeXT mulai dari paruh kedua tahun 1980-an sampai Apple membeli NeXT pada awal 1997. Sistem operasi ini pertama kali dirilis pada tahun 1999 sebagai Mac OS X Server 1.0 dengan versi desktop (Mac OS X v10.0 "Cheetah") mengikutinya pada Maret 2001. Sejak itu, ada enam "klien" dan "server" edisi OS X telah dirilis, yang terbaru OS X 10.8 "Mountain Lion" yang pertama kali tersedia pada tanggal 16 Februari 2012 untuk pengembang, dan kemudian dirilis untuk umum pada 25 Juli 2012. Rilis dari OS X diberi nama sesuai dengan "big cats".

Sebelum penggabungan dengan OS X, server edition - OS X Server - secara arsitektur identik dengan desktop dan biasanya berjalan di Apple Macintosh server hardware. OS X Server mencakup work group manajemen dan perangkat lunak administrasi yang menyediakan akses yang disederhanakan untuk layanan jaringan utama, termasuk transfer mail, server Samba, server LDAP, server nama domain, dan lain-lain. Dengan MacOS X v10.7 Lion, aspek server MacOS X telah terintegrasi ke dalam versi klien dan produk rebranding "OS X" (membuang "MacOS" dari nama). Server tool sekarang ditawarkan sebagai aplikasi.

Linux and GNU Linux (atau GNU / Linux) adalah sistem operasi Unix-like yang dikembangkan tanpa kode Unix asli Unix-like , seperti BSD dan variannya. Linux dapat digunakan pada berbagai perangkat dari superkomputer hingga jam tangan. Kernel Linux dirilis di bawah lisensi open source, sehingga siapapun dapat membaca dan memodifikasi source code-nya. Linux telah dimodifikasi untuk berjalan pada berbagai macam elektronik. Perkiraan yang ada menunjukkan bahwa Linux digunakan pada 1,82% dari semua komputer pribadi, telah banyak diadopsi untuk digunakan di server hingga embedded system (seperti ponsel). Linux telah menggantikan Unix di kebanyakan tempat, dan digunakan pada 10 superkomputer di dunia. Kernel Linux yang digunakan dalam beberapa distro populer, seperti Red Hat, Debian, Ubuntu, Linux Mint dan Google Android.

Proyek GNU merupakan kolaborasi masal programmer yang berusaha untuk menciptakan sebuah sistem operasi benar-benar bebas dan yang mirip Unix tapi dengan kodesendiri. Proyek GNU dimulai pada tahun 1983 oleh Richard Stallman, dan bertanggung jawab untuk banyak bagian dari varian Linux. Ribuan buah perangkat lunak untuk hampir setiap sistem operasi berlisensi di bawah GNU General Public License. Sementara itu, kernel Linux dimulai sebagai proyek sampingan dari Linus Torvalds, seorang mahasiswa dari Finlandia. Pada tahun 1991, Torvalds mulai mengerjakan, dan memposting informasi tentang proyek-nya di newsgroup untuk mahasiswa komputer dan programer. Ia menerima banyak sekali dukungan dan sukarelawan yang akhirnya menciptakan sebuah kernel yang utuh. Pemrogram dari GNU tertarik , dan anggota kedua proyek bekerja sama untuk mengintegrasikan bagian dari GNU dengan kernel Linux dalam rangka menciptakan sistem operasi yang utuh.

Google Chromium OS Chromium adalah sistem operasi berbasis kernel Linux dan didesain oleh Google. Karena Chromium OS ditujukan untuk pengguna komputer yang menghabiskan sebagian besar waktu mereka di Internet, dia banyak mengandalkan web browser dan tidak memiliki kemampuan untuk menjalankan aplikasi lokal. Akan tetapi, dia bergantung pada aplikasi internet (atau web apps ) yang digunakan dalam web browser untuk menyelesaikan pekerjaan seperti pengolah kata dan melihat media, serta penyimpanan online untuk menyimpan file.

Microsoft Windows Microsoft Windows adalah keluarga sistem operasi proprietary yang dirancang oleh Microsoft Corporation dan terutama ditargetkan untuk komputer berbasis arsitektur Intel, dengan estimasi pangsa 88,9 persen dari total komputer yang terhubung web. Versi terbaru adalah Windows 8 untuk workstation dan Windows Server 2012 untuk server. Windows 7 baru-baru ini melampaui Windows XP sebagai OS yang paling banyak digunakan.

Microsoft Windows berawal pada tahun 1985 sebagai lingkungan operasi yang berjalan di atas MS- DOS, yang merupakan sistem operasi standar dikirimkan pada kebanyakan arsitektur komputer pribadi berbasis processor intel pada saat itu. Pada tahun 1995, Windows 95 dirilis yang hanya menggunakan MS-DOS sebagai bootstrap. Untuk kompatibilitas ke belakang, Win9x bisa menjalankan real-mode MS-DOS dan 16 bit Windows 3.x driver. Windows ME, dirilis pada tahun 2000, adalah versi terakhir dalam keluarga Win9x. Versi yang lebih baru semuanya telah didasarkan pada kernel Windows NT. Versi terkini dari Windows berjalan pada mikroprosesor IA-32 dan x86- 64, meskipun Windows 8 akan mendukung arsitektur ARM. Di masa lalu, Windows NT mendukung non-Intel arsitektur.

Edisi Server Windows agak banyak digunakan. Dalam beberapa tahun terakhir, Microsoft telah mengeluarkan modal yang signifikan dalam upaya untuk mempromosikan penggunaan Windows sebagai sistem operasi server. Namun, pemakaian Windows pada server tidak begitu luas seperti pada komputer pribadi, karena Windows bersaing dengan Linux dan BSD untuk pangsa pasar server. Lainnya Ada banyak sistem operasi yang signifikan pada zaman mereka tetapi tak lagi begitu sekarang, seperti AmigaOS, OS / 2 dari IBM dan Microsoft, MacOS pendahulu non-Unix untuk Apple Mac OS X, BeOS, XTS300; RISC OS, MorphOS dan FreeMint. Beberapa masih digunakan di ceruk pasar dan terus dikembangkan sebagai platform minoritas bagi mereka yang suka / antusias dan aplikasi khusus. OpenVMS sebelumnya dari DEC, masih dalam pengembangan aktif oleh Hewlett- Packard. Namun sistem operasi lain digunakan hampir secara eksklusif di akademisi, untuk pendidikan sistem operasi atau melakukan penelitian pada konsep sistem operasi. Sebuah contoh yang khas dari sistem yang memenuhi kedua peran adalah , sedangkan Singularity digunakan murni untuk penelitian.

Sistem operasi lain telah gagal untuk memenangkan pangsa pasar yang signifikan, namun telah memperkenalkan inovasi yang telah mempengaruhi sistem operasi mainstream, paling tidak Bell Labs Plan 9.

Komponen Sistem Operasi Komponen sistem operasi semua ada untuk membuat bagian-bagian yang berbeda dari komputer bekerja sama. Semua perangkat lunak pengguna harus melalui sistem operasi untuk menggunakan perangkat keras, apakah itu sederhana seperti mouse atau keyboard atau serumit komponen internet.

Kernel Kernel menghubungkan perangkat lunak aplikasi ke perangkat keras komputer. Dengan bantuan firmware device driver, kernel menyediakan tingkat yang paling dasar untuk mengontrol semua perangkat keras komputer. Ia mengatur akses memori untuk program di RAM, menentukan program mana yang mendapatkan akses ke sumber daya perangkat keras, kernel menset up atau me-reset kondisi operasi CPU agar beroperasi optimal setiap saat, dan mengatur penyimpanan data untuk jangka panjang pada penyimpanan non-volatile dengan sistem file pada media seperti disk, kaset, memori flash, dll.

Eksekusi Program Sistem operasi menyediakan antarmuka antara program aplikasi dengan perangkat keras komputer, sehingga program aplikasi dapat berinteraksi dengan perangkat keras hanya dengan mematuhi peraturan dan prosedur yang sudah diprogram ke dalam sistem operasi. Sistem operasi juga merupakan satu set layanan yang menyederhanakan pengembangan dan eksekusi program-program aplikasi. Eksekusi program aplikasi melibatkan proses pembuatan oleh kernel sistem operasi yang memberikan ruang memori dan sumber daya lainnya, menetapkan prioritas untuk proses multi- tasking sistem, memasukan program kode biner ke memori, dan memulai eksekusi program aplikasi yang kemudian berinteraksi dengan pengguna dan dengan perangkat keras.

Interupsi Interupsi sangat penting untuk sistem operasi, karena menyediakan cara yang efisien untuk sistem operasi untuk berinteraksi dengan dan bereaksi terhadap lingkungannya. Pilihan lainnya - menggunakan sistem operasi "mengawasi" berbagai sumber input akan kejadian (polling) agar dilakukan tindakan - teknik ini dapat ditemukan di sistem lama dengan stack yang sangat kecil (50 atau 60 byte) , teknik ini tidak biasa dalam sistem operasi modern dengan stack besar. Interupsi berbasis pemrograman langsung didukung oleh CPU paling modern. Interrupts memberikan komputer cara otomatis menyimpan konteks lokal register, dan menjalankan kode tertentu dalam menanggapi kejadian. Bahkan komputer yang sangat sederhana saat ini mendukung interupsi hardware, dan memungkinkan programmer untuk menentukan kode yang akan dijalankan ketika kejadian berlangsung.

Ketika interupsi diterima, hardware komputer secara otomatis menunda semua program yang sedang berjalan, statusnya disimpan, dan menjalankan kode komputer yang terkait dengan interupsi, hal ini analog dengan menempatkan penunjuk di buku sebagai tanggapan terhadap panggilan telepon. Dalam sistem operasi modern, interupsi ditangani oleh kernel sistem operasi. Interupsi dapat berasal dari baik perangkat keras komputer atau dari program berjalan.

Ketika sebuah perangkat keras memicu interupsi, kernel sistem operasi akan memutuskan bagaimana menangani kejadian ini, dengan menjalankan kode pemrosesan. Besarnya kode yang dijalankan tergantung pada prioritas interupsi (misalnya: orang biasanya akan merespon alarm detektor kebakaran sebelum menjawab telepon). Penanganan interupsi hardware biasanya didelegasikan ke perangkat lunak device driver , yang mungkin salah satu bagian dari kernel sistem operasi, atau bagian dari program lain, atau keduanya. Device driver kemudian dapat menyampaikan informasi ke program yang berjalan dengan berbagai cara.

Sebuah program mungkin juga untuk memicu interupsi kepada sistem operasi. Jika sebuah program ingin mengakses hardware misalnya, dia dapat menginterupsi kernel sistem operasi, yang menyebabkan kontrol untuk dikembalikan ke kernel. Kernel kemudian akan memproses permintaan tersebut. Jika sebuah program ingin sumber daya tambahan (atau ingin menumpahkan sumber daya) seperti memori, ia akan memicu interupsi untuk mendapatkan perhatian kernel.

Mode Secara umum ada dua mode, yaitu: • Mode Protected • Mode Supervisor.

Privilege ring untuk x86 tersedia dalam protected mode . Sistem operasi menentukan proses mana yang berjalan dalam masing-masing modus .

CPU modern mendukung beberapa mode operasi. CPU dengan kemampuan ini menggunakan setidaknya dua mode: mode dan supervisor mode. Supervisor mode digunakan oleh kernel sistem operasi untuk tugas-tugas tingkat rendah yang membutuhkan akses tidak terbatas ke perangkat keras, seperti mengendalikan bagaimana memori ditulis dan dihapus, dan komunikasi dengan perangkat seperti kartu grafis. Protected mode, sebaliknya, digunakan untuk hampir segala sesuatu yang lain. Aplikasi yang beroperasi dalam protected mode, akan hanya dapat menggunakan perangkat keras melalui komunikasi dengan kernel, yang mengontrol segala sesuatu dalam mode supervisor. CPU mungkin ada mode lain yang serupa dengan proteded mode , seperti mode virtual untuk mengemulasi jenis prosesor tua, seperti 16-bit prosesor pada 32-bit , atau 32-bit prosesor pada 64-bit.

Ketika komputer pertama kali dijalankan, maka secara otomatis berjalan dalam mode supervisor. Beberapa program pertama yang berjalan di komputer, sebagai BIOS atau EFI, bootloader, dan sistem operasi memiliki akses tak terbatas ke perangkat keras - dan ini diperlukan karena, menurut definisi, Memulai lingkungan terlindungi hanya dapat dilakukan di luar lingkungan tersebut. Namun, ketika sistem operasi melewati kontrol ke program lain, maka dia dapat menset CPU ke mode protected. Dalam mode protected, program mungkin memiliki akses ke set instruksi CPU yang terbatas . Sebuah program pengguna dapat meninggalkan mode protected hanya dengan memicu trigger, yang menyebabkan kontrol untuk diberikan kembali ke kernel. Dengan cara ini sistem operasi dapat mempertahankan kontrol eksklusif atas hal-hal seperti akses ke hardware dan memori.

Istilah "protected mode resource" biasanya merujuk kepada satu atau lebih register CPU, yang berisi informasi bahwa program berjalan tidak diperbolehkan untuk mengubah. Upaya untuk mengubah sumber daya ini umumnya menyebabkan berubah ke mode supervisor, dimana sistem operasi dapat menangani operasi program ilegal (misalnya, dengan membunuh program).

Manajemen Memory Antara lain, sebuah kernel sistem operasi multiprogramming harus bertanggung jawab untuk mengelola semua sistem memori yang sedang digunakan oleh program. Hal ini memastikan bahwa program ini tidak terganggu dengan memori yang sudah digunakan oleh program lain. Karena program sharing waktu / time, setiap program harus memiliki akses independen ke memori.

Cooperative Memory Management, digunakan oleh banyak awal sistem operasi, berasumsi bahwa semua program menggunakan secara sukarela manajer memori kernel, dan tidak melebihi alokasi memori mereka . Teknik sistem pengelolaan memori ini hampir tidak pernah terlihat lagi, karena sering berisi program bug yang dapat menyebabkan mereka untuk mengalokasikan memori melebihi alokasinya. Jika program gagal, dapat menyebabkan memori yang digunakan oleh program lain menjadi terpengaruh atau ditimpa. Program jahat atau virus sengaja dapat mengubah memori program lain, atau dapat mempengaruhi pengoperasian sistem operasi itu sendiri. Dengan cooperative memory manajgement , dibutuhkan cukup satu program yang tidak diinginkan untuk membuuat sistem crash.

Memori protection memungkinkan kernel untuk membatasi akses sebuah proses ke memori komputer. Ada berbagai metode memori protection , termasuk segmentasi memori dan paging. Semua metode memerlukan beberapa tingkat dukungan hardware (seperti 80286 MMU), yang tidak selalu ada di semua komputer.

Baik dalam segmentasi dan paging, mode protected register tertentu di CPU akan menentukan alamat memori yang harus diperbolehkan untuk di akses oleh sebuah program yang berjalan . Upaya untuk mengakses alamat selain yang dialokasikan akan memicu interupsi yang akan menyebabkan CPU untuk memasukkan kembali mode supervisor, menjadikan kernel yang bertanggung jawab. Ini disebut pelanggaran segmentasi atau Seg-V untuk singkatnya, dan karena ini biasanya sulit untuk memperoleh hasil yang berarti dari operasi yang salah ini, oleh karena itu biasanya merupakan tanda adanya program yang salah, kernel umumnya akan mengambil jalan untuk mengakhiri program, dan akan melaporkan kesalahan.

Di Windows, kesalahan segmentasi ini kadang akan muncul sebagai layar biru.

Memory Virtual Banyak sistem operasi dapat "menipu" program dalam menggunakan memori tersebar di seluruh hard disk dan RAM seolah-olah itu adalah salah satu potongan kontinu memori , yang disebut memori virtual.

Penggunaan pengalamatan memori virtuall (seperti paging atau segmentasi) berarti kernel dapat memilih memori apa yang digunakan setiap program pada waktu tertentu, yang memungkinkan sistem operasi untuk menggunakan lokasi memori yang sama untuk berbagai keperluan.

Jika sebuah program mencoba mengakses memory yang tidak adalah dalam range memori yang dapat di akses , tapi tetap telah dialokasikan untuk program tersebut, kernel akan diinterupsi dengan cara yang sama jika ada program melebihi memori yang dialokasikan. Di UNIX interupsi jenis ini di sebut sebagai kesalahan halaman / page fault.

Ketika kernel mendeteksi kesalahan halaman umumnya akan menyesuaikan range virtual memori bagi program yang memicunya, ia memberikan akses ke memori diminta. Hal ini memberikan kekuatan pada kernel untuk menentukan di mana memori dari aplikasi tertentu disimpan, atau apakah memori sudah dialoikasikan atau belum.

Dalam sistem operasi modern, memori yang diakses jarang diakses dapat disimpan sementara pada disk atau media lain untuk membuat ruang yang tersedia agar dapat digunakan oleh program lain. Ini disebut swapping, sebagai daerah memori yang dapat digunakan oleh beberapa program, dan isi memori di daerah tersebut dapat ditukar (swap) sesuai permintaan.

"Virtual memory" memberikan programmer maupun pengguna akan persepsi bahwa ada RAM dalam jumlah yang jauh lebih besar dari RAM yang sebenarnya ada di komputer.

Multitasking Multitasking adalah menjalankan beberapa program komputer independen pada komputer yang sama, memberikan kesan bahwa komputer melakukan tugas pada waktu yang sama. Karena kebanyakan komputer hanya dapat melakukan paling banyak satu atau dua hal pada satu waktu, multitasking biasanya dilakukan menggunakan time-sharing, yang berarti bahwa setiap program menggunakan sebagian dari waktu komputer saat dieksekusi.

Sebuah kernel sistem operasi berisi software yang disebut scheduler yang menentukan berapa banyak waktu setiap program yang dapat digunakan saat eksekusi, yang mana perintah untuk kontrol eksekusi harus diberikan ke program. Kontrol diberikan ke sebuah process oleh kernel, yang mengijinkan program untuk mengakses CPU atau memory. Kemudian, kontrol dikembalikan ke kernel melalui sebuah mekanisme, sehingga program lain dapat diijinkan untuk menggunakan CPU. Proses pemberian kontrol antara kernel dengan aplikasi biasanya di sebut sebagai context switch.

Model awal yang diatur alokasi waktu untuk program disebut cooperative multitasking. Dalam model ini, ketika kendali diberikan ke program oleh kernel, program dapat dijalankan selama program inginkan sebelum secara eksplisit mengembalikan kontrol ke kernel. Ini berarti bahwa program jahat atau program yang tidak berfungsi tidak hanya mencegah program lain dari penggunaan CPU, tetapi bisa menggantung seluruh sistem jika memasuki infinite loop.

Sistem operasi modern memperluas konsep preemption aplikasi ke device driver dan kode kernel, sehingga sistem operasi memiliki kontrol preemptive atas internal run-time juga.

Filosofi mengatur preemptive multitasking adalah untuk memastikan bahwa semua program yang diberi waktu di CPU. Ini menunjukkan bahwa semua program harus dibatasi dalam berapa banyak waktu mereka diizinkan untuk dihabiskan di CPU tanpa di interupsi. Untuk mencapai hal ini, kernel sistem operasi modern menggunakan sebuah interupsi berjangka. Sebuah protected mode timer diatur oleh kernel yang memicu untuk kembali ke mode supervisor setelah waktu yang ditentukan telah berlalu. Pada banyak sistem operasi single user cooperative multitasking cukup memadai, karena umumnya home komputer (PC) menjalankan sejumlah program teruji baik. AmigaOS adalah pengecualian, karena menggunakan pre-emptive multitasking dari versi pertama. Windows NT merupakan versi pertama dari Microsoft Windows yang menerapkan preemptive multitasking, tetapi tidak mencapai pasar pengguna rumah sampai Windows XP (sebab Windows NT ditujukan pada profesional).

Akses Disk dan file system Filesystem memungkinkan pengguna dan program untuk menata dan mengatur file pada komputer, biasanya melalui penggunaan direktori (atau "folder")

Akses ke data yang tersimpan pada disk adalah fitur utama dari semua sistem operasi. Komputer menyimpan data pada disk menggunakan file, yang terstruktur dengan cara tertentu agar memungkinkan untuk mengakses dengan cepat, keandalan yang lebih tinggi, dan untuk memaksimalkan penggunaan ruang yang tersedia pada disk. Cara khusus di mana file tersebut disimpan pada disk yang disebut sistem file, dan memungkinkan file untuk memiliki nama dan atribut. Hal ini juga memungkinkan mereka untuk disimpan dalam hirarki direktori atau folder yang diatur dalam struktur direktori.

Sistem operasi awal umumnya mendukung satu jenis disk drive dan hanya satu jenis sistem file. File System awal terbatas dalam kapasitas mereka, kecepatan, dan dalam jenis nama file dan struktur direktori bisa mereka gunakan. Keterbatasan ini sering tercermin keterbatasan dalam sistem operasi yang dirancang, sehingga sangat sulit bagi sebuah sistem operasi untuk mendukung lebih dari satu sistem file.

Sementara banyak sistem operasi sederhana mendukung berbagai pilihan terbatas untuk mengakses sistem penyimpanan, sistem operasi seperti UNIX dan Linux mendukung teknologi yang dikenal sebagai Virtual File System atau VFS. Sebuah sistem operasi seperti UNIX mendukung beragam perangkat penyimpanan, terlepas dari desain atau File System, yang memungkinkan mereka untuk dapat diakses melalui Application Programming Interface (API) yang sama. Hal ini membuatnya tidak perlu untuk program untuk memiliki pengetahuan tentang perangkat mereka mengakses. Sebuah VFS memungkinkan sistem operasi untuk menyediakan program dengan akses jumlah perangkat yang tidak terbatas dengan berbagai file sistem terinstall yang tidak terbatas pada mereka, melalui penggunaan driver perangkat tertentu dan driver sistem file.

Sebuah perangkat penyimpanan yang tersambung, seperti hard drive, diakses melalui device driver yang sama. Driver driver memahami cara berkomunikasi dengan drive dan mampu menterjemahkan bahasa yang menjadi bahasa standar yang digunakan oleh sistem operasi untuk mengakses semua disk drive yang sama. Pada UNIX, ini adalah bahasa dari block device.

Ketika kernel memiliki driver driver yang tepat , maka ia dapat mengakses isi disk drive dalam format mentah, yang mungkin berisi satu atau lebih File System. Sebuah driver sistem file digunakan untuk menterjemahkan perintah yang digunakan untuk mengakses setiap sistem file tertentu ke dalam satu set standar perintah yang sistem operasi dapat digunakan untuk berbicara dengan semua file system. Program kemudian dapat menangani sistem file ini berdasarkan nama file, dan direktori / folder, yang berada dalam struktur hirarkis. Mereka dapat membuat, menghapus, membuka, dan menutup file, serta mengumpulkan berbagai informasi tentang mereka, termasuk hak akses, ukuran, ruang bebas, dan tanggal pembuatan dan tanggal modifikasi.

Berbagai perbedaan antara File System membuat dukungan untuk semua File System menjadi sulit. Karakter yang diperbolehkan dalam nama file, huruf besar / huruf kecil, dan adanya berbagai jenis atribut berkas membuat implementasi satu antarmuka untuk setiap file system menjadi tugas yang menyulitkan. Sistem operasi cenderung untuk merekomendasikan menggunakan (dan begitu mendukung native) file sistem yang dirancang khusus untuk mereka, misalnya, NTFS di Windows dan ext3 dan ReiserFS di Linux. Namun, dalam prakteknya, ada pihak ketiga yang menyediakan driver untuk memberikan dukungan untuk sistem file yang paling banyak digunakan di sebagian besar sistem operasi (misalnya, NTFS tersedia di Linux melalui NTFS-, dan ext2 / 3 dan ReiserFS tersedia di Windows melalui perangkat lunak pihak ketiga).

Dukungan untuk sistem file sangat bervariasi di antara sistem operasi modern, meskipun ada beberapa file system yang sama di hampir semua sistem operasi termasuk dukungan dan driver. Sistem operasi bervariasi pada dukungan file sistem dan pada format disk tempat mereka dapat diinstal. Pada Windows, setiap sistem berkas biasanya terbatas dalam aplikasi untuk media tertentu, misalnya, CD harus menggunakan ISO 9660 atau UDF, dan pada Windows Vista, NTFS adalah file system dimana sistem operasi dapat diinstal. Berbeda dengan Windows, sangat mungkin untuk menginstal Linux ke berbagai jenis file sistem . Tidak seperti sistem operasi lain, Linux dan UNIX membiarkan sistem berkas untuk digunakan terlepas dari media yang disimpan dalam, apakah itu hard drive, disk (CD, DVD ...), USB flash drive, atau bahkan berada dalam file terletak di sistem berkas lain.

Device driver Device Driver adalah perangkat lunak spesifik pada komputer yang dikembangkan untuk memungkinkan interaksi dengan perangkat keras. Biasanya ini merupakan sebuah antarmuka untuk berkomunikasi dengan perangkat, melalui bus komputer tertentu atau subsistem komunikasi yang terhubung ke hardware , memberikan perintah untuk dan / atau menerima data dari perangkat, dan di ujung lain, interface yang diperlukan untuk operasi sistem dan aplikasi perangkat lunak. Ini adalah program komputer khusus yang tergantung hardware yang juga untuk sistem operasi yang spesifik yang memungkinkan program lain, biasanya sistem operasi atau aplikasi / perangkat lunak / program komputer yang berjalan dibawah kernel sistem operasi, untuk berinteraksi secara transparan dengan perangkat keras, dan biasanya menyediakan penanganan interupsi yang diperlukan yang diperlukan untuk hardware yang asinkroin dan time-dependent.

Tujuan utama desain device driver adalah abstraksi. Setiap model perangkat keras (bahkan dalam kelas perangkat yang sama ) berbeda. Model-model baru juga dikeluarkan oleh produsen yang memberikan performa yang lebih handal / lebih baik dan model-model lebih baru sering berbeda cara mengontrolnya . Komputer dan sistem operasi tidak dapat diharapkan untuk mengetahui bagaimana untuk mengontrol setiap perangkat, baik sekarang maupun di masa depan. Untuk mengatasi masalah ini, sistem operasi pada dasarnya akan mendikte bagaimana cara setiap jenis perangkat harus dikontrol. Fungsi dari device driver untuk menterjemahkan amanat dari sistem operasi menjadi fungsi panggilan untuk perangkat tertentu. Dalam teori seharusnya perangkat baru, yang dikendalikan dengan cara baru, harus berfungsi dengan benar jika driver yang cocok tersedia. Driver baru ini akan memastikan bahwa perangkat yang baru muncul beroperasi seperti biasa dilihat dari sudut pandang sistem operasi.

Pada versi Windows sebelum Vista dan versi Linux sebelum 2.6, semua eksekusi driver sifatnya adalah co-operative, yang berarti bahwa jika driver memasuki infinite loop akan mem-freeze sistem. Revisi lebih baru dari sistem operasi menggabungkan preemption kernel, dimana kernel menginterupsi driver untuk memberikan tugas, dan kemudian melepaskan diri dari proses sampai menerima tanggapan dari device driver, atau memberi lebih banyak tugas yang dapat dilakukan. Networking Saat ini sebagian besar sistem operasi mendukung berbagai protokol jaringan, perangkat keras, dan aplikasi untuk menggunakannya. Ini berarti bahwa komputer yang menjalankan sistem operasi berbeda dapat berpartisipasi dalam jaringan komputer untuk berbagi sumber daya seperti komputasi, file, printer, dan scanner menggunakan koneksi kabel atau wireless. Jaringan komputer pada dasarnya dapat memungkinkan sistem operasi komputer untuk mengakses sumber daya dari komputer remote untuk mendukung fungsi yang sama seperti jika sumber daya tersebut dihubungkan langsung ke komputer lokal. Ini mencakup segala sesuatu dari komunikasi sederhana, hingga menggunakan file system jaringan atau bahkan sharing grafis komputer lain atau perangkat keras suara. Beberapa layanan jaringan mengizinkan sumber daya dari komputer yang akan diakses transparan, seperti SSH yang memungkinkan pengguna jaringan akses langsung ke antarmuka baris text di komputer remote.

Jaringan client / server memungkinkan sebuah program pada komputer, yang disebut klien, untuk berhubungan melalui jaringan ke komputer lain, yang disebut server. Server menawarkan (atau host) berbagai layanan untuk komputer jaringan lainnya dan pengguna. Layanan ini biasanya diberikan melalui port atau nomor jalur akses selain alamat jaringan dari server. Setiap nomor port biasanya dikaitkan dengan satu program / aplikasi, yang bertanggung jawab untuk menangani permintaan untuk port tersebut. Daemon, adalah program yang jalan di server, pada saatnya dapat mengakses sumber daya perangkat keras lokal komputer yang dengan melewatkan permintaan ke kernel sistem operasi.

Banyak sistem operasi mendukung satu atau lebih protokol jaringan milik vendor maupun yang terbuka / open, misalnya, SNA untuk IBM sistem, DECnet pada sistem dari Digital Equipment Corporation, dan Microsoft-spesifik protokol (SMB) pada Windows. Protokol khusus untuk tugas- tugas tertentu mungkin juga didukung seperti NFS untuk akses file. Protokol seperti esound, atau esd dapat dengan mudah diperluas melalui jaringan untuk menyediakan suara dari aplikasi lokal, pada hardware sound sistem remote.

Internet adalah salah satu jenis protokol jaringan yang mempunyai standard terbuka yang dapat dijalankan di berbagai sistem operasi. Standard Internet dibuat secara bersama / terbuka oleh banyak pihak, dan dapat di akses melalui web dengan kata kunci "Request For Comment" (RFC). Untuk lebih jelas tentang Networking dan Jaringan komputer, sangat di sarankan untuk membaca buku “Internet – TCP/IP” yang di terbitkan oleh Andi Publihser di Jogjakarta.

Security Sebuah komputer yang aman tergantung pada sejumlah teknologi bekerja dengan baik. Sebuah sistem operasi modern menyediakan akses ke sejumlah sumber daya yang tersedia untuk perangkat lunak yang berjalan pada sistem, dan perangkat eksternal seperti jaringan melalui kernel.

Sistem operasi harus mampu membedakan antara permintaan yang harus diperbolehkan untuk diproses, dan lain-lain yang tidak harus diproses. Sementara beberapa sistem mungkin hanya membedakan antara "previleged / istimewa" dan "non-privileged", sistem umumnya memiliki bentuk identitas pemohon, seperti nama pengguna. Untuk menentukan identitas mungkin ada proses authentikasi. Seringkali nama pengguna harus dikutip, dan username masing-masing mungkin punya password. Metode authentikasi lain , seperti kartu magnetik atau data biometric, mungkin digunakan sebagai gantinya. Dalam beberapa kasus, khususnya koneksi dari jaringan, sumber daya dapat diakses tanpa authentikasi sama sekali (seperti membaca file melalui sharing jaringan). Juga dicakup oleh konsep identitas pemohon adalah authorisasi; layanan tertentu dan sumber daya diakses oleh pemohon sekali login ke sistem terikat ke salah satu akun pengguna pemohon atau ke grup yang di konfigurasi terkait ke account pengguna tersebut.

Selain model keamanan yang berbentuk mengijinkan / melarang , sebuah sistem dengan tingkat keamanan yang tinggi juga akan menawarkan pilihan audit. Ini akan memungkinkan pelacakan permintaan akses ke sumber daya (seperti, "siapa yang telah membaca file ini?"). Keamanan internal, atau keamanan dari program yang sedang berjalan hanya mungkin jika semua permintaan yang mungkin berbahaya harus dilakukan melalui interupsi ke kernel sistem operasi. Jika program langsung dapat mengakses hardware dan sumber daya, mereka tidak bisa diamankan.

Keamanan eksternal melibatkan permintaan dari luar komputer, seperti login di konsol atau beberapa jenis koneksi jaringan. Permintaan eksternal sering melewati device driver ke kernel sistem operasi, di mana mereka dapat diteruskan ke aplikasi, maupun dilakukan secara langsung. Keamanan sistem operasi telah lama menjadi perhatian karena data sangat sensitif yang ada di komputer, baik yang bersifat komersial dan militer. Pemerintah Amerika Serikat Departemen Pertahanan (DoD) mengusulkan Trusted Computer Kriteria Evaluasi Sistem (TCSEC) yang merupakan standar yang menetapkan persyaratan dasar untuk menilai efektivitas keamanan. Hal ini menjadi sangat penting bagi para pembuat sistem operasi, karena TCSEC ini digunakan untuk mengevaluasi, mengklasifikasi dan memilih sistem operasi yang dipercaya untuk dipertimbangkan untuk penyimpanan, pengolahan dan pengambilan informasi sensitif atau rahasia.

Layanan jaringan meliputi banyak hal seperti file sharing, layanan printing, email, situs web, dan protokol transfer file (FTP), sebagian besar yang dapat membahayakan keamanan. Di garis depan keamanan perangkat keras yang dikenal sebagai firewall maupun intrusion detection / prevention systems. Pada tingkat sistem operasi, ada sejumlah firewall perangkat lunak yang tersedia, serta intrusion detection / prevention system. Sebagian besar sistem operasi modern memasukan perangkat lunak firewall , yang diaktifkan secara default. Sebuah perangkat lunak firewall dapat dikonfigurasi untuk mengizinkan atau menolak lalu lintas jaringan ke atau dari suatu layanan atau aplikasi yang berjalan pada sistem operasi. Oleh karena itu, seseorang dapat menginstal dan menjalankan layanan yang tidak aman, seperti Telnet maupun FTP, dan tidak harus terancam oleh suatu pelanggaran keamanan karena firewall akan menolak semua lalu lintas mencoba untuk terhubung ke layanan pada port tersebut.

Strategi alternatif adalah sistem operasi tidak menjalankan program pengguna sebagai native code, melainkan mengemulasi prosesor atau menyediakan host untuk sistem berbasis code seperti Java. Keamanan internal sangat relevan untuk sistem multi-user, yang memungkinkan setiap pengguna sistem untuk memiliki file pribadi yang mana pengguna lain tidak bisa mengutak-atik atau membaca. Keamanan internal juga penting jika audit akan digunakan, karena program berpotensi dapat melewati sistem operasi, termasuk melewati audit. User interface

Setiap komputer yang akan dioperasikan oleh seorang individu memerlukan antarmuka pengguna. Antarmuka pengguna biasanya disebut sebagai shell dan penting jika akan mendukung interaksi dengan manusia . User interface melihat pada struktur direktori dan layanan permintaan dari sistem operasi yang akan memperoleh data dari perangkat keras input, seperti card reader, keyboard, mouse, dan permintaan layanan sistem operasi untuk menampilkan prompt, pesan status, dan pada perangkat hardware output, seperti monitor video atau printer. Dua bentuk yang paling umum dari antarmuka pengguna secara historis command line interface (CLI), di mana perintah komputer mengetik baris demi baris, dan antarmuka grafis (GUI) yang menampilkan tampilan visual. Sebagian besar sistem komputer modern mendukung antarmuka grafis (GUI) , dan sering memasukan GUI menjadi bagian dari sistem operasi tersebut. Dalam beberapa sistem komputer, seperti implementasi semula dari Mac OS, GUI terintegrasi ke dalam kernel.

Secara teknis antarmuka grafis (GUI) bukan merupakan layanan sistem operasi, menggabungkan dukungan untuk sebuah GUI ke kernel sistem operasi dapat membuka kemungkinan agar GUI untuk lebih responsif dengan mengurangi jumlah konteks switch yang diperlukan GUI untuk menjalankan fungsi tampilannya. Beberapa sistem operasi bersifat modular, memisahkan subsistem grafis dari kernel dan sistem operasi. Pada 1980-an UNIX, VMS dan banyak lainnya membangun sistem operasi dengan cara ini. Linux dan Mac OS X juga dibangun dengan cara ini. Rilis Modern Microsoft Windows seperti Windows Vista menerapkan subsistem grafis sebagian besar di user- space, namun subroutine menggambar grafis dalam versi antara Windows NT 4.0 dan Windows Server 2003 ada sebagian besar dalam kernel. Windows 9x memiliki perbedaan yang sangat sedikit antara interface dan kernel.

Banyak sistem operasi komputer memungkinkan pengguna untuk menginstal atau membuat antarmuka pengguna yang mereka inginkan. The X Window System dalam hubungannya dengan GNOME maupun KDE Plasma Desktop adalah setup yang umum ditemukan pada kebanyakan sistem GUI di Unix dan GUI di Unix-like (BSD, Linux, Solaris). Sejumlah pengganti shell Windows telah dirilis untuk Microsoft Windows, yang menawarkan alternatif untuk shell Windows , tapi shell itu sendiri tidak dapat dipisahkan dari Windows.

Banyak GUI di Unix berkembang dari waktu ke waktu, sebagian besar berasal dari X11. Persaingan di antara berbagai vendor Unix (HP, IBM, Sun) menyebabkan fragmentasi yang lebar, upaya untuk membakukan pada 1990-an menuju COSE dan CDE gagal karena berbagai alasan, dan akhirnya dikalahkan dengan di-adopsinya GNOME dan K Desktop Environment. Sebelum adanya toolkit & lingkungan desktop berbasis free software, Motif digunakan sebagai toolkit / desktop (yang merupakan dasar bagi pengembangan CDE). Graphical User Interface berkembang dari waktu ke waktu. Sebagai contoh, Windows telah mengubah antarmuka pengguna nyaris setiap kali versi baru dari Windows keluar, dan di samping itu, Mac OS GUI berubah secara dramatis dengan pengenalan Mac OS X pada tahun 1999.

Real-time Operating System Sebuah sistem operasi real-time RTOS adalah sistem operasi multitasking yang ditujukan untuk aplikasi dengan tenggat waktu tetap (komputasi real-time). Aplikasi ini mencakup beberapa sistem embedded kecil, pengendal mesin mobil , robot industri, pesawat ruang angkasa, kontrol industri, dan beberapa sistem komputasi berskala besar.

Sebuah contoh awal dari sebuah sistem operasi komputasi real-time berskala besar adalah fasilitas pemrosesan transaksi yang dikembangkan oleh American Airlines dan IBM untuk Sistem Reservasi Sabre Airline. Embedded system yang memiliki tenggat waktu tetap menggunakan sistem operasi komputasi real-time seperti VxWorks, PikeOS, , QNX, MontaVista Linux dan RTLinux. OS juga memiliki kernel RTOS (EKA2) dimulai dengan versi 8.0b.

Beberapa embedded sistem menggunakan sistem operasi seperti Palm OS, BSD, dan Linux, meskipun sistem operasi tersebut tidak mendukung komputasi real-time.

Pengembangan Sistem Operasi sebagai Hobby Pengembangan sistem operasi merupakan salah satu kegiatan yang paling rumit yang akan melibatkan penggemar kegiatan komputasi. Sebuah sistem operasi dapat diklasifikasikan sebagai sistem operasi hobi jika source code-nya tidak secara langsung di turunkan dari sistem operasi yang ada, dan memiliki beberapa pengguna dan pengembang yang aktif.

Dalam beberapa kasus, pengembangan sistem operasi hobi untuk mendukung perangkat komputasi "homebrew" , misalnya, satu board komputersederhana menggunakan mikroprosesor 6502. Atau, pengembangan untuk arsitektur yang mungkin sudah digunakan secara luas. Pengembangan sistem operasi mungkin saja berasal dari konsep-konsep yang sama sekali baru, maupun bisa digantikan dengan pemodelan sistem operasi yang ada. Dalam kedua kasus, si hobbyist mungkin saja jadi pengembang sendiri, maupun berinteraksi dengan sebuah kelompok kecil dan kadang-kadang sekumpulan individu yang tidak terstruktur yang memiliki ketertarikan yang sama.

Contoh dari sistem operasi hobby termasuk ReactOS dan Syllable.

Keanekaragaman Sistem Operasi dan portabilitas Aplikasi perangkat lunak umumnya ditulis untuk digunakan pada sistem operasi tertentu, dan kadang-kadang bahkan untuk hardware tertentu. Ketika porting aplikasi untuk berjalan di OS lain, fungsionalitas yang dibutuhkan oleh aplikasi yang dapat diimplementasikan secara berbeda oleh OS itu (nama-nama fungsi, makna argumen, dll) membutuhkan aplikasi yang akan disesuaikan, diubah, atau dipertahankan.

Biaya dalam mendukung keragaman sistem operasi dapat dihindari dengan cara menulis aplikasi pada platform perangkat lunak seperti Java atau Qt. Abstraksi ini yang telah menanggung beban adaptasi terhadap sstem operasi tertentu dan sistem library-nya.

Pendekatan lain adalah bagi vendor sistem operasi untuk mengadopsi standar. Misalnya, POSIX dan lapisan abstraksi OS agar memberikan kesamaan yang mengurangi biaya porting. Referensi • http://en.wikipedia.org/wiki/Operating_system • http://www.mui.or.id/konten/fatwa-mui/fatwa-tentang-hak-kekayaan-intelektual - Haram Membajak Software! • http://www.dsm.fordham.edu/~mathai/linux.html BAB 2: LINUX: INSTALASI, CLI & REPOSITORY

Pada saat buku Sistem Operasi ini dibuat, sebagian pembaca kemungkinan tidak familiar dengan Linux. Pada kesempatan ini akan di jelaskan keterampilan dan pengetahuan minimal agar dapat dengan mudah mengikuti pembahasan yang dilakukan dalam buku ini. Pada dasarnya ada tiga (3) hal yang perlu dikuasai agar kita dapat mengikuti penjelasan buku ini dengan baik, yaitu:

• Command Line Interface (CLI), kita akan banyak sekali menggunakan Command Line Intgerface dalam mengexplorasi Sistem Operasi. • Instalasi Linux, khususnya Ubuntu. • Membuat Sendiri Repository Lokal di Harddisk. Ini dibutuhkan agar proses instalasi aplikasi di Linux dapat dilakukan tanpa perlu sambungan ke Internet.

Instalasi Linux

Skema Partisi untuk Sistem Operasi Linux

Apakah Partisi? Partisi adalah pembagian dalam format hard disk. Ini adalah pembagian secara logic - bukan secara fisik , sehingga Anda dapat mengedit dan memanipulasi partisi untuk berbagai tujuan. Bayangkan membagi disk menjadi dua bagian yang berbeda konfigurasi. Partisi benar-benar berguna karena mereka bertindak sebagai bak pasir. Jika Anda memiliki drive 1 TB dipartisi menjadi partisi GB 250 dan 750 GB partisi, apa yang kita lakukan di partisi yang satu tidak akan mempengaruhi yang lain, dan sebaliknya. Kita dapat berbagi salah satu partisi pada jaringan dan tidak pernah khawatir tentang orang-orang mengakses informasi di partisi yang lain. Satu partisi bisa berisi Windows yang diinstal, penuh dengan virus dan trojan. Yang lain bisa menjalankan Linux yang sudah sangat tua yang penuh dengan lubang-lubang security. Kerdua-nya tidak akan saling mengganggu, kecuali jika kita membuat keduanya mati secara fisik.

Hal lain yang berguna adalah bahwa kita dapat memiliki beberapa partisi, masing-masing diformat dengan sistem file yang berbeda. File system adalah format disk yang dimasukan ke dalam tabel yang dapat di baca, ditafsirkan, dan di tulis oleh sistem operasi. Kita hanya memiliki satu hard drive? Tidak apa-apa, karena kita dapat menginstal beberapa sistem operasi di satu disk tersebut tanpa perlu punya disk lain secara fisik.

Sementara ada banyak sekali jenis file sistem, hanya ada tiga jenis partisi: primary, extended, dan logical. Setiap hard disk yang diberikan hanya dapat memiliki maksimal empat partisi primer. Keterbatasan ini disebabkan keterbatasan dari Master Boot Record yang memberitahu komputer akan partisi dapat di boot, oleh karenanya biasanya partisi primer disediakan untuk sistem operasi. Tapi bagaimana kalau kita ingin lebih dari empat? Di situlah partisi extended mulai berperan. Ini berfungsi sebagai wadah untuk sejumlah kecil, partisi logical. Anda dapat membuat sebanyak yang kita suka di sana, serta membuat tempat / partisi non-OS / data.

Jika partisi extended yang begitu hebat, mengapa kita tidak menggunakan itu saja? Itu karena kita tidak bisa langsung boot dari sebuah partisi extended. Memang ada banyak cara untuk mengatasi hal ini, tetapi hal terbaik yang perlu kita lakukan adalah untukc merencanakan dengan baik terlebih dahulu dengan partisi primer. Di samping itu, partisi diberi nomor oleh sistem tergantung pada jenisnya. Pertama, mesin akan memberi nomor pertama-tama pada semua partisi primer, dan kemudian partisi logical. Hal ini dapat menyebabkan perubahan huruf drive jika Anda beralih antara OS atau menambah atau menghapus partisi kemudian.

Mount point di Linux Pada Windows, berbagai hal cukup jelas dan sederhana: dia hidup di disk anda, biasanya di satu partisi saja, titik. Jika kita punya disk lain, dan menggunakan file sistem yang kompatibel, maka disk tambahan tersebut biasanya akan di baca. Jika tidak, biasanya di ignore, atau di tawarkan untuk di reformat. Linux - maupun sesuatu yang mirip dengan Unix, biasanya tidak seperti itu cara bekerjanya.

Cara bekerja Linux, dia akan meletakan semua menjadi sebuah pohon (tree). Jika kita memiliki partisi atau disk lain, dia akan di "mount" sebagai salah satu folder di cabang spesifik, biasanya di /media atau /mnt. Directory tempat menempelkan partisi biasanya di sebut "mount point". Metoda ini bekerja dengan baik di struktur pohon (tree) dari Linux, dan kita dapat menempelkan (mount) partisi sebagai folder di hampir semua directory di bawah tree di Linux. Di Windows, hal ini tidak mudah dilakukan, partisi baru akan muncul sebagai drive yang berbeda. Di samping itu, Linux dapat bekerja dengan lebih banyak jenis file system di bandingkan dengan Windows.

Ingat bahwa hanya ada empat partisi primary? Jika kita ingin melakukan boot ke 145 sistem operasi, kita harus setup sebuah primary partisi untuk /boot, tempat menyimpan boot-loader, seperti GRUB atau Lilo, yang akan menangani fungsi awal sistem operasi dan kemudian boot ke partisi extended.

Pengenalan Partisi di Linux WARNING: • Jika kita ingin menggunakan partisi logical, maka max. jumlah partisi primary yang dapat digunakan hanya 3. TIDAK BISA LEBIH DARI 3. • Partisi root (/) dari Linux tidak masalah berada di partisi logical.

Untuk melihat harddisk dan / atau partisi di Linux dapat menggunakan perintah : sudo su fdisk -l

Contoh hasil

Disk /dev/sda: 500.1 GB, 500107862016 bytes 255 heads, 63 sectors/track, 60801 cylinders, total 976773168 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x0009b6ff

Device Boot Start End Blocks Id System /dev/sda1 * 63 208844 104391 83 Linux /dev/sda2 208896 33816317 16803711 83 Linux /dev/sda3 975209760 976768064 779152+ 82 Linux swap / Solaris /dev/sda4 33818622 975209759 470695569 5 Extended /dev/sda5 104117328 143187344 19535008+ 83 Linux /dev/sda6 143187408 975209759 416011176 83 Linux /dev/sda7 33818624 72878079 19529728 83 Linux /dev/sda8 72880128 104116223 15618048 83 Linux Partition table entries are not in disk order

Disk /dev/sdb: 2000.4 GB, 2000365289472 bytes 255 heads, 63 sectors/track, 243197 cylinders, total 3906963456 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00021365

Device Boot Start End Blocks Id System /dev/sdb1 2048 3906963455 1953480704 83 Linux

Tampak pada hasil di atas

• ada 2 harddisk, dikenali sebagai /dev/sda (500G) dan /dev/sdb (2TB) • /dev/sda di bagi dalam 8 partisi, 3 primary, 1 extended, 4 logical. • /dev/sdb di bagi hanya dalam 1 partisi

Pengenalan harddisk secara umum

• harddisk SATA akan di kenali sebagai /dev/sdX • harddisk IDE akan dikenali sebagai /dev/hdX • penomoran partisi pada sebuah harddisk

/dev/sdX1 - primary /dev/sdX2 - primary /dev/sdX3 - primary /dev/sdX4 - primary atau extended, jika kita ingin menggunakan partisi logical.

• Penomoran partisi logical

/dev/sdX5 - logical /dev/sdX6 - logical /dev/sdXdst ..

Untuk bisa menggunakan partisi logical, max. partisi primary hanya TIGA (3), tidak bisa lebih dari itu.

Skema Partisi Linux Yang Perlu Kita Gunakan?

Panduan Secara Umum • Masing-masing sistem operasi harus berada pada partisi yang berbeda. Ini perlu di perhatikan kalau kita ingin membuat satu harddisk dengan banyak sistem operasi. • Partisi swap bisa di share oleh banyak sistem operasi. Jadi walaupun ada banyak sistem operasi, swap bisa satu partisi saja.

Skema Minimal Skema partisi minimal di komputer Linux adalah • partisi swap 1. Kalau kita tidak melakukan suspend / hibernate, 500MB lebih dari cukup. 2. Kalau kita ingin melakukan suspend, ada baiknya 1.5-2 x RAM. • partisi root atau / - sisa dari harddisk.

Skema Standard Skema partisi standard yang sering digunakan • partisi swap - 500MB • partisi / - 20G • partisi /home - sisa harddisk.

Skema Tukang Ngoprek Jika kita suka ngoprek mungkin kita bisa suka-suka membuat partisi, dan akan sangat bermain dengan, misalnya, perintah

mount /dev/sdXn /mnt/namafoldermount mount ­­bind /mnt/namafoldermount/folderlagi /mnt/folderkefolder

Contoh partisi komputer yang sering di oprek

• partisi swap - 500MB • partisi / OS1 - 20GB (backtrack) • partisi / OS2 - 20GB (Ubuntu) • partisi / OS3 - 20GB (server) • partisi / OS4 - 20GB (Blankon) • partisi data - sisa harddisk

Biasanya di partisi data di simpan repository & berbagai source code. Sekedar info saja, kebutuhan harddisk untuk satu (1) versi repository sekitar 50-70GB

PERHATIKAN: masing-masing sistem operasi di letakan pada partisi yang berbeda.

Instalasi Sistem Operasi

Download file iso Download file iso Ubuntu melalui situs seperti

• http://www.ubuntu.com • http://kambing.ui.ac.id/iso/ubuntu/cdimage/releases/

Membuat LiveCD Untuk burn file iso ke CD pastikan bahwa file iso di burn sebagai image bukan data.

Membuat LiveUSB Misalkan USB berada pada /dev/sdb. Pembuatan LiveUSB dapat dilakukan menggunakan perintah

dd bs=1M if=file.iso of=/dev/sdb

Untuk melihat USB dikenali sebagai device apa, dapat menggunakan perintah fdisk -l

Sebaiknya sebelum proses pembuatan LiveUSB dilakukan, USB di umount dulu.

Menggunakan CD / DVD? Sangat mudah untuk menginstalasi Ubuntu dari CD / DVD, yang perlu kita lakukan hanya:

• Masukan CD / DVD Ubuntu ke DVD-drive. • Restart komputer. Kita akan melihat welcome screen untuk mulai proses instalasi.

Menggunakan USB Drive? Komputer yang baru dapat di boot dari USB. Kita akan melihat welcome screen yang menanyakan bahasa yang akan digunakan dan memberikan pilihan pada kita untuk menginstall Ubuntu atau mencobanya dari CD.

Jika komputer kita tidak dapat secara automatis boot dari USB, kita dapat menekan tombol F12 untuk mengeluarkan menu boot, tapi jangan terlalu lama menekannya - karena akan menyebabkan error message.

Persiapan Instalasi Ubuntu Persiapan yang perlu dilakukan:

• Sangat di sarankan komputer di sambungkan ke PLN. Ini juga berlaku untuk laptop agar ada jaminan listrik. • Pastikan harddisk cukup untuk instalasi Ubuntu. • Ada pilihan untuk download updates saat instalasi. Jika ini dipilih, kita perlu menyambungkan komputer ke Internet. Ini tidak terlalu di sarankan untuk kita yang berada di Indonesia karena akan mengambil bandwidth yang lumayan. Set up wireless Jika kita perlu mendownload update dan tidak tersambung ke Internet, kita biasanya ditanyakan untuk memilih jaringan wireless, jika tersedia. Kita dapat menset jaringan wireless jika di perlukan. Alokasi disk Gunakan cekbox untuk memilih apakah

• Kita akan menginstalasi Ubuntu sebelah sistem operasi lain. • Delete sistem operasi yang ada dan menggantinya dengan Ubuntu. • Untuk mereka yang mahir, dapat memilih "Something else".

Mulai Instalasi Proses instalasi akan dimulai saat kita meng-klik tombol "Install Now" Ubuntu membutuhkan sekitar 4.5GB , tambahkan beberapa GB untuk tempat penyimpanan file. Bagi mereka yang suka ngoprek ada baiknya menggunakan partisi sekitar 20GB agar leluasa. Tapi khusus untuk mereka yang ingin mengembangkan ROM android akan membutuhkan harddisk yang bebas sebesar 100+ Gbyte. Pilih Lokasi Jika kita tersambung ke Internet, ini biasanya dilakukan secara automatis. Pastikan lokasi kita benar dan klik "Forward" untuk melanjutkan.

Jika kita tidak yakin dengan time zone, ketik nama kita besar dekat dengan kita atau klik pada peta.

Pilih Layout Keyboard Pilih bahasa dan keyboard. Pastikan kita memilih English (US), karena keyboard yang beredar di Indonesia adalah keyboard English (US). Masukan login dan password

Selesai Instalasi Ubuntu Yang perlu kita lakukan tinggal me-restart komputer dan menikmati Ubuntu! Beberapa Perintah Command Line (CLI) untuk Survival Berikut ini adalah beberapa perintah Command Line Interface (CLI) yang mungkin akan dibutuhkan untuk bisa survive dalam mengoperasikan Linux CLI. super user Dalam pekerjaan mengexplorasi sistem operasi, seringkali kita harus menjadi superuser. Beberapa perintah penting yang digunakan adalah

sudo su perintah untuk menjadi superuser. Ini banyak di perlukan kalau kita ingin melakukan hal-hal yang hanya bisa dilakukan oleh administrator mesin.

cat namafile perintah yang sering digunakan untuk melihat parameter kernel, misalnya "cat /proc/cpuinfo"

Perintah di file sistem Beberapa perintah yang bermanfaat dalam bekerja pada file system di Linux adalah

ls - melihat isi directory / folder cd /nama/directory/ - pindah ke folder /nama/directory cp file1 file2 - copy file1 ke file2 more namafile - melihat isi sebuah file. less namafile - melihat isi file di bagian akhir-nya saja. nano namafile - mengedit file namafile.

Perintah untuk bekerja dengan repository

apt-get update - update "catalog" repository. apt-get install namaaplikasi - menginstalasi sebuah aplikasi apt install namaaplikasi – menginstalasi sebuah aplikasi, Ubuntu 16.04 ke atas.

Beberapa folder / file penting

/etc - lokasi file konfigurasi linux. /etc/apt/sources.list - file tempat informasi repository yang akan digunakan.

Mempelajari CLI Ada baiknya lihat (menggunakan ls) isi berbagai perintah yang ada di folder ls /bin ls /sbin ls /usr/bin ls /usr/sbin untuk mengetahui fungsi masing-masing perintah, ketik, misalnya perintahcli -h perintahcli --help man perintahcli contoh kita ingin mengetahui lebih lanjut tentang perintah ps, kita dapat menulis ps -h ps --help man ps

Membuat Repository Ubuntu Lokal menggunakan debmirror Repository adalah istilah dalam Linux yang kira-kira berarti tempat penyimpanan aplikasi Linux. Berbeda dengan Windows atau sistem operasi pada umumnya, di Linux sebagian besar aplikasi telah tertata rapih di repository dan kita dapat dengan mudah menggunakannya jika kita dapat mengakses repository tersebut.

Masalahnya, sebagian besar repository berada di Internet. Jika kita tidak mempunyai bandwidth yang cukup besar maka akan susah bagi kita untuk mengkutak katik Linux tersebut.

Pada kesempatan ini, akan di jelaskan cara untuk membuat repository agar berada di harddisk laptop kita. Dengan cara ini, maka bagi mereka yang tidak mempunyai akses ke Internet dapat tetap mengeksplorasi dengan menggunakan repository yang ada di harddisk.

Berikut adalah langkah membuat repository Ubuntu dari server seperti,

• id.archive.ubuntu.com • dl2.foss-id.web.id atau 125.160.17.22 • kambing.ui.ac.id atau 152.118.24.30 ke Server lokal di LAN .

Beberapa Persiapan Yang Perlu Dilakukan Kita perlu membuat mirrorkeyring untuk authentikasi repository. Langkah yang harus dilakukan adalah sebagai berikut:

mkdir /var/data mkdir /var/data/mirrorkeyring gpg --no-default-keyring --keyring /var/data/mirrorkeyring/trustedkeys.gpg –import / /usr/share/keyrings/ubuntu-archive-keyring.gpg

Install aplikasi debmirror & buat folder tempat repo

apt-get install debmirror mkdir /var/data mkdir /var/data/repository

Langkah Mendownload Repostory Menggunakan debmirror Mendownload repository dapat dilakukan menggunakan debmirror. Aplkasi debmirror dapat di instalasi menggunakan perintah

apt-get install debmirror

Contoh di bawah adalah untuk repository Ubuntu 32 bit. Bagi anda yang ingin mendownload repository 64 bit, yang perlu di ubah hanya paramter i386 menjadi arsitektur 64 bit, yaitu:

amd64

Atau jika ingin sekaligus dua arsitektur, bisa menggunakan parameter

i386,amd64

Selanjutnya kita dapat membuat script untuk download / mirror repository, beberapa langkap persiapan terakhir, asumsi dan bentuk script-nya adalah sebagai berikut,

Asumsi yang digunakan dalam menulis script adalah

folder repo : /var/data/repository/repo-16.04 server sumber : kambing.ui.ac.id atau 152.118.24.30 GNUPGHOME : /var/data/mirrorkeyring

Kita dapat membuat folder & script melalui perintah

mkdir /var/data/repository/repo-16.04 touch /usr/local/bin/mirrorbuild.16.04.sh chmod -Rf 777 /usr/local/bin/mirrorbuild* chown -Rf nobody.nogroup /usr/local/bin/mirrorbuild*

Edit file mirrorbuild

vi /usr/local/bin/mirrorbuild.16.04.sh atau

nano /usr/local/bin/mirrorbuild.16.04.sh

Masukan script berikut

#!/bin/bash export GNUPGHOME=/var/data/mirrorkeyring debmirror -a i386,amd64 --no-source -s main,restricted,universe,multiverse \ -h 152.118.24.30 \ -d xenial,xenial-backports,xenial-security,xenial-updates \ -r ubuntu --progress -e http /var/data/repository/repo-16.04/ Entah mengapa, debmirror tidak mendownload icons & components di masing2 folder, apa boleh buat untuk 16.04 ke atas kita perlu mendownload secara manual atau bisa menggunakan script tambahan berikut,

cd /var/data/repository/repo-16.04/dists/xenial/main/dep11 rm * wget http://kambing.ui.ac.id/ubuntu/dists/xenial/main/dep11/Components-amd64.yml.gz wget http://kambing.ui.ac.id/ubuntu/dists/xenial/main/dep11/Components-i386.yml.gz wget http://kambing.ui.ac.id/ubuntu/dists/xenial/main/dep11/icons-128x128.tar.gz wget http://kambing.ui.ac.id/ubuntu/dists/xenial/main/dep11/icons-64x64.tar.gz

cd /var/data/repository/repo-16.04/dists/xenial/main/i18n rm * wget http://kambing.ui.ac.id/ubuntu/dists/xenial/main/i18n/Translation-en.xz wget http://kambing.ui.ac.id/ubuntu/dists/xenial/main/i18n/Translation-en.gz cd /var/data/repository/repo-16.04/dists/xenial/multiverse/dep11 rm * wget http://kambing.ui.ac.id/ubuntu/dists/xenial/multiverse/dep11/Components-amd64.yml.gz wget http://kambing.ui.ac.id/ubuntu/dists/xenial/multiverse/dep11/Components-i386.yml.gz wget http://kambing.ui.ac.id/ubuntu/dists/xenial/multiverse/dep11/icons-128x128.tar.gz wget http://kambing.ui.ac.id/ubuntu/dists/xenial/multiverse/dep11/icons-64x64.tar.gz

cd /var/data/repository/repo-16.04/dists/xenial/multiverse/i18n rm * wget http://kambing.ui.ac.id/ubuntu/dists/xenial/multiverse/i18n/Translation-en.xz wget http://kambing.ui.ac.id/ubuntu/dists/xenial/multiverse/i18n/Translation-en.gz

cd /var/data/repository/repo-16.04/dists/xenial/universe/dep11 rm * wget http://kambing.ui.ac.id/ubuntu/dists/xenial/universe/dep11/Components-amd64.yml.gz wget http://kambing.ui.ac.id/ubuntu/dists/xenial/universe/dep11/Components-i386.yml.gz wget http://kambing.ui.ac.id/ubuntu/dists/xenial/universe/dep11/icons-128x128.tar.gz wget http://kambing.ui.ac.id/ubuntu/dists/xenial/universe/dep11/icons-64x64.tar.gz

cd /var/data/repository/repo-16.04/dists/xenial/universe/i18n rm * wget http://kambing.ui.ac.id/ubuntu/dists/xenial/universe/i18n/Translation-en.xz wget http://kambing.ui.ac.id/ubuntu/dists/xenial/universe/i18n/Translation-en.gz

cd /var/data/repository/repo-16.04/dists/xenial/restricted/dep11 rm * wget http://kambing.ui.ac.id/ubuntu/dists/xenial/restricted/dep11/Components-amd64.yml.gz wget http://kambing.ui.ac.id/ubuntu/dists/xenial/restricted/dep11/Components-i386.yml.gz wget http://kambing.ui.ac.id/ubuntu/dists/xenial/restricted/dep11/icons-128x128.tar.gz wget http://kambing.ui.ac.id/ubuntu/dists/xenial/restricted/dep11/icons-64x64.tar.gz

cd /var/data/repository/repo-16.04/dists/xenial/restricted/i18n rm * wget http://kambing.ui.ac.id/ubuntu/dists/xenial/restricted/i18n/Translation-en.xz wget http://kambing.ui.ac.id/ubuntu/dists/xenial/restricted/i18n/Translation-en.gz

Simpan script jika sudah selesai di edit semua-nya. Ubah ijin agar file mirrorbuild.sh & folder repo

chmod -Rf 777 /usr/local/bin/mirrorbuild.16.04.sh chown -Rf root.root /var/data/repository/repo-16.04 chmod -Rf 571 /var/data/repository/repo-16.04

Untuk mengcopy repository kita cukup menjalankan mirrorbuild.sh , dalam hal ini

mirrorbuild.16.04.sh

Jika kita ingin memperoleh repository untuk beberapa versi Ubuntu. Maka kita harus membuat beberapa fole mirrorbuild yang berbeda-beda parameter-nya, terutama yang akan kita ubah adalah

i386 atau amd64

Pastikan untuk setiap versi yang kita download di simpan pada folder yang berbeda. Daftar terbaru nama versi Ubuntu dapat dilihat dengan mudah misalnya di

• http://kambing.ui.ac.id/ubuntu/dists/ • http://id.archive.ubuntu.com/ubuntu/dists/ • http://archive.ubuntu.com/ubuntu/dists/ Referensi

• http://lms.onnocenter.or.id/wiki/index.php/Membuat_Repository_Ubuntu_Lokal_mengguna kan_debmirror#Cron_supaya_secara_periodik_di_update • http://lms.onnocenter.or.id/wiki/index.php/Linux:_CLI_untuk_Survival • http://lms.onnocenter.or.id/wiki/index.php/Linux:_Skema_Partisi_di_Linux • http://lms.onnocenter.or.id/wiki/index.php/Linux:_Instalasi_Sistem_Operasi • http://www.ubuntu.com/download/help/install-desktop-latest BAB 3: SHELL SCRIPTING

Dalam banyak situasi, kita berusaha untuk meng-automatisasi kerjaan yang sedang kita lakukan agar dapat di jalankan secara periodik / automatis. Proses automatisasi ini paling mudah jika kita dapat memprogram sistem operasi yang digunakan dan menjalankan program tersebut secara periodik. Cara yang paling sederhana adalah menggunakan shell script. Lebih detail tentang shell script akan di terangkan berikut ini.

Apa itu shell? shell adalah program (penterjemah perintah) yang menjembatani user dengan sistem operasi dalam hal ini kernel (inti sistem operasi), umumnya shell menyediakan prompt sebagai user interface, tempat dimana user mengetikkan perintah-perintah yang diinginkan baik berupa perintah internal shell (internal command), ataupun perintah eksekusi suatu file progam (eksternal command), selain itu shell memungkinkan user menyusun sekumpulan perintah pada sebuah atau beberapa file untuk dieksekusi sebagai program.

Macam-macam shell Tidak seperti sistem operasi lain yang hanya menyediakan satu atau 2 shell, sistem operasi dari keluarga unix misalnya linux sampai saat ini dilengkapi oleh banyak shell dengan kumpulan perintah yang sangat banyak, sehingga memungkinkan pemakai memilih shell mana yang paling baik untuk membantu menyelesaikan pekerjaannya, atau dapat pula berpindah-pindah dari shell yang satu ke shell yang lain dengan mudah, beberapa shell yang ada di linux antara lain:

• Bourne shell(sh), • C shell(csh), • Korn shell(ksh), • Bourne again shell(bash), • dsb.

Masing - masing shell mempunyai kelebihan dan kekurangan yang mungkin lebih didasarkan pada kebutuhan pemakai yang makin hari makin meningkat, untuk dokumentasi ini shell yang digunakan adalah bash shell dari GNU, yang merupakan pengembangan dari Bourne shell dan mengambil beberapa feature (keistimewaan) dari C shell serta Korn shell, Bash shell merupakan shell yang cukup banyak digunakan pemakai linux karena kemudahan serta banyaknya fasilitas perintah yang disediakan. versi bash shell yang saya gunakan adalah 4.3.42, ini dapat dilihat menggunakan perintah shell,

$ echo $BASH_VERSION akan keluar kira-kira sebagai berikut, 4.3.42(1)-release

Pemrograman Shell Yaitu menyusun atau mengelompokkan beberapa perintah shell (internal atupun eksternal command) menjadi kumpulan perintah yang melakukan tugas tertentu sesuai tujuan penyusunnya. Kelebihan shell di linux dibanding sistem operasi lain adalah bahwa shell di linux memungkinkan kita untuk menyusun serangkaian perintah seperti halnya bahasa pemrograman (interpreter language), melakukan proses I/O, menyeleksi kondisi, looping, membuat fungsi, dsb. adalah proses - proses yang umumnya dilakukan oleh suatu bahasa pemrograman, jadi dengan shell di linux kita dapat membuat program seperti halnya bahasa pemrograman, untuk pemrograman shell pemakai unix atau linux menyebutnya sebagai script shell.

Pengetahuan Dasar untuk Shell Scripting Sebelum mempelajari pemrograman Bash shell di linux sebaiknya anda telah mengetahui dan menggunakan perintah - perintah dasar shell baik itu internal command yang telah disediakan shell maupun eksternal command atau utility, beberapa perintah / command yang penting seperti

cd, pwd, times, alias, umask, exit, logout, fg, bg, ls, mkdir, rmdir, mv, cp, rm, clear, ... utilitas seperti

cat, cut, paste, chmod, lpr,... redirection (cara mengirim output ke file atau menerima input dari file), menggunakan operator redirect >, >>, <, <<, contohnya:

ls > data hasil ls dikirim ke file data, jika file belum ada akan dibuat tetapi jika sudah ada isinya akan ditimpa.

ls >> data hampir sama, bedanya jika file sudah ada maka isinya akan ditambah di akhir file.

cat < data file data dijadikan input oleh perintah cat pipe / salurkan (output suatu perintah menjadi input perintah lain), operatornya : | , contoh:

ls -l | sort -s | more ouput perintah ls -l (long) menjadi input perintah sort -s (urutkan secara descending), kira-kira equivalen dengan ls -l -r

Penggunaan wildcard dengan karakter *, ?, [ ], contohnya:

ls i* tampilkan semua file yang dimulai dengan i .

ls i?i tampilkan file yang dimulai dengan i, kemudian sembarang karakter tunggal, dan diakhiri dengan i

ls [ab]* tampilkan file yang dimulai dengan salah satu karakter a atau b

Simple Bash Script Sebelum kita mulai proses pembuatan shell script, ada baiknya kita cek shell yang aktif di sistem operasi yang kita gunakan. Ini dapat dilihat menggunakan perintah ps

ps

Hasilnya kira-kira

PID TTY TIME CMD 24119 pts/1 00:00:00 bash 26168 pts/1 00:00:00 ps

Jika sistem anda menggunakan csh atau ksh, dapat dibuah mengguakan perintah change shell (chsh),

# chsh

Akan keluar,

Changing the login shell for root Enter the new value, or press ENTER for the default Login Shell [/bin/csh]: /bin/bash atau yang lebih sederhana, dengan cara mengetik bash di shell

$ bash

Contoh Shell Script Sederhana Langkah paling sederhana, coba jalankan perintah di shell

$ echo “Hello World”

Akan keluar

“Hello World”

Berikut adalah contoh sangat sederhana sebuah shell script menggunakan perintah,

• echo • touch • mv

Skenario pekerjaan yang akan di jalankan shell script ini adalah,

• buat sebuah file • masukan 123456 ke file tersebut • buat folder • copy file tersebut ke folder tersebut caranya, edit sebuah file, misalnya

nano scriptsaya.sh chmod 755 scriptsaya.sh isi misalnya dengan

#!/bin/bash touch filepercobaan.sh echo 123456 >> filepercobaan.txt mkdir -p /var/data/ mv filepercobaan.txt /var/data

Coba jalankan

./scriptsaya.sh kemudian lihat isi folder /var/data maka akan ada file filepercobaan.txt yang isinya 123456. Jika kita ingin agar bisa di eksekusi dari folder lain, maka kita perlu memasukan folder lokasi tempat file scriptsaya.sh ke daftar path menggunakan perintah,

PATH=$PATH:. setelah itu script diatas dapat dijalankan tanpa ./ sebagai berikut,

scriptsaya.sh tanda #! pada /bin/bash dalam script scriptsaya.sh adalah perintah yang diterjemahkan ke kernel linux untuk mengeksekusi path yang disertakan dalam hal ini program bash pada direktory /bin, sebenarnya tanpa mengikutkan baris tersebut anda tetap dapat mengeksekusi script bash, dengan catatan bash adalah shell aktif. atau dengan mengetikkan bash pada prompt shell.

bash scriptsaya.sh tentunya cara ini kurang efisien, menyertakan path program bash diawal script kemudian merubah permission file sehingga dapat anda execusi merupakan cara yang paling efisien.

Sekarang coba kita membuat script shell yang menampilkan informasi berikut:

• Waktu system • Info tentang anda • jumlah pemakai yang sedang login di system contoh script myinfo.sh adalah sebagai berikut:

#!/bin/bash #myinfo

#membersihkan tampilan layar clear

#menampilkan informasi echo -n "Waktu system :"; date echo -n "Anda :"; whoami echo -n "Banyak pemakai :"; who | wc -l sebelum dijalankan jangan lupa untuk merubah permission file myinfo menjadi misalnya 755 sehingga dapat dieksekusi oleh anda

chmod 755 myinfo.sh ./myinfo.sh

Akan keluar kira-kira,

Waktu system :Sun Jan 15 08:02:24 WIB 2017 Anda :onno Banyak pemakai :1 tentunya layout diatas akan disesuaikan dengan system yang anda gunakan statement echo dengan opsi -n akan membuat posisi kursor untuk tidak berpindah ke baris baru karena secara default statement echo akan mengakhiri proses pencetakan ke standar output dengan karakter baris baru (newline), anda boleh mencoba tanpa menggunakan opsi -n, dan lihat perbedaannya. opsi lain yang dapat digunakan adalah -e (enable), memungkinkan penggunaan backslash karakter atau karakter sekuen seperti pada bahasa C atau perl, misalkan :

echo -e "\abunyikan bell" jika dijalankan akan mengeluarkan bunyi bell, informasi opsi pada statement echo dan backslash karakter selengkapnya dapat dilihat via man di prompt shell.

man echo

Pemakaian Variabel Secara sederhana variabel adalah pengenal (identifier) berupa satuan dasar penyimpanan yang isi atau nilainya sewaktu-waktu dapat berubah baik oleh eksekusi program (runtime program) ataupun proses lain yang dilakukan sistem operasi. dalam dokumentasi ini saya membagi variabel menjadi 3 kategori:

• Environment Variable • Positional Parameter • User Defined Variable

Environment Variable atau variabel lingkungan yang digunakan khusus oleh shell atau system linux kita untuk proses kerja system seperti variabel PS1, PS2, HOME, PATH, USER, SHELL,dsb...jika digunakan akan berdampak pada system, misalkan variabel PS1 yang digunakan untuk mengeset prompt shell pertama yaitu prompt tempat anda mengetikkan perintah - perintah shell (defaultnya "\s-\v\$"), PS2 untuk prompt pelengkap perintah, prompt ini akan ditampilkan jika perintah yang dimasukkan dianggap belum lengkap oleh shell (defaultnya ">"). anda dapat mengeset PS1 dan PS2 seperti berikut. simpan dahulu isi PS1 asli system anda, sehingga nanti dapat dengan mudah dikembalikan PS1LAMA=$PS1 sekarang masukkan string yang diinginkan pada variabel PS1

PS1="Server di Rumah!"

Untuk mengembalikan PS1 anda ke prompt semula ketikkan perintah

PS1=$PS1LAMA agar prompt shell hasil konfigurasi anda dapat tetap berlaku (permanen) sisipkan pada file .bashrc atau .profile

Positional Parameter atau parameter posisi yaitu variabel yang digunakan shell untuk menampung argumen yang diberikan terhadap shell baik berupa argumen waktu sebuah file dijalankan atau argumen yang dikirim ke subroutine. variabel yang dimaksud adalah 1,2,3,dst..lebih jelasnya lihat contoh script berikut :

#!/bin/bash #argumen1.sh

echo $1 sistem operasi $2 sangat menarik $3

Hasilnya

./argumen1.sh bash linux sekali bash sistem operasi linux sangat menarik sekali ada 3 argumen yang disertakan pada script argumen1 yaitu bash, shell, linux, masing2 argumen akan disimpan pada variabel 1,2,3 sesuai posisinya. variabel spesial lain yang dapat digunakan diperlihatkan pada script berikut:

#!/bin/bash #argumen2.sh

clear echo "Nama script : $0"; echo "Banyak argumen : $#"; echo "Argumen tersebut : $*";

Hasilnya:

./argumen2.sh 1 2 3 empat 5 6 7

Nama script : ./argumen2.sh Banyak argumen : 7 Argumen tersebut : 1 2 3 empat 5 6 7

User Defined Variable atau variabel yang didefinisikan sendiri oleh pembuat script sesuai dengan kebutuhannya, beberapa hal yang perlu diperhatikan dalam mendefenisikan variabel adalah: • dimulai dengan huruf atau underscore • hindari pemakaian spesial karakter seperti *,$,#,dll... • bash bersifat case sensitive, artinya membedakan huruf besar dan kecil, a berbeda dengan A, nama berbeda dengan Nama,NaMa,dsb.. untuk menset nilai variabel gunakan operator assignment (pemberi nilai)"=", contohnya :

myos="linux" #double-quoted nama='pinguin' #single-quoted hasil=`ls -l`; #back-quoted angka=12 kalau kita perhatikan ada 3 tanda kutip yang kita gunakan untuk memberikan nilai string ke suatu variabel, adapun perbedaannya adalah:

• dengan kutip ganda (double-quoted), bash mengizinkan kita untuk menyisipkan variabel di dalamnya. contohnya:

#!/bin/bash

nama="pinguin" kata="Hi $nama, apa kabar" #menyisipkan variabel nama echo $kata;

Hasilnya:

Hi pinguin, apa kabar

• dengan kutip tunggal (single-quoted), akan ditampilkan apa adanya. contohnya:

#!/bin/bash

nama="pinguin" kata='Hi $nama, apa kabar' #menyisipkan variabel nama echo $kata;

Hasilnya:

Hi $nama, apa kabar

• dengan kutip terbalik (double-quoted), bash menerjemahkan sebagai perintah yang akan dieksekusi, contohnya:

#!/bin/bash

hapus=`clear`; isi=`ls -lh`; #hasil ls -lh disimpan di variabel isi

#hapus layar echo $hapus

#ls -lh echo $isi;

Hasilnya: silahkan dicoba sendiri • untuk operasi matematika ada 3 cara yang dapat anda gunakan, dengan statement builtin let atau expr atau perintah subtitusi seperti contoh berikut:

#!/bin/bash #mat1

a=10 b=5 #memakai let let jumlah=$a+$b let kurang=$a-$b let kali=$a*$b

#memakai expr bagi=`expr $a / $b`

#memakai perintah subtitusi $((ekspresi)) modul=$(($a%$b)) #sisa pembagian

echo "$a+$b=$jumlah" echo "$a-$b=$kurang" echo "$a*$b=$kali" echo "$a/$b=$bagi" echo "$a%$b=$modul"

Hasilnya:

10+5=15 10-5=5 10*5=50 10/5=2 10%5=0

• fungsi expr sangat berguna baik untuk operasi matematika maupun string, contoh:

mystr="hitung-berapa-buah-karakter-kalimat-ini" expr length $mystr

39

• bash juga dapat mendeklarasikan variable untuk tipe data tertentu. Contoh statement declare dengan opsi -i untuk integer (bilangan bulat), seperti:

#!/bin/bash

declare -i angka angka=100; echo $angka;

apabila variabel yang dideklarasikan menggunakan declare -i ternyata anda beri nilai string (karakter), maka Bash akan mengubahnya ke nilai 0, tetapi jika anda tidak menggunakannya maka dianggap sebagai string.

Simple I/O I/O merupakan hal yang mendasar dari kerja komputer karena kapasitas inilah yang membuat komputer begitu berdayaguna. I/O yang dimaksud adalah device yang menangani masukan dan keluaran, baik itu berupa keyboard, floppy, layar monitor,dsb. sebenarnya kita telah menggunakan proses I/O ini pada contoh -contoh diatas seperti statement echo yang menampilkan teks atau informasi ke layar, atau operasi redirect ke ke file. selain echo, bash menyediakan perintah builtin printf untuk mengalihkan keluaran ke output standard, baik ke layar ataupun ke file dengan format tertentu, mirip statement printf kepunyaan bahasa C atau perl. berikut contohnya:

Output dengan printf

#!/bin/bash #cobaprint

url="lms.onnocenter.or.id"; angka=255;

printf "Hi, coba printf ala C\n\t\a di bash\n"; printf "URL %s\n %d decimal = %o octal\n" $url $angka $angka; printf "%d decimal dalam floating point = %.2f\n" $angka $angka

Hasilnya:

Hi, coba printf ala C di bash URL lms.onnocenter.or.id 255 decimal = 377 octal 255 decimal dalam floating point = 255,00 untuk menggunakan format kontrol sertakan simbol %, bash akan mensubtitusikan format tsb dengan isi variabel yang berada di posisi kanan sesuai dengan urutannya jika lebih dari satu variabel, \n \t \a adalah karakter sekuen lepas newline,tab, dan bell,

Format control keterangan

%d untuk format data integer %o untuk format data octal %f untuk format data floating point atau decimal %x untuk format data Hexadecimal pada script diatas %.2f akan mencetak 2 angka dibelakang koma, defaultnya 6 angka, informasi lebih lanjut dapat dilihat melalui perintah man printf

Input dengan read Setelah echo dan printf untuk proses output telah anda ketahui, sekarang kita menggunakan statement read yang cukup ampuh untuk membaca atau menerima masukan dari input standar syntax :

read -opsi [nama_variabel...] contoh script:

#!/bin/bash #cobaread

echo -n "Nama anda :" read nama; echo "Hi $nama"; echo "Pesan dan kesan :"; read echo "kata $nama, $REPLY";

Hasilnya:

Nama anda :Paijo Hi Paijo Pesan dan kesan : Alhamdulillah baik sekali ... kata Paijo, Alhamdulillah baik sekali ... jika nama_variabel tidak disertakan, maka data yang diinput akan disimpan di variabel REPLY contoh lain read menggunakan opsi

­t(TIMEOUT), ­p (PROMPT), ­s(SILENT), ­n (NCHAR) dan ­d(DELIM)

Contoh:

#!/bin/bash

read ­p "User Name : " user echo ­e "Password 10 karakter,\ntime out 6 second" read ­s ­n 10 ­t 6 pass echo "kesan anda, _underscore=>selesai" read ­d _ kesan

echo "User = $user" echo "Password = $pass" echo "Kesan = $kesan"

Opsi Keterangan

-p membuat prompt sebagai informasi pengisian -s membuat input yang dimasukkan tidak di echo ke layar -n menentukan banyak karakter yang diinput -d menentukan karakter pembatas masukan informasi secara lengkap lihat man bash

Seleksi dan Perulangan Bagian ini merupakan ciri yang paling khas dari suatu bahasa pemrograman dimana kita dapat mengeksekusi suatu pernyataan dengan kondisi terntentu dan mengulang beberapa pernyataan dengan kode script yang cukup singkat. test dan operator test adalah utility sh shell yang berguna untuk memeriksa informasi tentang suatu file dan berguna untuk melakukan perbandingan suatu nilai baik string ataupun numerik syntax: test ekspresi proses kerja test yaitu dengan mengembalikan sebuah informasi status yang dapat bernilai 0 (benar) atau 1 (salah) dimana nilai status ini dapat dibaca pada variabel spesial $?.

test 50 -gt 3 echo $?

0 pernyataan 50 -gt (lebih besar dari) 3 yang dievaluasi test menghasilkan 0 pada variabel status $? itu artinya pernyataan tersebut BENAR. Coba evaluasi expresi berikut

test 30 -lt 1 echo $?

1 status bernilai 1, berarti pernyataan SALAH. anda lihat simbol -gt dan -lt, itulah yang disebut sebagai operator, secara sederhana operator adalah karakter khusus (spesial) yang melakukan operasi terhadap sejumlah operand, misalkan 2+3, "+" adalah operator sedangkan 2 dan 3 adalah operandnya, pada contoh test tadi yang bertindak sebagai oparatornya adalah -lt dan -gt, sedangkan bilangan disebelah kiri dan kanannya adalah operand. cukup banyak operator yang disediakan bash antara lain:

Operator untuk integer Operator Keterangan bil1 -eq bil2 Mengembalikan Benar jika bil1 sama dengan bil2 bil1 -ne bil2 Mengembalikan Benar jika bil1 tidak sama dengan bil2 bil1 -lt bil2 Mengembalikan Benar jika bil1 lebih kecil dari bil2 bil1 -le bil2 Mengembalikan Benar jika bil1 lebih kecil atau sama dengan bil2 bil1 -gt bil2 Mengembalikan Benar jika bil1 lebih besar dari bil2 bil1 -ge bil2 Mengembalikan Benar jika bil1 lebih besar atau sama dengan bil2

Operasi string Operator Keterangan -z STRING Mengembalikan Benar jika panjang STRING adalah zero STRING1 == STRING2 Mengembalikan Benar jika STRING1 sama dengan STRING2

Operator file Operator Keterangan -f FILE Mengembalikan Benar jika FILE ada dan merupakan file biasa -d FILE Mengembalikan Benar jika FILE ada dan meruapakan direktory

Operator logika Operator Keterangan ekspr1 -o ekspr2 Benar jika jika salah satu ekspresi benar (or,||) ekspr1 -a ekspr2 Benar jika ekspresi1 dan ekspresi2 benar (and,&&) ! ekspresi Mengembalikan Benar jika ekspresi tidak benar (not!) untuk informasi lebih lengkap man bash atau info bash di prompt shell anda.

Seleksi if Statement builtin if berfungsi untuk melakukan seleksi berdasarkan suatu kondisi tertentu syntax:

if test-command1; then perintah1; elif test-command2; then perintah2; else alternatif_perintah; fi contoh script if1:

#!/bin/bash #if1

clear; if [ $# -lt 1 ]; then echo "Usage : $0 [arg1 arg2 ...]" exit 1; fi

echo "Nama script anda : $0"; echo "Banyak argumen : $#"; echo "Argumennya adalah: $*";

Hasilnya:

./if1

Usage : ./if1 [arg1 arg2 ...] statement dalam blok if...fi akan dieksekusi apabila kondisi if terpenuhi, dalam hal ini jika script if1 dijalankan tanpa argumen. kita tinggal membaca apakah variabel $# lebih kecil (less than) dari 1, jika ya maka eksekusi perintah di dalam blok if ..fi tsb. perintah exit 1 akan mengakhiri jalannya script, angka 1 pada exit adalah status yang menandakan terdapat kesalahan, status 0 berarti sukses, anda dapat melihat isi variabel $? yang menyimpan nilai status exit, tetapi jika anda memasukkan satu atau lebih argumen maka blok if...fi tidak akan dieksekusi, statement diluar blok if..fi yang akan dieksekusi. contoh script if2:

#!/bin/bash

kunci="linux"; read -s -p "Password : " pass if [ $pass != $kunci ] then echo "Maaf, password anda salah"; else echo "Sukses, linux memang oye"; fi

Hasilnya

./if2 Password : linux Sukses, linux memang oye ./if2 Password : coba-coba Maaf, password anda salah klausa else akan dieksekusi jika if tidak terpenuhi, sebaliknya jika if terpenuhi maka else tidak akan dieksekusi. statement builtin case seperti halnya if statement case digunakan untuk menyeleksi kondisi majemuk, dibanding if, pemakaian case terasa lebih efisien syntax:

case WORD in [ [(] PATTERN [| PATTERN]...) COMMAND-LIST ;;]... esac contoh script

#!/bin/bash

clear echo ­n "Masukkan nama Presiden :"; read presiden;

case $presiden in soekarno | soeharto | jokowi ) echo "$presiden presiden Indonesia" exit ;; washington | nixon | obama ) echo "$presiden presiden Amerika" exit ;; *) echo "$binatang belum didaftarkan" exit ;; esac

Hasilnya:

Masukkan nama Presiden :obama obama presiden Amerika

Masukkan nama Presiden :soekarno soekarno presiden Indonesia Perulangan statement for syntax:

for NAME [in WORDS ...]; do perintah; done contoh script

#!/bin/bash

for angka in 1 2 3 4 5; do echo "angka=$angka"; done

Hasilnya:

angka=1 angka=2 angka=3 angka=4 angka=5 contoh script berikut akan membaca argumen yang disertakan waktu script dijalankan

#!/bin/bash #contohfor.sh

for var do echo $var done

Hasilnya:

./contohfor.sh coba1 2 parameter3 variabel4 coba1 2 parameter3 variabel4 atau variasi seperti berikut

#!/bin/bash

for var in `cat /etc/passwd` do echo $var done

Hasilnya: hasil dari perintah cat terhadap file /etc/passwd disimpan ke var dan ditampilkan menggunakan echo $var ke layar, kira-kira sama dengan perintah cat /etc/passwd. statement while selama kondisi bernilai benar atau zero perintah dalam blok while akan diulang terus syntax:

while KONDISI; do perintah; done; contoh script mencetak bilangan ganjil antara 1-10

#!/bin/bash #cetakganjil.sh

i=1; while [ $i -le 10 ]; do echo "$i,"; let i=$i+2; done

Hasilnya:

./cetakganjil.sh 1,3,5,7,9, kondisi tidak terpenuhi pada saat nilai i=11 (9+2), sehingga perintah dalam blokwhile tidak dieksekusi lagi contoh script yang akan menghitung banyak bilangan genap dan ganjil yang ada.

#!/bin/bash

i=0; bil_genap=0; bil_ganjil=0;

echo -n "Batas loop :"; read batas

if [ -z $batas ] || [ $batas -lt 0 ]; then echo "Ops, tidak boleh kosong atau Batas loop harus >= 0"; exit 0; fi

while [ $i -le $batas ]; do echo -n "$i,"; if [ `expr $i % 2` -eq 0 ]; then let bil_genap=$bil_genap+1; else let bil_ganjil=$bil_ganjil+1; fi let i=$i+1; #counter untuk mencapai batas done

echo echo "banyak bilangan genap = $bil_genap"; echo "banyak bilangan ganjil = $bil_ganjil";

Hasilnya: ./contohganjil2.sh

Batas loop : 10 0,1,2,3,4,5,6,7,8,9,10, banyak bilangan genap = 6 banyak bilangan ganjil = 5 untuk mengetahui apakah nilai i berupa bilangan genap kita cukup menggunakan operasi matematika % (mod), jika nilai i dibagi 2 menghasilkan sisa 0 berarti i adalah bilangan genap (semua bilangan genap yang dibagi dengan 2 mempunyai sisa 0) maka pencacah (bil_genap) dinaikkan 1, selain itu i bilangan ganjil yang dicatat oleh pencacah bil_ganjilproses ini dilakukan terus selama nilai i lebih kecil atau samadengan nilai batas yang dimasukkan. script juga akan memeriksa dahulu nilai batas yang dimasukkan apabila kosong atau lebih kecil dari 0 maka proses segera berakhir.tentunya dengan statement while kita sudah dapat membuat perulangan pada script kedai diatas agar dapat digunakan terus-menerus selama operator masih ingin melakukan proses perhitungan. statement until jika while akan mengulang selama kondisi benar, lain halnya dengan statement until yang akan mengulang selama kondisi salah. berikut contoh script contohuntil.sh menggunakan until

#!/bin/bash

i=1; until [ $i -gt 10 ]; do echo $i; let i=$i+1 done

Hasilnya:

./contohuntil.sh 1,2,3,4,5,6,7,8,9,10, perhatikan kodisi until yang salah [ $i -gt 10], dimana nilai awal i=1 dan akan berhenti apabila nilai i = 11 (bernilai benar) 11 -gt 10. statement select select berguna untuk pembuatan layout berbentuk menu pilihan, anda lihat contoh script pembuatan menu diatas kita hanya melakukannya dengan echo secara satu persatu, dengan select akan terlihat lebih efisien. syntax:

select varname in (<item list>); do perintah; done sewaktu dijalankan bash akan menampilkan daftar menu yang diambil dari item list, serta akan menampilkan prompt yang menunggu masukan dari keyboard, masukan tersebut oleh bash disimpan di variabel builtin REPLY, apabila daftar item list tidak dituliskan maka bash akan mengambil item list dari parameter posisi sewaktu script dijalankan. lebih jelasnya lihat contoh berikut:

#!/bin/bash #menu1.sh

clear select menu do echo "Anda memilih $REPLY yaitu $menu" done

Hasilnya:

./menu1.sh Slackware Mint Ubuntu

1) Slackware 2) Mint 3) Ubuntu #? 1 Anda memilih 1 yaitu Slackware karena item list tidak disertakan dalam script, maka sewaktu script dijalankan kita menyertakan item list sebagai parameter posisi.

Array adalah kumpulan variabel dengan tipe sejenis, dimana array ini merupakan feature Bash yang cukup indah :-) dan salah satu hal yang cukup penting dalam bahasa pemrograman, anda bisa membayangkan array ini sebagai tumpukan buku - buku dimeja belajar. lebih jelasnya sebaiknya lihat dulu contoh script berikut:

#!/bin/bash #array1.sh

buah=(Melon,Apel,Durian); echo ${buah[*]};

Hasilnya:

./array1.sh Melon,Apel,Durian anda lihat bahwa membuat tipe array di Bash begitu mudah, secara otomatis array buah diciptakan dan string Melon menempati index pertama dari array buah, perlu diketahui bahwa array di Bash dimulai dari index 0, jadi array buah mempunyai struktur seperti berikut:

buah[0] berisi Melon buah[1] berisi Apel buah[2] berisi Durian

0,1,2 adalah index array, berarti ada 3 elemen pada array buah, untuk menampilkan isi semua elemen array gunakan perintah subtitusi seperti pada contoh diatas, dengan index berisi "*" atau "@". dengan adanya index array tentunya kita dapat mengisi array perindexnya dan menampilkan isi array sesuai dengan index yang diinginkan, seperti contoh berikut:

#!/bin/bash #array2.sh

bulan[0]=31 bulan[1]=28 bulan[2]=31 bulan[3]=30 bulan[4]=31 bulan[5]=30 bulan[6]=31 bulan[7]=31 bulan[8]=30 bulan[9]=31 bulan[10]=30 bulan[11]=31 echo "Banyak hari dalam bulan Agustus adalah ${bulan[7]} hari"

Hasilnya:

./array2.sh Banyak hari dalam bulan Agustus adalah 31 hari kita dapat mendeklarasikan array secara eksplisit menggunakan statement declare, contoh:

declare -a myarray mendeklarasikan variabel myarray sebagai array dengan opsi -a, kemudian anda sudah dapat memberinya nilai baik untuk semua elemen atau hanya elemen tertentu saja dengan perulangan yang telah kita pelajari pengisian elemen array dapat lebih dipermudah, lihat contoh :

#!/bin/bash #array3.sh

#deklarasikan variabel array declare -a angka

#clear i=0; while [ $i -le 4 ]; do let isi=$i*2; angka[$i]=$isi; let i=$i+1; done

#tampilkan semua elemen array #dengan indexnya berisi "*" atau "@" echo ${angka[*]};

#destroy array angka (memory yang dipakai dibebaskan kembali) unset angka

Hasilnya:

./array3.sh 0 2 4 6 8

Subrutin atau Fungsi merupakan bagian script atau program yang berisi kumpulan beberapa statement yang melaksanakan tugas tertentu. Dengan subrutin akan membuat script kita tentunya lebih sederhana dan terstruktur. Beberapa hal mengenai fungsi ini adalah: • Memungkinkan kita menyusun kode script ke dalam bentuk modul-modul kecil yang lebih efisien dengan tugasnya masing-masing. • Mencegah penulisan kode yang berulang - ulang. untuk membuat subrutin shell telah menyediakan keyword function seperti pada bahasa C, akan tetapi ini bersifat optional (artinya boleh digunakan boleh tidak). syntax:

function nama_fungsi() { perintah; } nama_fungsi adalah pengenal (identifier) yang aturan penamaannya sama seperti pemberian nama variabel, setelah fungsi dideklarasikan atau dibuat anda dapat memaggilnya dengan menyebutkan nama fungsinya. lebih jelasnya lihat contoh script fungsi1 berikut:

#!/bin/bash

function say_hello() { echo "Hello, apa kabar" }

#panggil fungsi say_hello;

#panggil sekali lagi say_hello;

Hasilnya:

./fungsi1.sh Hello, apa kabar Hello, apa kabar jika keyword function disertakan maka kita boleh tidak menggunakan tanda kurung (), tetapi jika keyword function tidak disertakan maka tanda kurung harus digunakan, lihat contoh berikut:

#!/bin/bash

function say_hello{ echo "Hello,apa kabar" }

balas(){ echo "Baik-baik saja"; echo "Bagaimana dengan anda ?"; }

#panggil fungsi say_hello say_hello;

#panggil fungsi balas balas;

Hasilnya:

./fungsi2.sh Hello, apa kabar Baik-baik saja Bagaimana dengan anda ?

Mengirim argumen sebagai parameter ke fungsi tentunya suatu fungsi lebih bermanfaat apabila dapat menerima argumen yang dikirim oleh pemanggilnya dan memproses argumen tsb didalam fungsinya, fungsi yang kita buat pada bash shell tentunya dapat melakukan hal tsb, apabila pada pemanggilan fungsi kita menyertakan argumen untuk diproses fungsi tsb, maka bash akan menyimpan argumen-argumen tsb pada parameter posisi 1,2,3,dst..., nah dengan memanfaatkan parameter posisi tsb tentunya kita dapat mengambil nilai yang dikirim. lebih jelasnya anda lihat contoh berikut:

#!/bin/bash

function hello{ if [ -z $1 ]; then echo "Hello, apa kabar anda" else echo "Hello $1, apa kabar"; fi }

#masukkan nama anda disini echo -n "Nama anda :"; read nama

#panggil fungsi dan kirim isi variabel nama ke fungsi untuk dicetak hello $nama;

Hasilnya:

./fungsi3.sh Nama anda : pinguin Hello pinguin, apa kabar lihat fungsi hello, sebelum mencetak pesan kita melakukan pemeriksaan dengan if terhadap parameter posisi $1 apabila kosong maka pesan "Hello, apa kabar anda" yang akan ditampilkan, tetapi jika ada string yang kita input maka string tersebut akan dicetak di dalam blok else pada fungsi. argumen pertama diteruskan ke variabel 1, argumen kedua pada variabel 2, dst. jika argumen yang dikirim lebih dari satu.

Cakupan Variabel secara default variabel - variabel yang digunakan dalam script adalah variabel bersifat global, maksud global adalah bahwa variabel tsb dikenal dan dapat diakses oleh semua fungsi dalam script, tetapi bash menyediakan keyword local yang berfungsi membatasi cakupan (scope) suatu variabel agar dikenal hanya oleh fungsi yang mendeklarasikannya.coba lihat contoh berikut:

#!/bin/bash

proses(){ echo "Isi variabel a=$a"; }

a=2; proses(); proses $a

Hasilnya:

Isi variabel a=2 Isi variabel a=2 coba anda tambahkan local a pada fungsi proses menjadi

proses(){ local a; echo -e "a didalam fungsi, a=$a"; }

a=10; proses()

echo "a diluar fungsi, a=$a" proses $a

Hasilnya:

a didalam fungsi, a= a diluar fungsi, a=10 a didalam fungsi a=

Penggunaan keyword local menyebabkan variabel tersebut hanya berlaku pada fungsi yang mendekalarasikannya. pada contoh dalam fungsi proses variabel a dideklarasikan sebagai variabel local dan tidak diberi nilai.

Cron Cron memang bukan shell script. Saya sangat di bantu oleh cron saat harus menjalankan shell script pada waktu tertentu. Misalnya,

• Setiap jam 12 malam mensinkronisasi database server. • Setiap 5 menit mensinkronkan waktu server. • Secara periodik harus meng-update data yang ada di server.

Cron adalah penjadwal pekerjaan di sistem operasi komputer seperti Unix. "cron" adalah singkatan dari "chronograph".

Cron memungkinkan pengguna untuk menjadwal pekerjaan (perintah atau shell script) untuk berjalan secara otomatis pada waktu atau tanggal tertentu. Hal ini umumnya digunakan untuk melakukan pemeliharaan atau administrasi sistem, meskipun mempunyai tujuan yang bersifat umum, cron dapat digunakan untuk keperluan lain, seperti menghubungkan ke internet dan download email.

Tabel cron Tabel cron biasanya di masukan di bawah folder

/var/spool/cron/crontabs/ Misalnya untuk user root maka file tersebut adalah

/var/spool/cron/crontabs/root

Mengedit tabel cron bisa langsung ke folder / file yang bersangkutan, atau menggunakan perintah

$ crontab -e dari user yang kita inginkan operator / sintaks cron Ada beberapa cara untuk menentukan waktu

• koma (',') menentukan daftar nilai, contoh: "1,3,4,7,8" (spasi tidak digunakan dalam sebuah daftar). • dash ('-') menentukan sebuah range dari nilai, contoh: "1-6", equivalen dengan "1,2,3,4,5,6" • asterisk ('*') menentukan semua nilai yang mungkin. Contoh, asterisk pada kolom jam akan sama dengan setiap jam. • slash ('/') biasa di sebut "step", biasa digunakan untuk meloncati nilai tertentu. Contoh: "*/3" dalam jam artinya sama dengan "0,3,6,9,12,15,18,21".

Contoh berikut akan membersihkan Apache error log setiap satu menit melewati tengah malam setiap hari.

1 0 * * * echo "" > /www/apache/logs/error_log

Contoh slash: script /home/user/test.pl akan di jalankan setiap 5 menit.

*/5 * * * * /home/user/test.pl

Format secara umum

.------menit (0 - 59) | .------jam (0 - 23) | | .------hari dalam bulan (1 - 31) | | | .------bulan (1 - 12) ATAU jan,feb,mar,apr ... | | | | .---- hari dalam minggu (0-6) (Sunday=0 or 7) ATAU sun,mon,tue,wed,thu,fri,sat | | | | | * * * * * perintah yang dijalankan

Beberapa entry khusus yang mungkin akan berguna

Entry Keterangan Equivalen @reboot Run satu kali, saat start None @yearly Run setahun sekali 0 0 1 1 * @annually (sama dengan @yearly) 0 0 1 1 * @monthly Run sebulan sekali 0 0 1 * * @weekly Run seminggu sekali 0 0 * * 0 @daily Run sehari sekali 0 0 * * * @midnight (sama dengan @daily) 0 0 * * * @hourly Run setiap jam 0 * * * *

@reboot akan berguna jika user perlu merestart server atau daemon, atau jika user tidak dapat mengakses ke file di bawah /etc/init.d/ Menjalankan Cron # start cron # stop cron # restart cron

Contoh Script Beberapa contoh script sederhana yang sering saya gunakan adalah, export GNUPGHOME=/var/data/mirrorkeyring debmirror ­a i386,amd64 ­­no­source ­s main,restricted,universe,multiverse \ ­h 152.118.24.30 \ ­d xenial,xenial­backports,xenial­security,xenial­updates \ ­r ubuntu ­­progress ­e http /var/data/repository/repo­16.04/ script di atas digunakan untuk mengcopy repository linux ubuntu 16.04 ke folder /var/data/repository/repo-16.04/

wget http://onnocenter.or.id/pustaka/datawiki/images.tar.gz ­O \ /var/data/library/datawiki/images.tar.gz wget http://onnocenter.or.id/pustaka/datawiki/wikidb.sql.tar.gz ­O \ /var/data/library/datawiki/wikidb.sql.tar.gz script di atas adalah untuk mengcopy database & gambar wiki yang ada di onnocenter.or.id.

rsync ­ur rsync://localhost/pustaka/* /mnt/usb/ script di atas adalah untuk mensinkronisasikan data yang ada perpustakaan saya ke backup usb harddisk.

Referensi • http://pemula.linux.or.id/programming/bash-shell.html • http://www.gnu.org/software/bash/manual/bashref.html • http://www.tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html • http://www.tldp.org/LDP/abs/html/ • http://lms.onnocenter.or.id/wiki/index.php/Cron BAB 4: KERNEL

Dalam ilmu komputer, kernel adalah suatu perangkat lunak yang menjadi bagian utama dari sebuah sistem operasi. Tugasnya melayani bermacam program aplikasi untuk mengakses perangkat keras komputer secara aman.

Karena akses terhadap perangkat keras terbatas, sedangkan ada lebih dari satu program yang harus dilayani dalam waktu yang bersamaan, maka kernel juga bertugas untuk mengatur kapan dan berapa lama suatu program dapat menggunakan satu bagian perangkat keras tersebut. Hal tersebut dinamakan sebagai multiplexing.

Akses kepada perangkat keras secara langsung merupakan masalah yang kompleks, oleh karena itu kernel biasanya mengimplementasikan sekumpulan abstraksi hardware. Abstraksi-abstraksi tersebut merupakan sebuah cara untuk menyembunyikan kompleksitas, dan memungkinkan akses kepada perangkat keras menjadi mudah dan seragam. Sehingga abstraksi pada akhirnya memudahkan pekerjaan programer.

Untuk menjalankan sebuah komputer kita tidak harus menggunakan kernel sistem operasi. Sebuah program dapat saja langsung diload dan dijalankan diatas mesin 'telanjang' komputer, yaitu bilamana pembuat program ingin melakukan pekerjaannya tanpa bantuan abstraksi perangkat keras atau bantuan sistem operasi. Teknik ini digunakan oleh komputer generasi awal, sehingga bila kita ingin berpindah dari satu program ke program lain, kita harus mereset dan meload kembali program-program tersebut.

Beberapa desain Kernel Sebuah kernel sistem operasi tidak harus ada dan dibutuhkan untuk menjalankan sebuah komputer. Program dapat langsung dijalankan secara langsung di dalam sebuah mesin (contohnya adalah CMOS Setup) sehingga para pembuat program tersebut membuat program tanpa adanya dukungan dari sistem operasi atau hardware abstraction. Cara kerja seperti ini, adalah cara kerja yang digunakan pada zaman awal-awal dikembangkannya komputer (pada sekitar tahun 1950). Kerugian dari diterapkannya metode ini adalah pengguna harus melakukan reset ulang komputer tersebut dan memuatkan program lainnya untuk berpindah program, dari satu program ke program lainnya. Selanjutnya, para pembuat program tersebut membuat beberapa komponen program yang sengaja ditinggalkan di dalam komputer, seperti halnya loader atau debugger, atau dimuat dari dalam ROM (Read-Only Memory). Seiring dengan perkembangan zaman komputer yang mengalami akselerasi yang signifikan, metode ini selanjutnya membentuk apa yang disebut dengan kernel sistem operasi.

Selanjutnya, para arsitek sistem operasi mengembangkan kernel sistem operasi yang pada akhirnya terbagi menjadi empat bagian yang secara desain berbeda, sebagai berikut:

• Kernel monolitik. Kernel monolitik mengintegrasikan banyak fungsi di dalam kernel dan menyediakan lapisan abstraksi perangkat keras secara penuh terhadap perangkat keras yang berada di bawah sistem operasi. • Mikrokernel. Mikrokernel menyediakan sedikit saja dari abstraksi perangkat keras dan menggunakan aplikasi yang berjalan di atasnya—yang disebut dengan server—untuk melakukan beberapa fungsionalitas lainnya. • Kernel hibrida. Kernel hibrida adalah pendekatan desain yang dimodifikasi. Pada hybrid kernel, terdapat beberapa tambahan kode di dalam ruangan kernel untuk meningkatkan performanya. • Exokernel. Exokernel menyediakan hardware abstraction secara minimal, sehingga program dapat mengakses hardware secara langsung. Dalam pendekatan desain exokernel, library yang dimiliki oleh sistem operasi dapat melakukan abstraksi yang mirip dengan abstraksi yang dilakukan dalam desain monolithic kernel.

Kernel monolitik Pendekatan kernel monolitik didefinisikan sebagai sebuah antarmuka virtual yang berada pada tingkat tinggi di atas perangkat keras, dengan sekumpulan primitif atau system call untuk mengimplementasikan layanan-layanan sistem operasi, seperti halnya manajemen proses, konkurensi (concurrency), dan manajemen memori pada modul-modul kernel yang berjalan di dalam mode supervisor.

Meskipun jika setiap modul memiliki layanan operasi-operasi tersebut terpisah dari modul utama, integrasi kode yang terjadi di dalam monolithic kernel sangatlah kuat, dan karena semua modul berjalan di dalam address space yang sama, sebuah bug dalam salah satu modul dapat merusak keseluruhan sistem. Akan tetapi, ketika implementasi dilakukan dengan benar, integrasi komponen internal yang sangat kuat tersebut justru akan mengizinkan fitur-fitur yang dimiliki oleh sistem yang berada di bawahnya dieksploitasi secara efektif, sehingga membuat sistem operasi dengan monolithic kernel sangatlah efisien—meskipun sangat sulit dalam pembuatannya. Pada sistem operasi modern yang menggunakan monolithic kernel, seperti halnya Linux, FreeBSD, Solaris, dan Microsoft Windows, dapat memuat modul-modul yang dapat dieksekusi pada saat kernel tersebut dijalankan sehingga mengizinkan ekstensi terhadap kemampuan kernel sesuai kebutuhan, dan tentu saja dapat membantu menjaga agar kode yang berjalan di dalam ruangan kernel (kernel-space) seminim mungkin.

Di bawah ini ada beberapa sistem operasi yang menggunakan Monolithic kernel:

• Kernel sistem operasi UNIX tradisional, seperti halnya kernel dari sistem operasi UNIX keluarga BSD (NetBSD, BSD/I, FreeBSD, dan lainnya). • Kernel sistem operasi GNU/Linux, Linux. • Kernel sistem operasi Windows (versi 1.x hingga 4.x; kecuali Windows NT).

Mikrokernel Pendekatan mikrokernel berisi sebuah abstraksi yang sederhana terhadap hardware, dengan sekumpulan primitif atau system call yang dapat digunakan untuk membuat sebuah sistem operasi agar dapat berjalan, dengan layanan-layanan seperti manajemen thread, komunikasi antar address space, dan komunikasi antar proses. Layanan-layanan lainnya, yang biasanya disediakan oleh kernel, seperti halnya dukungan jaringan, pada pendekatan microkernel justru diimplementasikan di dalam ruangan pengguna (user-space), dan disebut dengan server.

Server atau disebut sebagai peladen adalah sebuah program, seperti halnya program lainnya. Server dapat mengizinkan sistem operasi agar dapat dimodifikasi hanya dengan menjalankan program atau menghentikannya. Sebagai contoh, untuk sebuah mesin yang kecil tanpa dukungan jaringan, server jaringan (istilah server di sini tidak dimaksudkan sebagai komputer pusat pengatur jaringan) tidak perlu dijalankan. Pada sistem operasi tradisional yang menggunakan monolithic kernel, hal ini dapat mengakibatkan pengguna harus melakukan rekompilasi terhadap kernel, yang tentu saja sulit untuk dilakukan oleh pengguna biasa yang awam.

Dalam teorinya, sistem operasi yang menggunakan microkernel disebut jauh lebih stabil dibandingkan dengan monolithic kernel, karena sebuah server yang gagal bekerja, tidak akan menyebabkan kernel menjadi tidak dapat berjalan, dan server tersebut akan dihentikan oleh kernel utama. Akan tetapi, dalam prakteknya, bagian dari system state dapat hilang oleh server yang gagal bekerja tersebut, dan biasanya untuk melakukan proses eksekusi aplikasi pun menjadi sulit, atau bahkan untuk menjalankan server-server lainnya.

Sistem operasi yang menggunakan microkernel umumnya secara dramatis memiliki kinerja di bawah kinerja sistem operasi yang menggunakan monolithic kernel. Hal ini disebabkan oleh adanya overhead yang terjadi akibat proses input/output dalam kernel yang ditujukan untuk mengganti konteks (context switch) untuk memindahkan data antara aplikasi dan server.

Beberapa sistem operasi yang menggunakan microkernel:

• IBM AIX, sebuah versi UNIX dari IBM • Amoeba, sebuah kernel yang dikembangkan untuk tujuan edukasi • Kernel Mach, yang digunakan di dalam sistem operasi GNU/Hurd, NexTSTEP, OPENSTEP, dan Mac OS/X • Minix, kernel yang dikembangkan oleh Andrew Tanenbaum untuk tujuan edukasi • Symbian OS, sebuah sistem operasi yang populer digunakan pada hand phone, handheld device, embedded device, dan PDA Phone.

Kernel hibrida Kernel hibrida aslinya adalah mikrokernel yang memiliki kode yang tidak menunjukkan bahwa kernel tersebut adalah mikrokernel di dalam ruangan kernel-nya. Kode-kode tersebut ditaruh di dalam ruangan kernel agar dapat dieksekusi lebih cepat dibandingkan jika ditaruh di dalam ruangan user. Hal ini dilakukan oleh para arsitek sistem operasi sebagai solusi awal terhadap masalah yang terjadi di dalam mikrokernel: kinerja.

Beberapa orang banyak yang bingung dalam membedakan antara kernel hibrida dan kernel monolitik yang dapat memuat modul kernel setelah proses booting, dan cenderung menyamakannya. Antara kernel hibrida dan kernel monolitik jelas berbeda. Kernel hibrida berarti bahwa konsep yang digunakannya diturunkan dari konsep desain kernel monolitik dan mikrokernel. Kernel hibrida juga memiliki secara spesifik memiliki teknologi pertukaran pesan (message passing) yang digunakan dalam mikrokernel, dan juga dapat memindahkan beberapa kode yang seharusnya bukan kode kernel ke dalam ruangan kode kernel karena alasan kinerja.

Di bawah ini adalah beberapa sistem operasi yang menggunakan kernel hibrida:

• BeOS, sebuah sistem operasi yang memiliki kinerja tinggi untuk aplikasi multimedia. • Novell NetWare, sebuah sistem operasi yang pernah populer sebagai sistem operasi jaringan berbasis IBM PC dan kompatibelnya. • Microsoft Windows NT (dan semua keturunannya).

Exokernel Sebenarnya, Exokernel bukanlah pendekatan kernel sistem operasi yang umum—seperti halnya microkernel atau monolithic kernel yang populer, melainkan sebuah struktur sistem operasi yang disusun secara vertikal.

Ide di balik exokernel adalah untuk memaksa abstraksi yang dilakukan oleh developer sesedikit mungkin, sehingga membuat mereka dapat memiliki banyak keputusan tentang abstraksi hardware. Exokernel biasanya berbentuk sangat kecil, karena fungsionalitas yang dimilikinya hanya terbatas pada proteksi dan penggandaan sumber daya.

Kernel-kernel klasik yang populer seperti halnya monolithic dan microkernel melakukan abstraksi terhadap hardware dengan menyembunyikan semua sumber daya yang berada di bawah hardware abstraction layer atau di balik driver untuk hardware. Sebagai contoh, jika sistem operasi klasik yang berbasis kedua kernel telah mengalokasikan sebuah lokasi memori untuk sebuah hardware tertentu, maka hardware lainnya tidak akan dapat menggunakan lokasi memori tersebut kembali.

Exokernel mengizinkan akses terhadap hardware secara langsung pada tingkat yang rendah: aplikasi dan abstraksi dapat melakukan request sebuah alamat memori spesifik baik itu berupa lokasi alamat physical memory dan blok di dalam hard disk. Tugas kernel hanya memastikan bahwa sumber daya yang diminta itu sedang berada dalam keadaan kosong—belum digunakan oleh yang lainnya—dan tentu saja mengizinkan aplikasi untuk mengakses sumber daya tersebut. Akses hardware pada tingkat rendah ini mengizinkan para programmer untuk mengimplementasikan sebuah abstraksi yang dikhususkan untuk sebuah aplikasi tertentu, dan tentu saja mengeluarkan sesuatu yang tidak perlu dari kernel agar membuat kernel lebih kecil, dan tentu saja meningkatkan performa.

Exokernel biasanya menggunakan library yang disebut dengan libOS untuk melakukan abstraksi. libOS memungkinkan para pembuat aplikasi untuk menulis abstraksi yang berada pada level yang lebih tinggi, seperti halnya abstraksi yang dilakukan pada sistem operasi tradisional, dengan menggunakan cara-cara yang lebih fleksibel, karena aplikasi mungkin memiliki abstraksinya masing-masing. Secara teori, sebuah sistem operasi berbasis Exokernel dapat membuat sistem operasi yang berbeda seperti halnya Linux, UNIX, dan Windows dapat berjalan di atas sistem operasi tersebut.

Tour de Linux Kernel Sebuah kernel UNIX adalah interpreter yang menerjemahkan panggilan system call tingkat pengguna akses yang disinkronisasi ke hardware dan device driver. Panggilan didefinisikan oleh standar POSIX.

Interpreter mengelola permintaan system call tingkat pengguna untuk mengakses file atau proses. Kernel scheduler memungkinkan UNIX untuk mengatur subsistem file dan proses. Subsistem file bekerja dengan perangkat device raw atau block device. Subsistem Proses mengelola sinkronisasi process, komunikasi antar-proses, manajemen memori dan penjadwalan proses.

Kernel mengelola melalui penggunaan dua (2) struktur penting yaitu,

• Tabel proses • Struktur pengguna

Tabel proses berisi parameter penjadwalan, gambar memori, sinyal dan kondisi proses lainnya. Struktur pengguna termasuk registri mesin, kondisi system call , tabel file descriptor, akunting dan stack kernel.

Bagian ini mencoba untuk menjelaskan source code Linux secara teratur, mencoba membantu pembaca untuk mencapai pemahaman yang baik tentang bagaimana source code diletakkan dan bagaimana fitur unix yang paling relevan diimplementasikan. Targetnya adalah untuk membantu programmer C berpengalaman yang tidak terbiasa dengan Linux dalam mendapatkan akrab dengan desain Linux secara keseluruhan. Itulah sebabnya entry point yang dipilih untuk tur kernel adalah entry point kernel sendiri: sistem boot.

Pemahaman yang baik tentang bahasa C diperlukan untuk memahami materi, serta familiar dengan konsep Unix dan arsitektur PC. Namun, tidak ada kode C akan muncul dalam bagian ini, melainkan pointer ke source code sebenarnya. Bagian ini cenderung untuk memberikan gambaran informal.

Setiap pathname untuk file direferensikan dalam bagian ini mengacu pada direktori utama, biasanya

/usr/src/linux

Booting System Saat PC di nyalakan, processor 80x86 akan beroperasi menggunakan mode real dan menjalankan code di address 0xFFFF0, yang merupakan address ROM-BIOS. PC BIOS menjalankan beberapa test pada sistem dan menginisialisasi vector interupsi pada address fisik 0. Setelah itu, PC akan memasukan sektor pertama dari bootable device ke 0x7C00, dan jump ke situ. Device tersebut biasanya floppy atau hard drive. Memang ini terlihat sederhana, tapi memang hanya itu yang dibutuhkan untuk mengerti bagaimana awal kernel beroperasi.

Bagian pertama dari Linux kernel di tulis dalam bahasa assembler 8086 (boot/bootsect.S). Jika dijalankan, dia akan pindah ke address absolut di 0x90000, load 2 kBytes dari code selanjutnya dari boot device ke address 0x90200, dan seluruh sisa kernel ke address 0x10000. Message "Loading..." akan ditampilkan saat sistem load. Kontrol diberikan kepada code boot/Setup.S, real-mode assembly source yang lain.

Bagian dari setup mengidentifikasi fitur dari mesin dan tipe dari VGA. Jika di minta, dia juga akan menanyakan kepada pengguna untuk memilih mode video untuk console. Selanjutnya, dia akan memindahkan seluruh sistem dari address 0x10000 ke address 0x1000, masuk ke mode protected dan jump ke sistem yang ada 0x1000.

Langkah selanjutnya adalah proses dekompresi kernel. Code berada pada 0x1000 berasal dari zBoot/head.S yang akan menginisialisasi register dan menjalankan decompress_kernel(), yang akan membuat zBoot/inflate.c, zBoot/unzip.c dan zBoot/misc.c. Data yang sudah di-dekompres masuk ke address 0x100000 (1 Meg), dan hal ini yang menyebabkan Linux biasanya tidak dapat di jalankan di RAM kurang dari 2MB.

Enkapsulasi kernel dalam gzip file dilakukan oleh Makefile dan utility di directory zBoot. Cukup menarik untuk dilihat.

Kernel release 1.1.75 memindahkan directory boot dan zBoot ke arch/i386/boot. Perubahan ini untuk memungkinkan kernel bagi arsitektur yang berbeda. Pada bagian ini, informasi yang diberikan akan spesifik untuk i386.

Decompressed code di execute pada address address 0x1010000 [kemungkinan sekarang berbeda], yang mana semua setup 32bit dilakukan: IDT, GDT dan LDT di load, processor dan coprocessor di identifikasi, paging dilakukan, akhirnya, routine start_kernel dijalankan. Source dari operasi ini adalah boot/head.S. Bagian ini barangkali merupakan bagian paling tricky dari kernel secara keseluruhan.

Perlu dicatat bahwa jika terjadi error pada tahapan di atas, komputer akan lockup. Karena sistem operasi tidak dapat mengatasi error karena sistem operasi belum beroperasi dengan penuh. start_kernel() ada di init/main.c, dan tidak pernah return. Selanjutnya semua code menggunakan bahasa C, diluar manajemen interrupt dan system call masuk / keluar (sebetulnya kebanyakan marco juga embed assembly code).

Perputaran Roda Sistem Operasi Setelah mengatasi berbagai hal yang tricky, start_kernel() menginisialisasi semua bagian dari kernel, terutama,

• Set batas memory dan call ke paging_init(). • Inisialisasi traip, IRQ kanal dan scheduling. • Parsing command lnine. • Jika diminta, alokasi profiling buffer. • Inisialisasi semua device driver dan disk buffer, juga berbagai bagian kecil lainnya. • Kalibrasi delay loop (biasanya di hitung sebagai angka BogoMips). • Cek apakah interrupt 16 bekerja dengan baik dengan coprocessor.

Akhirnya, kernel siap untuk move_to_user_mode(), untuk mem-fork proses init, yang code-nya berada pada source file yang sama. Process nomor 0 yang juga dikenal sebagai idle task akan terus jalan sebagai infinite idle loop.

Proses init akan berusaha untuk menjalankan /etc/init, atau /bin/init, atau /sbin/init.

Jika tidak ada yang berhasil, code akan menjalankan "/bin/sh /etc/rc" dan fork root shell di terminal pertama. Code ini digunakan sejak Linux 0.01, saat itu sistem operasi hanya berupa kernel saja, dan proses tanpa login tersedia.

Setelah exec() program init dari salah satu lokasi standard (kita asumsikan kita memiliki salah satunya), kernel tidak punya kontrol secara langsung terhadap aliran program. Fungsi kernel, selanjutnya adalah untuk memfasilitasi proses melalui system call, juga memberikan layanan untuk kejadian asinkron (seperti interupsi hardware). Multitasking sudah di setup, dan selanjutnya init akan memanaje akses multiuser melalui fork() system daemon dan proses login.

Karena kernel bertanggung jawab untuk memberikan layanan, pembahasan ini akan dilanjutkan dengan melihat pada layanan tersebut (yaitu "system calls"), juga memberikan gambaran umum tentang struktur data di bawahnya maupun organisasi dari code.

Bagaimana Kernel Melihat Proses Dari sudut pandang kernel, sebuah proses tidak lebih dari sebuah entry pada tabel proses.

Oleh karenanya, tabel process adalah salah satu tabel paling penting dalam struktur data di system, bersama dengan tabel memory-management dan buffer cache. Satu-satunya hal (item) yang di simpan di tabel proses adalah struktur task_struct, lumayan besar sekali, di definisikan di definisikan di include/linux/sched.h. Dalam task_struct baik informasi low-level dan high-level disimpan -- mulai dari copy dari register hardware hingga inode dari directory tempat beroperasinya proses.

Tabel process dapat berupa array dan double-link list, juga tree. Implementasi fisik dapat berupa static array dari pointer, yang panjangnya adalah NR_TASKS, sebuah konstanta yang di definisikan di include/linux/tasks.h, dan setiap struktur berada di bagian page reserved memory. Struktur list diperoleh melalui pointer next_task dan prev_task, sedangkan struktur tree cukup kompleks dan tidak akan di terangkan disini. Kita mungkin ingin mengubah nilai NR_TASKS dari 128, tapi pastikan untuk memaksa mengcompile semua file dependensi yang tergantung kepadanya.

Setelah booting selesai, kernel akan selalu bekerja atas nama dari salah satu proses, dan global variable current, sebuah pointer ke item task_struct, digunakan untuk mencatat proses yang sedang berjalan. current hanya akan diubah oleh scheduler, di kernel/sched.c. Akan tetapi, semua proses harus di lihat, macro for_each_task digunakan. Hal ini jauh lebih cepat daripada scan array secara berurutan, jika system dalam kondisi beban yang ringan.

Sebuah proses harus dijalankan dalam mode user mode atau kernel mode. Badan utama dari user program akan di execute dalam user mode dan system call akan di execute dalam kernel mode. stack yang digunakan oleh process dalam dua mode exekusi juga berbeda -- stack segmen konvensional digunakan dalam user mode, sedang fixed-size stack (satu page,dimiliki oleh process) digunakan dalam kernel mode. Page kernel stack tidak pernah di swap, karena dia harus tersedia jika sewaktu-waktu system call memanggil.

System calls, dalam kernel, berupa fungsi dalam bahasa C, nama 'official' biasanya menggunakan prefix `sys_'. Sebuah system call diberi nama, sebagai contoh, untuk burnout akan memanggil fungsi kernel sys_burnout().

Lihat for_each_task dan SET_LINKS, di include/linux/sched.h akan menolong untuk mengerti struktur list dan tree di tabel proses.

Pembuatan dan Penghancuran proses Sebuah sistem unix akan membuat proses melalui system call fork(), dan terminasi proses melalui perintah exit() atau dengan memberikan signal. Implementasi Linux dari kedua perintah tersebut berada di kernel/fork.c dan kernel/exit.c.

Fork relatif mudah, dan fork.c lumayan pendek dan sangat mudah untuk dimengerti. Tugas utamanya adalah mengisi struktur data dari proses baru. Langkah yang dilakukan, selain mengisi kolom, adalah:

• Mengambil page yang free untuk meletakan task_struct • Mencari slot proses yang kosong (find_empty_process()) • Mengambil page yang free untuk kernel_stack_page • Copy LDT bapak ke anak • Duplikasi informasi mmap ke bapak sys_fork() juga memanaje deskripsi file dan inode.

Kernel 1.0 memberikan dukungan vestigial untuk threading, dan fork() system call akan menunjukan beberapa hal untuk itu. Kernel thread adalah work-in-progress diluar kernel utama.

Keluar dari sebuah proses lebih triky, karena proses parent harus diberitahu akan adanya child yang berjalan. Tambah lagi, sebuah proses dapat exit jika di kill() oleh proses lain (hal ini adalah fitur Unix). File exit.c oleh karenanya merupakan tempat dari sys_kill() dan berbagai jenis sys_wait(), selain dari sys_exit().

Code dari exit.c tidak akan diterangkan disini -- karena tidak terlalu menarik. Intinya dia akan menangani dari perintah untuk keluar dari system secara konsisten. Standard POSIX, akan secara detail menerangkan tentang berbagai sinyal yang harus di tangani dalam proses keluar tersebut.

Menjalankan Program Setelah menjalankan fork(), dua copy dari program yang sama akan jalan. Salah satu diantaranya biasanya akan meng-exec() program yang lain. System call exec() harus menemukan lokasi dari image binary dari file executable, me-load dan men-jalan-kannya. Kata "load" disini boleh tentu berarti "copy binary image ke memory", karena Linux mendukung demand loading.

Implementasi exec() di Linux mendukung beberapa format binary. Hal ini dapat dicapai melalui struktur linux_binfmt, dimana ada dua pointer ke fungsi -- satu untuk load executable dan yang lain untuk load library, setiap format binary me-representasikan executable maupun library. Loading dari shared library di implementasikan di source file yang sama dengan exec(), untuk sekarang kita fokus ke exec() saja.

Unix system memberikan programmer enam pola dari fungsi exec(). Semua kecuali satu dapat di implementasikan sebagai fungsi library, kernel Linux mengimplementasikan sys_execve() sendiri. Dia menjalankan tugas yang sangat sederhana, yaitu, load head dari executable, dan mencoba meng-execute-nya. Jika dua byte pertama adalah "#!", maka kalimat pertama akan di parsing dan interpreter akan di jalankan, selain itu format binary yang terdaftar akan berusaha di coba dijalankan.

Format Linux asli didukung secara langsung dalam fs/exec.c, dan fungsi yang relevan akan me-load binary aout_dan load library aout. Untuk binary, fungsi loading dari executable "a.out" akan berujung pada mmap() ke file disk, atau call read_exec(). mmap() digunakan oleh Linux jika dibutuhkan mekanisme loading ke page memory program saat di akses, sedangkan read_exec() digunakan jika memory mapping tidak didukung oleh filesystem host (contoh filesystem "msdos")

Kernel 1.1 memasukan revisi filesystem msdos, yang mendukung mmap(). Di samping itu, struct linux_binfmt menjadi linked list bukan sekedar array, untuk memungkinkan loading format binary baru sebagai kernel modul. Selanjutnya, structure yang ada juga di kembangkan untuk mengakses route core-dump yang berhubungan dengan format.

Akses ke File System Kita semua tahu bahwa filesystem adalah sumber daya paling dasar dalam system Uniux, sangat mendasar dan ubiquitous sehingga membutuhkan nama yang mudah di ingat - untuk memudahkan kita akan menggunakan singkatan sederhana "fs".

Disini akan di asumsikan bahwa pembaca mengerti dasar fs Unix -- ijin akses, inode, superblock, mount dan umount. Konsep ini banyak di terangkan di literatur Unix lainnya. Kita akan banyak membahas isu spesifik fs di Linux.

Unix awal biasanya mendukung satu tipe fs saja, yang strukturnya tersebar dalam seluruh kernel. Pada hari ini, kita menggunakan interface standard antara kernel dengan fs, agar memudahkan pertukaran data pada berbagai arsitektur. Linux memberikan lapisan standard untuk menyampaikan informasi antara kernel dengan modul fs. Lapisan interface ini biasanya di sebut VFS, untuk "virtual filesystem".

Code filesystem oleh karenanya biasanya di pecah menjadi dua lapisan: lapisan atas memfokuskan diri pada manajemen dari tabel kernel dan struktur data, sedangkan lapisan bawah terdiri dari sekumpulan fungsi yang fs-dependent, yang di akses melalui struktur data VFS. Semua bagian yang fs-independent berada di file fs/*.c. Mereka menangani isu berikut ini:

• Manaje buffer chache (buffer.c); • Respond ke system call fcntl() dan ioctl() (fcntl.c dan ioctl.c); • Memetakan pipe dan fifo pada inode dan buffer (fifo.c, pipe.c); • Manaje tabel file and inode (file_table.c, inode.c); • Lock dan unlock file dan record (locks.c); • Memetakan name ke inode (namei.c, open.c); • Implementasi fungsi select() (select.c) yang tricky; • Memberikan informasi (stat.c); • mount dan umount filesystem (super.c); • exec() executable dan dump core (exec.c); • Load berbagai format binary (bin_fmt*.c, seperti diterangkan diatas).

Interface VFS, terdiri dari sekumpulan operasi high-level yang di kerjakan oleh code fs-independent dan di lakukan oleh setiap tipe filesystem. Struktur yang paling relevan adalah inode_operations dan file_operations, meskipun mereka tidak sendiri karena beberapa struktur lain juga ada. Seluruh struktur di definisikan dalam include/linux/fs.h.

Pintu masuk dalam kernel ke file system yang sebenarnya ada di struktur file_system_type. Array file_system_types terdapat dalam fs/filesystems.c dan digunakan saat perintah mount diberikan. Fungsi read_super dari tipe fs yang relevan akan bertanggung jawab untuk mengisi struct super_block, yang akhirnya juga mengisi struct super_operations dan struct type_sb_info. struct super_operations memberikan pointer untuk operasi fs yang generik untuk fs-type current, struct type_sb_info memberikan informasi yang lebih spesifik tentang fs-type.

Array tipe filesystem sudah menjadi linked list, untuk membuka kemungkinan load tipe fs baru sebagai kernel module. Fungsi (un-)register_filesystem di masukan dalam fs/super.c.

Anatomi dari Tipe File System Tugas dari filesystem type adalah untuk menjalankan tugas low-level yang di petakan ke operasi VFS yang lebih high level pada media fisik (disk, networ atau apa saja). Interface VFS cukup flexibel untuk mendukung filesystem Unix konvensional maupun yang tidak konvensional seperti msdos dan umsdos.

Setiap fs-type dibangun oleh hal berikut, di samping directory sendiri:

• Entry ke array file_systems[] (fs/filesystems.c); • include file superblock (include/linux/type_fs_sb.h); • include file inode (include/linux/type_fs_i.h); • include file generic (include/linux/type_fs.h});

Dua #include dalam include/linux/fs.h, termasuk entry struct super_block dan struct inode.

Directory yang dimiliki oleh fs type berisi semua code, yang bertanggung jawab terhadap inode dan data management.

Untuk melihat dari dekat bagaimana low-level code dan interface VFS bekerja untuk fs type ada baiknya memnaca procfs. Source code fs/procfs cukup mudah dibaca.

Selanjutnya kita akan mencoba melihat mekanisme kerja di dalam VFS, minix filesystem akan digunakan sebagai contoh. minix type dipilih karena relatif kecil tapi cukup komplit; di samping itu, fs type linux lainnya diturunkan dari minix. ext2 type jauh lebih komplex mungkin bisa menjadi pelajaran bagi pembaca yang cukup tekun.

Pada saat minix-fs di mount, minix_akan membaca read_super dan mengisi struktur super_block dengan data yang dibaca dari device yang di mount. Parameter s_op dalam struktur tersebut akan menyimpan pointer ke minix_sops, yang digunakan oleh code filesystem generik yang dijalankan oleh operasi superblock.

Mengkaitkan fs yang baru saja di mount ke sistem tree global bergantung pada data berikut (asumsinya sb adalah struktur super_block dan dir_i point ke inode untuk mount point):

sb->s_mounted point ke root-dir inode dari mounted filesystem (MINIX_ROOT_INO); dir_i->i_mount menyimpan sb->s_mounted; sb->s_covered menyimpan dir_i

Umount dapat dilakukan oleh do_umount, yang akan menjalankan minix_put_super.

Jika sebuah file di akses, minix_read_inode akan mulai bekerja; dia akan mengisi system-wide struktur inode dengan field dari minix_inode. Field inode->i_op akan di isi sesuai dengan inode- >i_mode dan dia akan bertanggung jawab akan operasi selanjutnya pada file tersebut. Source untuk fungsi minix yang baru saja dijelasnkan dapat dilihat di fs/minix/inode.c.

Struktur inode_operations digunakan untuk menjalankan operasi inode ke fungsi kernel yang spesifik fs-type; entry pertama di struktur adalah pointer ke item file_operations, yang equivalen dengan data-management dari i_op. minix fs-type mengijinkan tiga instance dari inode-operation (untuk directori, untuk file dan untuk symbolic link) dan dua instance dari file-operation (symlinks tidak memerlukan hal ini).

Operasi directori (minix_readdir) dapat ditemukan di fs/minix/dir.c; operasi file (read dan write) ada di fs/minix/file.c dan operasi symlink (reading dan following link) ada di fs/minix/symlink.c.

Selebihnya dari minix directory mengimplementasikan tugas berikut:

• bitmap.c mengatur alokasi dan pembebasan inode dan block (pada ext2 fs, hal ini dilakukan pada dua source file yang berbeda); • fsynk.c bertanggung jawab untuk system call fsync() -- dia mengatur block direct, indirect dan double indirect (ini merupakan bagian dari pengetahuan umum Unix); • namei.c berisi semua operasi nama pada inode, seperti membuat dan memhancurkan node, rename dan links; • truncate.c menjalankan pemotongan (truncatin) dari file. console driver Karena merupakan I/O device utama di sebagian besar Linux, console driver perlu memperoleh perhatian lebih. Source code dari console, maupun berbagai karakter driver, dapat ditemukan pada drivers/char, dan kita akan menggunakan directory tersebut sebagai titik referensi ketika melakukan penamaan file.

Inisialisasi Console dilakukan oleh fungsi tty_init(), di tty_io.c. Fungsi bertanggung jawab untuk memperoleh nomor device dan memanggil fungsi init untuk masing-masing device. con_init(), yang kemudian menghubungkan ke console, dan berada console.c.

Inisialisasi console telah berubah lumayan banyak pada evolusi 1.1. console_init() dilepas dari tty_init(), dan dapat di panggil secara langsung oleh ../../main.c. Virtual console dialokasikan secara dinamis. Write ke console Jika console device di tulis, fungsi con_write akan di jalankan. Fungsi ini mengatur semua control karakter dan escape sequences yang digunakan oleh aplikasi untuk memperoleh manajemen layar (screen) secara lengkap. escape sequence yang di implementasikan adalah milik terminal vt102; Hal ini berarti bahwa environment kita perlu di set TERM=vt102 jika kita melakukan telnet ke host non-Linux; untuk aktifitas lokal, lebih baik menggunakan TERM=console karena console Linux memberikan fungsi superset dari vt102. con_write(), sebagian besar merupakan pernyataan nested switch, yang digunakan untuk meng- handel finite state automaton yang meng-interpretasikan escape sequences karakter satu per satu. Saat mode normal, character yang di cetak akan di tulis secara langsung ke memory video, menggunakan current attr-ibute. Dalam console.c, semua field struct vc dapat di akses melalui macro, oleh karenanya referensi ke (contoh) attr, sebetulnya me-refer ke field di struktur vc_cons[currcons], selama currcons adalah nomor dari console yang di referensikan.

Sebetulnya, vc_cons di kernel yang baru, tidak lagi berupa array dari struktur, dia berupa array dari pointer yang isinya di kmalloc() -kan. Penggunaan macro sangat menyederhanakan perubahan yang dilakukan, karena sebagian besar code tidak perlu di tulis ulang. mapping dan unmapping dari console memory ke screen dilakukan oleh fungsi set_scrmem() (yang mengcopy data dari buffer console ke video memory) dan get_scrmem (yang mengcopydata kembali ke buffer console). buffer private dari current console secara fisik di map ke video RAM, untuk meminimalkan jumlah data yang perlu di transfer. Hal ini berarti, get- dan set-_scrmem() secara statik ada di console.c dan di panggil hanya saat console switch.

Read console Membaca (read) console dilakukan melalui line-discipline. default (dan unique) line discipline di Linux di kenal sebagai tty_ldisc_N_TTY. line discipline adalah "men-displin input melalui line". Ini merupakan tabel fungsi, yang fokus untuk membaca device. Dengan di bantu oleh flag termios, line discipline mengontrol input dari tty: raw, cbreak dan cooked mode; select(); ioctl() dan sebagainya.

Fungsi read di line discipline di sebut read_chan(), yang akan membaca which tty buffer secara independent dari masukan yang ada. Alasannya, karena masuknya karakter melalui tty di tangani oleh interupsi hardware secara asinkron.

Line discipline N_TTY dapat ditemukan di tty_io.c, kernel selanjutnya akan menggunakan source file n_tty.c yang berbeda.

Bagian paling bawah dari console input adalah bagian dari manajemen keyboard, dan oleh karenanya akan di tangani dalam keyboard.c, dalam fungsi keyboard_interrupt().

Manajemen Keyboard Majamen Keyboard cukup membuat kepala pusing. Oleh karenanya dia dibatasi di file keyboard.c, yang berisi banyak angka hexadecimal yang merepresentasikan banyak kode keyboard yang muncul di keyboard dari berbagai pembuat keyboard.

Bagi pembaca yang sangat tertarik dengan Linux keyboard, cara terbaik untuk membaca keyboard.c adalah mulai dari kalimat terakhir ke atas. Detail pada tingkat yang paling rendah terutama pada setengah pertama dari file tersebut. Switching current console current console di switch dengan cara mengaktifkan fungsi change_console(), yang berada di tty_io.c dan di aktifkan oleh keyboard.c dan vt.c (sebelumnya console switch untuk meresponds tombol keyboard yang di tekan, belakangan jika program me-request dengan cara memanggil ioctl()).

Proses switch yang sebenarnya dilakukan dalam dua langkah, dan fungsi complete_change_console() yang menangani langkah ke dua. Membagi switch berarti untuk menyelesaikan sebuah tugas sesudah terjadi handshake dengan proses yang mengontrol tty sesudah kita tinggalkan. Jika console tidak di bawah kontrol proses, call ke change_console() akan di selesaikan oleh complete_change_console() sendiri. Intervensi proses diperlukan untuk bisa melakukan switch secara baik antara console grafik dengan text dan sebaliknya, dan pada server X (sebagai contoh) dia akan mengontrol sendiri console grafik-nya.

Mekanisme seleksi (selection) "selection" adalah fasilitas cut and paste untuk text console di Linux. Mekanisme ini biasanya di tangani oleh proses pada user-level, yang biasanya di inisiasi oleh selection atau gpm. Program pada user-level menggunakan ioctl() pada console untuk memberitahukan pada kernel untuk meng- highlight bagian pada layar. Text yang di select, kemudian akan di copy ke selection buffer. buffer ini merupakan entitas statik di console.c. Paste text dilakukan secara "manual" mem-push karakter di antrian tty input. Seluruh mekanisme selection di proteksi oleh #ifdef sehingga user dapat men- disable-nya saat konfigurasi kernel untuk menghemat beberapa kilobyte dari RAM.

Selection adalah fasilitas yang sangat low-level, dan dia bekerja secara tersembunyi dari aktifitas kernel lainnya. Hal ini berarti #ifdef hanya menghilangkan highlight sebelum screen di modifikasi.

Kernel yang baru mempunyai code yang lebih baik untuk selection, dan pointer mouse dapat di highlight secara independent oleh text yang di select. Selanjutnya, sejak versi 1.1.73 dan seterusnya digunakan dynamic buffer untuk text yang dipilih, membuat kernel 4kB lebih kecil. ioctl() dari device System call ioctl() merupakan pintu masuk untuk proses user untuk mengontrol perilaku sebuah file device. Manajemen ioctl di-spawn oleh ../../fs/ioctl.c, dimana sys_ioctl() yang sebenarnya berada. Permohonan standard ioctl akan ditangani di situ, permohonan yang berhubungan dengan file akan di proses oleh file_ioctl() (di source file yang sama), sedangkan proses lainnya akan di proses oleh fungsi ioctl() yang spesifik untuk device tersebut.

Bahan-bahan ioctl untuk console device berada di vt.c, karena console driver akan mengirimkan ioctl requests ke vt_ioctl().

Materi tentang ioctl cukup memusingkan kepala. Beberapa request berhubungan dengan device, dan beberapa lagi berhubungan dengan line discipline.

Fitur pada kernel 1.1.7x ke atas: tty_ioctl.c mengimplementasikan line discipline request (dengan nama n_tty_ioctl(), yang merupakan fungsi n_tty satu-satunya yang berada di luar n_tty.c), sementara file_operations field menunjuk ke tty_ioctl() di tty_io.c. Jika nomor request tidak dapat di tangani oleh tty_ioctl(), dia akan meneruskan ke tty->driver.ioctl atau, jika dia gagal, ke tty- >ldisc.ioctl. Berbagai hal yang berkenaan dengan driver untuk console dapat ditemukan di vt.c, sementara material line discipline di tty_ioctl.c. Request TIOCLINUX adalah device-independent code. Artinya, console selection dapat di set oleh ioctl dari tty manapun (set_selection() selalu beroperasi di console foreground), dan ini merupakan salah satu security hole di Linux lama. Maka pada Linux yang baru, hanya superuser yang dapat menangani selection.

Ada banyak jenis request yang di berikan console device, dan cara terbaik untuk mengetahui-nya adalah melihat isi file vt.c.

Referensi • http://www.tldp.org/LDP/khg/HyperNews/get/tour/tour.html • http://en.wikipedia.org/wiki/Kernel_%28computing%29 • http://www.unix.org/ • http://tldp.org/LDP/tlk/ • http://kernelnewbies.org/Documents • http://id.wikipedia.org/wiki/Kernel_Linux BAB 5: COMPILE KERNEL

Pada bagian ini, kita akan mempelajari secara umum berbagai bagian dari kernel, seperti,

• Letak pada source tree (pohon source code). • Urutan mereka di jalankan / di eksekusi. • Bagaimana cara mencari source code tertentu. • Bagaimana cara mengkonfigurasi kernel • Bagaimana cara mengcompile kernel

Dimana memperoleh source code kernel? Kita cukup beruntung jika menggunakan Linux karena source code kernel dapat dengan mudah di peroleh & di download secara bebas dari:

http://www.kernel.org

Dimana sebuah source code berada? Mulai dari directory pada top-level di Linux source tree, biasanya (walaupun belum tentu selalu) ada di bawah /usr/src/linux-. Kadang kala dibuatkan link ke folder

/usr/src/linux

Kita tidak akan terlalu detail disini, karena source Linux selalu berubah, paling tidak informasi yang akan diberikan cukup untuk mencari driver atau function tertentu berada.

Untuk bisa mengerti & menjiwai Linux ada baiknya jalan-jalan ke bawah folder yang akan di terangkan di bawah ini. Coba lihat-lihat source code yang ada di dalamnya. Misalnya ke bawah folder

/usr/src/linux/kernel/sched kita akan bisa melihat source code Linux yang bertanggung jawab untuk masalah penjadwalan / scheduling.

Berikut ini adalah penjelasan masing-masing folder di bawah /usr/src/linux

Makefile File ini adalah top-level Makefile untuk seluruh source tree. File ini mendefinisikan banyak sekali variable dan rule, seperti flag kompilasi gcc dll.

Documentation/ Directory ini berisi banyak sekali informasi bermanfaat (walaupun kadang-kadang kadaluarsa) tentang cara konfigurasi kernel, menjalankan dengan ramdisk, dan banyak lagi. Informasi help yang berhubungan dengan berbagai pilihan konfigurasi tidak dapat ditemukan disini - walaupun mereka dapat di temukan pada file Kconfig di masing-masing directory source. arch/ Semua code spesifik arsitektur berada di directory ini dan di directory include/asm-. Setiap arsitektur mempunyai directory di bawah directory ini. Contoh, code untuk komputer PowerPC dapat di temukan di arch/ppc. Kita dapat menemukan low-level memory management, penanganan interupsi, inisialisasi awal, dan banyak lagi di directory ini. crypto/ Ini adalah API cryptographic untuk digunakan oleh kernel itu sendiri. drivers/ Aturan umum, code untuk menjalankan device peripheral dapat di temukan di subdirectory dari directory ini. Ini termasuk, driver video, driver network card, driver SCSI low-level, dan berbagai hal sekitar itu. Contoh, kebanyakan driver network card dapat ditemukan di drivers/net. Beberapa higher level code digunakan untuk menempelkan semua tipe driver, yang mungkin tidak berada di directory yang sama seperti low level driver itu sendiri, menjadi satu kesatuan. fs/ Baik code file sistem generik (dikenal sebagai VFS, atau Virtual File System) dan code untuk berbagai file sistem yang berbeda dapat di temukan pada directory ini. Root file sistem yang kita gunakan mungkin ext2; code untuk membaca format ext2 dapat di temukan dalam fs/ext2. Tidak semua file sistem dapat di compile dan di run, file system yang baru dan aneh adalah contoh yang baik bagi mereka yang ingin mencari proyek baru untuk kernel. include/ Sebagian besar file header yang di include di awal file source code .c dapat di temukan di directory ini. Arsitektur spesifik dari include file biasanya di asm-. Bagian dari proses kernel build adalah membuat link simbolik dari asm ke asm-, sehingga #include dapat memperoleh file yang benar untuk arsitektur tersebut tanpa harus melakukan hard code ke dalam file .c. Directory lain berisi header yang non-arsitektur spesifik. Jika sebuah struktur, konstanta, atau variable digunakan di lebih dari satu file .c, maka kemungkinan besar itu akan ada dalam salah satu file header ini. init/ Directory ini berisi file main.c, version.c, dan code untuk membuat "early userspace". version.c mendefinisikan string Linux version. main.c dapat dilihat sebagai "lem" kernel. kita akan membicarakan lebih dalam tentang main.c di bagian selanjutnya. Userspace awal akan memberikan fungsionalitas yang dibutuhkan saat Linux kernel nyala, tapi tidak perlu berada / berjalan dalam kernel itu sendiri. ipc/ "IPC" singkatan dari "Inter-Process Communication". Ini berisi code untuk shared memory, semaphores, dan berbagai bentuk IPC. kernel/ Code level kernel generic yang tidak masuk ke mana-mana ada dalam directory ini. Level atas dari code sistem call ada disini, bersama dengan code printk(), scheduler, code untuk handling sinyal, dan banyak lagi. Nama file cukup informatif, kita dapat mengetik ls kernel/ dan dapat mengira-ngira dengan akurat fungsi dari masing-masing file. lib/ Subroutine yang secara generic bermanfaat untuk semua code kernel diletakan disini. Operasi string, routing debugging, dan code untuk parsing command line semua ada disini. mm/ High level memory management code berada dalam directory ini. Virtual memory (VM) di implementasikan melalui subroutine disini, dibantu oleh subroutine arsitektur spesifik low level yang biasanya ada di arch//mm/. Saat awal boot memory management (dibutuhkan sebelum subsistem memory di setup secara penuh) dilakukan disini, termasuk memory mapping dari file, manajemen dari page cache, alokasi memory, dan swap out dari page di RAM (dan masih banyak lagi). net/ Networking code high level berada disini. Network driver low-level akan menerima dan mengirim paket melalui level ini, yang kemudian meneruskannya ke level aplikasi, atau membuang data, atau menggunakannya di kernel, tergantung jenis paketnya. Directory net/core berisi code yang berguna untuk berbagai protokol jaringan, juga beberapa file di directory /net. Protokol jaringan yang spesifik di implementasikan di subdirectory net/. Contoh, code IP (versi 4) ada di directory net/ipv4. scripts/ Directory ini berisi script yang berguna untuk membangun kernel, tapi tidak termasuk code yang masuk dalam kernel itu sendiri. Contoh, berbagai tool untuk konfigurasi tersimpan file-nya disini. security/ Code untuk berbagai model security di Linux dapat di temukan disini, seperto NSA Security- Enhanced Linux maupun kait untuk socket dan network security. sound/ Driver untuk sound card dari berbagai code berhubungan dengan sound / audio berada disini. usr/ Directory ini berisi code untuk build arsip dengan format cpio berisi image root file sistem, yang akan digunakan untuk user space awal.

Bagaimana semua ini menjadi satu? Pusat dari seluruh kernel Linux adalah file init/main.c. Setiap arsitektur akan menjalankan function untuk setup low level dan kemudian akan mengeksekusi function start_kernel, yang dapat ditemukan di init/main.c.

Urutan eksekusi code akan tampak seperti berikut ini:

Architecture-specific setup code (di arch//*) | v function start_kernel() (di init/main.c) | v function init() (di init/main.c) | v user level "init" program

Untuk lebih detailnya, berikut adalah yang terjadi:

Architecture-specific set up code yang akan melakukan: Unzip dan move ke kernel code itu sendiri, jika dibutuhkan Inisialisasi hardware Ini dapat termasuk setup low-level memory management Transfer control ke function start_kernel() start_kernel() akan melakukan, antara lain: Print out versi kernel dan command line Start output ke console Aktifkan interupsi Kalibrasi delay loop Call rest_init(), yang akan melakukan: Start kernel thread untuk menjalankan function init() Masuk ke idle loop init() akan melakukan: Start processor lainnya (di mesin SMP) Start subsystem device Mount root filesystem Bebaskan kernel memory yang tidak digunakan Jalankan /sbin/init (atau /etc/init, atau ...) Pada titik ini, userlevel init program sudah berjalan, yang akan menjalankan berbagai hal seperti start layanan jaringan dan jalankan getty (login program) pada console.

Kita dapat mengenali kapan sebuah subsistem di inisialisasi dari start_kernel() atau init() dengan menulis printk oleh kita dan melihat kapan printk dari subsistem tersebut muncul relatif terhadap printk kita. Contoh, kita ingin mengetahui kapan sound system ALSA di inisialisasi, tulis printk di awal start_kernel() dan init() dan cari kapan "Advanced Linux Sound Architecture [...]" di cetak relatif terhadap printk. Untuk mengerti lebih lanjut ada baiknya membaca cara menggunakan function printk() dalam hacking kernel.

Mencari berbagai hal di kernel source tree Misalnya kita ingin mengerjakan sebuah driver, misalnya, USB driver. Mulai dari manakah kita untuk mencari USB code tersebut?

Pertama-tama, kita dapat mencoba menggunakan perintah find pada directory kernel pada top-level, sebagai berikut:

$ find . -name \*usb\*

Perintah ini akan mem-print setiap filename yang ada kata "usb" di tengahnya.

Cara lain, kita dapat mencoba untuk mencari string yang unik. String unik ini dapat berupa output dari printk(), nama file di /proc, atau string unik lainnya yang dapat di temukan di source code dari dari driver tersebut. Contoh, USB akan mengeluarkan message seperti:

usb-ohci.c: USB OHCI at membase 0xcd030000, IRQ 27

Oleh karenanya kita dapat mencoba untuk melakukan recursive grep untuk menemukan bagian dari to find printk yang menulis, misalnya:

$ grep -r "USB OHCI at" .

Cara lain, kita dapat mencari USB source code dengan melihat /proc. Jika kita ketik

find /proc -name usb mungkin kita akan menemukan sebuah directory dengan nama /proc/bus/usb. Kita mungkin akan menemukan string unik untuk di grep sesudah membaca entry dari directory tersebut.

Jika semua gagal, kita dapat mencoba masuk ke dalam directory yang ada secara individual dan melihat file-nya, atau melihat hasil dari perintah

ls -lR

Kita dapat memperhatikan kalau-kalau filename yang keluar mungkin yang kita maksud. Tetapi cara ini sebaiknya adalah cara terakhir, sesudah semua cara menggunakan perintah find dan grep dilakukan.

Setelah kita menemukan source code yang kita inginkan / tertarik, kita dapat mulai membacanya. Membaca dan mengerti kernel Linux adalah pembelajaran tersendiri. Perlu di ingat bahwa semakin sering kita membaca kernel code, semakin memudahkan kita.

Selamat mengeksplorasi kernel!!

Konfigurasi Kernel Linux kernel mempunyai beberapa tool konfigurasi. Setiap tool dapat di jalankan dengan menulis

make config di directory top-level dari source kernel. Semua perintah make harus di jalankan dari directory top- level dari source kernel. • make config - ini merupakan kerangka dasar dari tool konfigurasi. Ini akan menanya satu per satu dari pertanyaan konfigurasi secara berurut. Kernel Linux mempunyai amat sangat banyak pertanyaan konfigurasi. Jangan gunakan ini kecuali kita kurang kerjaan. • make oldconfig - ini akan membaca file konfigurasi .config dan akan bertanya konfigurasi yang belum di jawab di file tersebut. Cara ini biasanya digunakan untuk upgrade ke versi kernel yang lebih baru. • make menuconfig - ini merupakan konfigurasi yang banyak digunakan oleh kernel hacker. Perintah ini menggunakan pop up berbasis text dan konfigurator menu-style menggunakan library ncurses. Kita bisa masuk ke satu menu yang kita tertarik dan mengubah hanya konfigurasi yang kita inginkan saja. • make xconfig, make gconfig - jika kita menjalankan Xwindows, maka ini lebih cantik, lebih di klik dari menuconfig. Konfigurator ini tampaknya tidak sebaik menuconfig karena lebih sensitif pada input file konfigurasi yang ada bug-nya (di samping, karena memang lebih banyak orang menggunakan menuconfig). xconfig menggunakan library qt, sedang gconfig menggunakan library gtk.

Beberapa konfigurasi yang menarik & di perlukan dalam kuliah sistem operasi, antara lain adalah,

• Membuat informasi versi lokal yang kita buat

General setup ---> () Local version - append to kernel release

• Aktifkan / Enable loadable module support (default enable),

[*] Enable loadable module support ---> [ ] Forced module loading [*] Module unloading [ ] Forced module unloading [*] Module versioning support [*] Source checksum for all modules [*] Module signature verification [ ] Require modules to be validly signed [*] Automatically sign all modules (NEW)

• Mengurangi driver yang tidak dibutuhkan, kadang kala di perlukan jika kita ingin membuat kernel yang kecil,

Device Drivers ---> < > Parallel port support ---> IEEE 1394 (FireWire) support ---> < > FireWire driver stack < > Nosy - a FireWire traffic sniffer for PCILynx cards --- Power supply class support [ ] Power supply debug < > Generic PDA/phone power driver < > Generic battery support using IIO < > MAX8925 battery charger support

Konfigurasi Kernel Dengan Mengedit .config Walaupun tidak di sarankan, karena bisa mengacaukan konfigurasi kernel. Kita juga dapat mengedit konfigurasi kernel menggunakan text editor biasa, melalui perintah

cd /usr/src/linux vi .config

Beberapa konfigurasi yang menarik untuk kuliah sistem operasi, misalnya,

# # General setup # CONFIG_LOCALVERSION="namaanda"

Hasil Konfigurasi Setiap program konfigurasi akan menghasilkan file berikut. • Sebuah file bernama .config di top level directory berisi semua pilihan kita. • Sebuah file bernama autoconf.h di directory include/linux/ mendefinisikan (atai tidak mendefinisikan) directory simbol CONFIG_* sehingga preprocessor C mengetahui apakah simbol tertentu akan di on-kan atau di off-kan.

Jika kita mempunyai file .config untuk mesin kita, copy saja itu ke directory kernel source dan jalankan

make oldconfig

Kita dapat mencek ulang konfigurasi dengan perintah

make menuconfig

Jika kita tidak mempunyai .config, kita dapat membuat-nya dengan masuk ke setiap submenu dan men-on-kan atau meng-off-kan opsi yang kita butuhkan. menuconfig dan xconfig mempunyai opsi "Help" yang dapat memperlihatkan apa yang akan kita konfigurasi. Help untuk opsi tertentu, akan menolong kita dapat menentukan apakah opsi tersebut perlu di on atau di off-kan. RedHat dan berbagai distribusi seringkali memberikan contoh file .config di distribusi kernel source di subdirectory dengan nama configs di top-level source directory.

Jika kita mengcompile untuk PowerPC, kita mempunyai banyak sekali config default dari arch/ppc/configs. Perintah

make defconfig akan mengcopy default file ppc config ke .config.

Tip untuk konfigurasi kernel • Selalu aktifkan "Prompt for development... drivers". • Sejak kernel 2.6.8, kita dapat menambahkan string sendiri (seperti inisial anda) di "Local version - append to kernel release" untuk personalisasi string versi kernel (untuk kernel yang lama, kita harus mengedit kalimat EXTRAVERSION di Makefile). • Selalu matikan module versioning, tapi selalu nyalakan kernel module loader, kernel modules dan module unloading. • Di bagian kernel hacking, nyalakan semua opsi kecuali "Use 4Kb for kernel stacks instead of 8Kb". Jika kita menggunakan mesin yang pelan, jangan nyalakan "Debug memory allocations". • Matikan fitur yang tidak kita butuhkan. • Hanya gunakan module, jika kita mempunya alasan yang kuat untuk menggunakan module. Contoh, kita sedang mengerjakan sebuah driver, kita ingin me-load versi baru tanpa rebooting. • Pastikan secara teliti kita memilih tipe processor yang benar. Cari tahu jenis processor yang kita pakai menggunakan perintah

cat /proc/cpuinfo.

• Cari tahu PCI device apa yang kita install, gunakan perintah

lspci -v. • Cari tahu kernel yang kita buat apakah sudah di compile dengan baik menggunakan perintah

dmesg | less.

• Kebanyakan device driver akan print out message ketika dia mendeteksi sebuah device.

Jika semua gagal, copy file .config dari teman yang sudah berhasil mengcompile kernel-nya.

Compile Kernel Pada bagian ini akan di terangkan cara mengcompile kernel Linux menggunakan versi yang terbaru khususnya 3.8.x ke atas di Ubuntu.

Source code kernel (inti) sistem operasi Linux dapat di ambil secara bebas dari situs http://www.kernel.org. Proses / langkah membuat sistem operasi Linux dengan cara meng-compile kernel dapat di lakukan di sistem operasi linux yang kita operasikan dan menjalankan perintah- perintah berikut.

Jika anda belum menjadi root, lakukan

sudo su

Proses compile kernel dilakukan dengan user root.

Update repository

apt-get update

Biasanya ini tidak di perlukan, set supaya /bin/sh menjadi /bin/bash jika di perlukan

rm -f /bin/sh ln -s /bin/bash /bin/sh

Siapkan kernel package

apt-get update apt-get install kernel-package libncurses5-dev fakeroot wget bzip2 \ fakeroot kernel-wedge build-essential makedumpfile libncurses5

Download dan copy source code kernel

cd /usr/src rm -Rf /usr/src/linux wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.2.tar.xz tar xJf linux-4.9.2.tar.xz -C /usr/src ln -s /usr/src/linux-4.9.2 /usr/src/linux

Kemungkinan besar pada saat kita melakukan compile kernel. Versi kernel yang digunakan sudah akan sangat tinggi. Biasanya tidak berubah cara mengcompilenya, Compile kernel di Linux kira- kira sebagai berikut,

cd /usr/src/linux cp -vi /boot/config-`uname -r` ./.config

Langkah cp /boot/config* dibutuhkan jika kita ingin konfigurasi kernel yang digunakan sama dengan konfigurasi kernel dari system operasi yang sedang kita gunakan. Kita dapat meloncati hal ini dan langsung ke make menuconfig.

cd /usr/src/linux make menuconfig make-kpkg clean

Bagi anda yang ingin mengcompile seluruh source code Linux yang ada dapat melakukan perintah di bawah ini,

cd /usr/src/linux make all

Pada awal compile kernel kadang kala kita harus menjawab pertanyaan konfigurasi kalau ternyata konfigurasi kernel yang kita gunakan agak berbeda dengan konfigurasi kernel yang lama.

Jika kita mengcompile seluruh kernel maka akan memakan waktu yang amat sangat lama, bisa mencapai 2-3 jam atau lebih. Sabar. Saya biasanya lebih suka membiarkan proses compile satu malam :) ..

Alternatif lain, kita dapat mengcompile sesuai dengan konfigurasi yang kita inginkan saja melalui perintah di bawah ini cd /usr/src/linux fakeroot make-kpkg --initrd --append-to-version=-custom kernel-image kernel-headers

Sangat di sarankan untuk tidak melakukan “make all” tapi langsung ke “fakeroot” saja. Setelah fakeroot selesai, kita dapat menginstalasi header dan kernel menggunakan perintah dibawah ini

cd /usr/src dpkg -i linux-image-3.9.3-custom_3.9.3-custom-10.00.Custom_amd64.deb dpkg -i linux-headers-3.9.3-custom_3.9.3-custom-10.00.Custom_amd64.deb

File deb linux-image dan linux-headers mungkin akan berbeda dengan yang ada di atas. Sebaiknya pastikan dulu nama yang benar-nya dengan melakukan

cd /usr/src ls

Sekali lagi, pastikan nama file linux-image dan linux-headers-nya apa sebelum menjalankan perintah “dpkg ­i”

Terakhir yang perlu kita lakukan adalah meng-update GRUB dengan perintah,

update-grub

Fungsi dari perintah update-grub adalah agar sistem operasi yang baru kita buat masuk dalam pilihan pada saat booting.

Jika perintah di atas sudah dilakukan, kita tidak perlu lagi melakukan perintah di bawah ini. Kalau mau iseng mencoba mengedit juga bisa mengubah file,

vi /boot/grub/grub.cfg

Selesai sudah proses compile kernel. Langkah terakhir yang perlu kita lakukan hanya shutdown dan reboot komputer menggunakan perintah

shutdown -r now

Setelah reboot & masuk lagi ke shell dan cek versi sistem operasi yang kita gunakan menggunakan perintah

uname -r akan keluar versi kernel yang anda gunakan, misalnya

4.9.2-custom

Referensi

• http://www.linuxchix.org/content/courses/kernel_hacking/lesson2 • http://news.softpedia.com/news/How-to-Rebuild-Nvidia-Driver-s-Kernel-Module-Using- DKMS-317887.shtml • http://www.linuxchix.org/content/courses/kernel_hacking/lesson2 • http://embedid.net/2010/06/01/linux-kernel-dari-mula-bagian-1/ • http://embedid.net/2010/06/01/linux-kernel-dari-mula-bagian-2/ BAB 6: REMASTER LINUX

Dalam pengertian yang sederhana, remaster Linux adalah membuat ulang Linux dari Linux yang sudah jadi. Remaster terutama dibutuhkan jika kita ingin membuat Linux yang spesifik untuk kebutuhan tertentu yang tidak bisa di penuhi oleh installer Linux yang normal yang biasanya dibuat untuk kebutuhan yang umum saja.

Contoh, Linux untuk kebutuhan pendidikan SD, untuk pendidikan SMP, untuk penelitian bidang matematika, untuk Point of Sale (kasir) di warung dll. Jadi melalui proses remaster, kita dapat membuat installer Linux yang khusus untuk kebutuhan kita, sehingga cukup dengan menginstalasi Linux tersebut semua aplikasi yang dibutuhkan bisa langsung siap digunakan.

Salah satu aplikasi yang relatif sederhana untuk melakukan remastering Linux, khususnya Ubuntu, adalah Ubuntu Customization Kit (UCK). Tentunya masih banyak aplikasi sejenis yang bisa kita gunakan. Pada kesempatan ini akan di jelasnkan cara remastering Ubuntu menggunakan UCK.

Remaster Ubuntu Linux Menggunakan UCK Cara paling mudah untuk melakukan Remaster Linux Ubuntu adalah dengan menggunakan aplikasi Ubuntu Customization Kit (UCK). Pada bagian ini akan di terangkan betapa mudah-nya melakukan proses remaster menggunakan UCK.

Beberapa hal yang perlu kita lakukan agar dapat melakukan proses remaster dengan lancar, antara lain adalah:

• Siapkan file iso Ubuntu yang akan kita remaster. Misalnya kita simpan dalam folder dengan nama /directori_penyimpanan/. • Pastikan kita mempunyai akses ke repository Ubuntu. Akan lebih baik lagi jika kita mempunyai sendiri repository lokal di jaringan LAN. • Install UCK melalui perintah

sudo apt-get install uck

• Buang folder tmp di home directory, menggunakan perintah

sudo rm -Rf tmp

Selanjutnya, kita dapat melakukan Remaster Ubuntu. Langkah yang perlu dilakukan adalah

• Pastikan kita sebagai user biasa, bukan super user. Pastikan prompt tempat kita bekerja adalah $. Kemudian pindah ke home directory,

$ cd ~

• Unpack file iso Ubuntu agar dapat di remaster, menggunakan perintah,

sudo uck-remaster-unpack-iso /direktori_penyimpanan/ubuntu-16.04-desktop-amd64.iso sudo uck-remaster-unpack-rootfs sudo uck-remaster-unpack-initrd sudo uck-remaster-chroot-rootfs • Setelah chroot-rootfs kita akan masuk ke prompt

#

Prompt # ini dapat kita lihat sebagai representasi sistem operasi dari file iso yang akan kita remaster. Dengan kata lain, prompt # ini bukan lagi komputer yang kita gunakan. Konsekuensinya proses remaster harus kita selesaikan sampai selesai, tidak bisa di tunda, atau di shutdown sebelum selesai. Jika sampai di shutdown / di tunda, biasanya kita harus mengulang lagi semua proses dari awal.

• Kita dapat menset sumber repository, dengan cara mengcopy sources.list asli, kemudian mengedit sources.list ke arah repository yang kita inginkan. Sarannya, kita menggunakan repository lokal di LAN agar proses instalasi software dapat dilakukan dengan cepat dan mudah.

cp /etc/apt/sources.list /etc/apt/sources.list.original vi /etc/apt/sources.list

• Setelah sources.list di edit dengan benar, kita dapat menambahkan software yang anda suka misalnya dengan perintah

# apt-get install namaaplikasiyangandaingintambahkan

• Setelah semua proses dan aplikasi yang kita inginkan selesai di instalasi, kita dapat mengembalikan semua setup yang ada agar siap di pack kembali menjadi file iso, melalui perintah berikut,

cp /etc/apt/sources.list.original /etc/apt/sources.list rm /etc/apt/sources.list.original umount /proc umount /sys exit

• Pack apa yang kita kerjakan menjadi file iso lagi. Hal ini akan membutuhkan waktu beberapa lama terutama di bagian pack-rootfs. Perintah yang perlu kita kerjakan adalah

sudo uck-remaster-pack-initrd sudo uck-remaster-pack-rootfs sudo uck-remaster-pack-iso namaisohasilremasterubuntu.iso

File iso distro baru yang sudah kita buat sendiri biasanya ada di folder

cd ~/tmp/remaster-new-files ls

Aplikasi Untuk Pendidikan Untuk aplikasi pendidikan, baik itu tingkat SD seperti tuxmath, tuxpaint atau tingkat perguruan tinggi seperti wxmaxima, scilab dll. Kita dapat menginstalasi satu per satu aplikasi-nya setelah melalui chroot-rootfs menggunakan perintah apt-get install gstreamer0.10-ffmpeg gstreamer0.10-fluendo-mp3 apt-get install gstreamer0.10-plugins-bad gstreamer0.10-plugins-ugly apt-get install ubuntu-edu-primary ubuntu-edu-secondary apt-get install ubuntu-edu-tertiary maxima science-config kgeography apt-get install science-astronomy science-biology science-electronics apt-get install science-engineering science-geography science-chemistry apt-get install science-dataacquisition science-linguistics apt-get install science-mathematics science-meteorology apt-get install science-neuroscience-cognitive science-physics apt-get install science-robotics science-imageanalysis apt-get install science-numericalcomputation science-statistics apt-get install science-typesetting science-viewing apt-get install ksnapshot kgeography atau sekaligus dengan satu perintah saja, seperti

apt-get install gstreamer0.10-ffmpeg gstreamer0.10-fluendo-mp3 \ gstreamer0.10-plugins-bad gstreamer0.10-plugins-ugly

apt-get install ubuntu-edu-primary ubuntu-edu-secondary \ ubuntu-edu-tertiary maxima science-config kgeography \ science-astronomy science-biology science-electronics \ science-engineering science-geography science-chemistry \ science-dataacquisition science-linguistics science-mathematics \ science-meteorology science-neuroscience-cognitive science-physics \ science-robotics science-imageanalysis science-numericalcomputation \ science-statistics science-typesetting science-viewing ksnapshot \ kgeography

Salah satu distro turunan Ubuntu yang dibuat menggunakan teknik Remaster yang khusus untuk pendidikan antara lain adalah ipteknux.

Aplikasi untuk Usaha / Bisnis Salah satu distro Linux turunan Ubuntu yang dibuat menggunakan teknik Remaster yang khusus untuk usaha / bisnis adalah SMEOnffLine. SMEOnffLine di targetkan untuk menjadi server, bukan sekedar desktop biasa. Oleh karenanya, proses instalasinya lebih rumit daripada aplikasi biasa.

Dengan asumsi bahwa IP address distro yang dibuat nantinya 192.168.0.254, Contoh berikut adalah instalasi server Prestashop yang digunakan di SMEOnffline yang di install saat proses remaster dilakukan. Langkah yang perlu dilakukan adalah,

• Instalasi aplikasi pendukung

apt-get install apache2 mysql-server libmysqlclient15-dev \ libphp-adodb libgd2-xpm libgd2-xpm-dev \ php5-mysql php5-gd php5- php-pear vsftpd

• Download source code Prestashop dari

http://www.prestashop.com/en/downloads/

• Copy source code

cp prestashop_1.2.5.0.zip /var/www/ cd /var/www/ unzip prestashop_1.2.5.0.zip

chown -Rf www-data.www-data /var/www/prestashop chmod -Rf 744 /var/www/prestashop/config chmod -Rf 744 /var/www/prestashop/tools/smarty/compile chmod -Rf 744 /var/www/prestashop/sitemap.xml chmod -Rf 744 /var/www/prestashop/img chmod -Rf 744 /var/www/prestashop/mails chmod -Rf 744 /var/www/prestashop/modules chmod -Rf 744 /var/www/prestashop/themes/prestashop/lang chmod -Rf 744 /var/www/prestashop/translations chmod -Rf 744 /var/www/prestashop/upload chmod -Rf 744 /var/www/prestashop/download

• Siapkan database MySQL untuk Prestashop melalui perintah,

# mysql -u root -p123456 create database prestashop; grant ALL on root.* to prestashop@localhost; grant ALL on prestashop.* to prestashop@localhost identified by 'prestashop'; grant ALL on prestashop.* to prestashop identified by 'prestashop'; exit • Melanjutkan Instalasi Melalui Web. Masuk ke situs prestashop untuk menyelesaikan instalasi

http://192.168.0.254/prestashop

• Masukan data tentang database yang digunakan

Database server name : localhost Database name : prestashop Login : prestashop Password : prestashop PrestaShop database tables prefix : ps_

• Masukan data user pertama PrestaShop, misalnya,

Shop name : UKMShop First name : admin Last name : ADMIN E-mail : [email protected] Password : Admin123456

• Selesai sudah proses instalasi Prestashop, kita dapat men-delete folder install

rm -Rf /var/www/prestashop/install mv /var/www/prestashop/admin /var/www/prestashop/admin123

Akses Admin Web dapat melalui alamat

http://192.168.0.254/prestashop/admin123 Referensi • http://lms.onnocenter.or.id/wiki/index.php/Remastering_Ubuntu • http://lms.onnocenter.or.id/wiki/index.php/Distro_SchoolOnffLine • http://lms.onnocenter.or.id/wiki/index.php/Distro_IPTEKNux • http://lms.onnocenter.or.id/wiki/index.php/Cara_Cepat_Melakukan_Remastering_Ubuntu • http://lms.onnocenter.or.id/wiki/index.php/Distro_SMEOnffLine BAB 7: OPENWRT SISTEM OPERASI UNTUK ROUTER

Pada bagian ini, kita akan membahas secara mendalam khususnya tentang cara membuat sistem operasi untuk router / sistem embedded. Dalam hal ini kita akan menggunakan sistem operasi OpenWRT yang dapat kita buat sendiri. OpenWrt dapat dilihat sebagai distribusi Linux untuk device embedded seperti router.

Daripada membuat sebuah firmware yang statik. OpenWRT menyediakan filesystem yang dapat ditulis dengan manajemen paket. Hal ini akan membebaskan kita dari vendor untuk bisa memilih dan mengkonfigurasi aplikasi sehingga dapat mengcustomisasi device melalui penggunaan aplikasi yang cocok.

Untuk para Developer: OpenWRT adalah sebuah framework untuk membuat aplikasi tanpa pusing untuk membuat firmware-nya. Untuk user hal ini berarti kemungkinan untuk meng-customisasi secara penuh, untuk menggunakan device untuk hal-hal yang mungkin belum pernah dipikirkan sebelumnya.

Download Firmware OpenWRT yang sudah jadi Bagi mereka yang tidak mau mengambil resiko, kita dapat saja mendownload firmware openwrt yang sudah jadi. Firmware yang sudah jadi biasanya mempunyai fasilitas standard, tapi umumnya tidak mempunyai fasilitas untuk mendukung MESH / FreiFunk. Bagi mereka yang ingin mengoperasikan MESH mau tidak mau pilihan yang ada adalah mengcompile firmware yang dibutuhkan.

Bagi mereka yang cukup dengan mendownload Firmware OpenWRT yang sudah jadi, langkah yang perlu dilakukan adalah

• Masuk ke http://wiki.openwrt.org/toh/start cari device anda apakah masuk dalam daftar device yang di dukung (support). Perlu di catat bahwa tidak semua device di dukung oleh OpenWRT.

• Masuk ke http://downloads.openwrt.org/snapshots/trunk/ untuk mengambil file .img dari firmware yang di maksud. Tergantung chipset / processor yang digunakan, contoh,

UBNT2 http://downloads.openwrt.org/snapshots/trunk/atheros/ UBNT http://downloads.openwrt.org/snapshots/trunk/ar71xx/ Buffalo http://downloads.openwrt.org/snapshots/trunk/ar71xx/

Sekali lagi, semua file .img yang di sediakan oleh OpenWRT tidak mendukung MESH. Untuk operasi MESH mau tidak mau kita harus mengcompile sendiri sistem operasi OpenWRT.

Beberapa Tip untuk Membuat / Build Firmware OpenWRT WARNING: Proses build firmware tampaknya tidak mungkin dilakukan secara OFFLINE. Build firmware akan banyak membutuhkan akses ke Internet untuk men-download berbagai aplikasi, termasuk waktu proses make. Yang tampaknya akan mengambil bandwidth yang cukup banyak adalah men-download kernel Linux waktu compile toolchain.

Prosedur standard yang biasa dilakukan untuk membuat / build firmware OpenWRT adalah sebagai berikut: • Lakukan pada komputer yang mempunya harddisk free 30Gbyte • Sistem Operasi Ubuntu lumayan aman untuk digunakan mengcompile OpenWRT. • Lakukan sebagai non-root user • Lakukan semua perintah di misalnya ~/openwrt/trunk/ • Sebaiknya lakukan dari fresh source code. Jadi buang terlebih dahulu , kemudian refresh dari sumber di Internet. • Update OpenWrt source • Update & install package feeds. • Configure build. • Start build. Ini akan secara automatis compile Ttoolchain, cross-compile sources, package packages, dan generate image siap untuk di flashed. • Lakukan instalasi OpenWrt atau Flash Firmware OpenWRT ke Device.

Sebelum proses build dilakukan kita perlu mempersiapkan berbagai aplikasi pendukung build dari OpenWRT, perintah yang perlu di jalankan adalah:

sudo su apt-get update apt-get install subversion gawk flex sharutils bison \ libz-dev patch fakeroot lzma git-core build-essential

Jika kita menggunakan Subversion (SVN) dalam melakukan proses build. Sebagai user biasa, kita dapat menjalankan perintah berikut,

svn co svn://svn.openwrt.org/openwrt/branches/backfire ~/openwrt/trunk/ cd ~/openwrt/trunk/ ./scripts/feeds update ./scripts/feeds install ... make defconfig make menuconfig make world

Source Code OpenWRT sering di update oleh para developer-nya, untuk itu di sarankan secara periodik atau sebelum kita mengcompile kita perlu mengupdate SVN. Ini dapat dilakukan menggunakan perintah

cd ~/openwrt/trunk/ svn update ./scripts/feeds update

Proses compile menggunakan SVN cukup baik hasilnya. Jika kita berjiwa petualang murni dan berani mengambil resiko, kita dapat menggunakan GIT dalam mendownload source code OpenWRT, kita dapat mengunakan perintah berikut,

git clone git://nbd.name/openwrt.git ~/openwrt/trunk/ cd ~/openwrt/trunk/ ./scripts/feeds update ./scripts/feeds install ... make menuconfig packages/features make world

Kita dapat mengupdate GIT menggunakan perintah, cd ~/openwrt/trunk/ git pull ./scripts/feeds update

Salah satu hal yang akan membuat frustasi dalam mengcompile OpenWRT adalah harus mendownload banyak source code yang memakan waktu lama. Terutama,

80MB http://launchpad.net/gcc-linaro 60MB ftp://ftp.all.kernel.org/pub/linux/kernel/v3.x/

Sebaiknya source code tersebut di ambil secara manual dan kita letakan di folder dl di folder OpenWRT, misalnya

~/openwrt.trunk/trunk/dl/

Berikut adalah beberapa tip yang mungkin akan bermanfaat dalam proses compile OpenWRT.

Kita dapat menentukan / menset chipset mana yang akan kita gunakan. Di target/linux/chipname/, ada makefile yang mengatakan kernel mana yang akan dibuat, contoh di Kamikaze tepatnya kamikaze/target/linux/atheros/Makefile.

LINUX_VERSION:=2.6.23.17

Ubah ini sesuai dengan subversion yang anda inginkan.

Bagi anda yang beruntung mempunyai komputer / laptop dengan processor yang multi-core CPU, proses build dapat di percepat dengan menjalankan beberapa concurrent job process mengunakan option -j seperti

make -j 3 world

Gunakan standard formula . Jika cara ini menyebabkan error saat build, coba compile tanpa option -j.

Jika anda ingin menggunakan sistem / mesin anda waktu anda build, kita dapat membuat proses build hanya menggunakan I/O dan kapasitas CPU yang ide, contoh untuk CPU dualcore:

ionice -c 3 nice -n 20 make -j 2

Saat kita melakukan developing atau packaging software untuk OpenWrt, akan lebih memudahkan jika kita dapat membuat untuk package yang kita inginkan saja (misalnya untuk package cups):

make package/cups/compile V=99

Untuk package mc (midnight commander), yang kebetulan berada feed packages perintahnya akan seperti

make package/feeds/packages/mc/compile v=99

Jika build gagal, cara yang paling gampang untuk melihat error adalah melalui perintah

make V=99 2>&1 | tee build.log | grep -i error Perintah di atas akan menyimpan copy full verbose dari output build (dengan stdout di pipe ke stderr) di /openwrt/trunk/build.log dan hanya memperlihatkan error saja ke screen. Cara lain adalah menggunakan perintah,

ionice -c 3 nice -n 20 make -j 2 V=99 CONFIG_DEBUG_SECTION_MISMATCH=y 2>&1 | tee build.log | egrep -i '(warn|error)'

Cara di atas menyimpan copy full verbose dari output build (dengan stdout di pipe ke stderr) di build.log dan akan mengeluarkan hanya warning dan error saat building menggunakan resource background di dual core CPU.

Tergantung pada CPU yang kita gunakan, proses build akan memakan waktu sebentar, atau lama. Jika kita menginginkan notifikasi suara, kita dapat menggunakan echo -e '\a':

make V=99 ; echo -e '\a'

Jika berhasil, maka image firmware yang kita buat akan berada di bawah directory

/bin

Jika kita buat firmware untuk ar71xx maka ada di bawah

/bin/ar71xx

Jika adalah /openwrt/trunk, maka binary ada di

/openwrt/trunk/bin/ar71xx

Kadang kita ingin membersihkan lingkungan build. Contoh berikut akan sangat berguna. Untuk mendelete isi bin dan directory build_dir, gunakan,

make clean

Untuk mendelete isi /bin dan /build_dir directory juga /staging_dir dan /toolchain (=cross-compile tool). 'Dirclean' adalah untuk memperoleh "Full clean".

make dirclean atau dapat juga dengan memaksa menggunakan perintah

make FORCE=1 dirclean

Yang lebih ekstrim, jika kita ingin menghancurkan semua yang pernah kita compile atau configure dan delete semua content feed dan package source yang pernah kita download.

make distclean

PERHATIAN: Perintah ini akan menghapus build configuration (.config)

Build Firmware OpenWRT untuk Buffalo WZRHPG300NH2 Dalam contoh ini akan di perlihatkan cara compile firmware Buffalo WZR HP G300NH2 untuk keperluah MESH dengan OLSRD. oleh karenanya membutuhkan aplikasi seperti • luci • olsrd • freifunk

Khusus untuk Buffalo WZR HP G300NH2 kita perlu memastikan pada saat konfigurasi kernel, agar,

• Compile untuk AR71xx • Profile WZR HP G300NH2 • Driver wireless Atheros AR9381? di install. • Network olsrd

Sebelum proses compile dilakukan kita perlu menginstalasi aplikasi pendukung untuk proses compile melalui perintah

sudo su apt-get update apt-get install subversion gawk flex sharutils bison libz-dev \ zlib1g-dev patch fakeroot lzma git-core build-essential \ unzip libncurses5-dev curl

Akan lebih baik hasilnya jika kita mengcompile menggunakan development trunk. Sebagai user biasa, kita dapat melakukan

svn co svn://svn.openwrt.org/openwrt/trunk/ ~/openwrt.trunk/trunk cd ~/openwrt.trunk/trunk/ ./scripts/feeds update ./scripts/feeds install meshwizard openssh-server openssh-client ./scripts/feeds install freifunk-common freifunk-gwcheck ./scripts/feeds install freifunk-mapupdate ./scripts/feeds install luci luci-app-meshwizard luci-app-olsr ./scripts/feeds install luci-app-olsr-services luci-app-olsr-viz ./scripts/feeds install luci-app-freifunk-policyrouting luci-mod-freifunk ./scripts/feeds install luci-theme-freifunk-generic olsrd ./scripts/feeds install olsrd-mod-txtinfo olsrd-mod-dyn-gw ./scripts/feeds install olsrd-mod-dyn-gw-plain olsrd-mod-dot-draw ./scripts/feeds install olsrd-mod-arprefresh olsrd-mod-watchdog ./scripts/feeds install olsrd-mod-tas olsrd-mod-httpinfo ./scripts/feeds install olsrd-mod-pgraph olsrd-mod-secure olsrd-mod-bmf ./scripts/feeds install luci-app-upnp minidlna miniupnpc miniupnpd ./scripts/feeds install luci-app-minidlna usbutils multiwan ./scripts/feeds install libdlna libgupnp libgupnp-dlna rtorrent ./scripts/feeds install usb-modeswitch usb-modeswitch-data ./scripts/feeds install 6in4 6rd 4th 6to4 6tunnel libdaemon ./scripts/feeds install pptpd ppp-mod-pptp make defconfig make menuconfig make clean make -j 3 world

Kita perlu menunggu beberapa lama sampai seluruh proses compile selesai dilakukan. Sebetulnya yang lebih penting adalah pada saat kita mengkonfigurasi kernel melalui perintah menuconfig, khusus untuk keperluan kita maka menuconfig Firmware Buffalo WZRHPG300GNH2 di konfigurasi agar mendukung, • OLSR • WebGUI LuCI • Modem 3G • PPTP untuk VPN • UPnP dan miniDLNA untuk Media Server

Lebih detail-nya pada saat mengkonfigurasi menuconfig, kita perlu mengaktifkan menu

Target System > Atheros AR7xxx/AR9xxx Subtarget > Generic Target Profile > Buffalo WZR-HP-G300NH2 Target Images > tar.gz Network > chat ppp ppp-mod-pppoa ppp-mod-pppoe ppp-mod-pppol2tp ppp-mod-pptp ppp-mod-radius ppp-multilink pppdump pppstats Network > Routing and Redirection > ip Network > Routing and Redirection > relayd Network > Routing and Redirection > olsrd Network > Routing and Redirection > olsrd > olsrd-mod-arprefresh olsrd-mod-bmf olsrd-mod-dot-draw olsrd-mod-dyn-gw olsrd-mod-dyn-gw-plain olsrd-mod-httpinfo olsrd-mod-jsoninfo olsrd-mod-mdns olsrd-mod-nameservice olsrd-mod-p2pd olsrd-mod-pgraph olsrd-mod-pud olsrd-mod-quagga olsrd-mod-secure olsrd-mod-sgwdynspeed olsrd-mod-txtinfo olsrd-mod-watchdog Network > SSH > openssh-server Network > VPN > openvpn-easy-rsa openvpn-nossl openvpn-openssl openvpn-polarssl pptpd Network > Time Synchronization > ntpclient Network > Web Servers/Proxies > uhttpd uhttpd-mod-lua uhttpd-mod-tls uhttpd-mod-ubus Network > hostapd hostapd-mini hostapd-utils multiwan samba36-client samba36-server tc vnstat vnstati wshaper LuCI > 1. Collections > luci luci-ssl 2. Modules > luci-mod-freifunk 3. Applications > luci-app-commands luci-app-freifunk-diagnostics luci-app-freifunk-policyrouting luci-app-meshwizard luci-app-multiwan luci-app-ntpc luci-app-olsr luci-app-olsr-services luci-app-olsr-viz luci-app-p2pblock luci-app-samba luci-app-statistics luci-app-upnp luci-app-vnstat luci-app-wshaper 4. Themes > luci-theme-bootstrap luci-theme-freifunk-bno luci-theme-freifunk-generic 6. Protocols > luci-proto-3g 7. Server Interfaces > luci-sgi-uhttpd 9. Freifunk > luci-mod-freifunk-community meshwizard Kernel modules > Filesystems > kmod-fs-ntfs kmod-fs-vfat Kernel modules > Wireless Drivers > kmod-ath9k-htc kmod-ath9k-common kmod-ath9k Kernel modules > Network Support > kmod-bridge kmod-pptp Kernel Modules > USB Support > kmod-usb-serial kmod-usb-serial-ipw kmod-usb-serial-option kmod-usb-serial-qualcomm kmod-usb-serial-wwan kmod-usb-acm kmod-usb-storage kmod-usb-storage-extras Mail > msmtp msmtp-nossl msmtp-queue

Build Firmware OpenWRT untuk Linksys WRT160NL Dalam contoh ini akan di perlihatkan cara compile firmware Linksys WRT160NL untuk keperluan MESH dengan OLSRD. oleh karenanya membutuhkan aplikasi seperti

• luci • olsrd • freifunk

Pastikan

• Compile untuk AR71xx • Profile Linksys WRT160NL • Driver wireless Atheros AR9381? di install. • Network olsrd

Siapkan aplikasi pendukung, lakukan sudo su apt-get update apt-get install subversion gawk flex sharutils bison libz-dev \ zlib1g-dev patch fakeroot lzma git-core build-essential unzip

Compile menggunakan Development Trunk. Development Trunk tampaknya paling RECOMMENDED. Lakukan perintah berikut sebagai user biasa,

svn co svn://svn.openwrt.org/openwrt/trunk/ ~/openwrt.trunk/trunk cd ~/openwrt.trunk/trunk/ ./scripts/feeds update ./scripts/feeds install meshwizard openssh-server openssh-client . . dst sama dengan di atas . . make -j 3 world

Menuconfig untuk Firmware Linksys WRT160NL untuk OLSR dilengkapi dengan WebGUI LuCI, Penggunaan Modem 3G agak berbeda sedikit dengan Buffalo di atas.

Target System > Atheros AR7xxx/AR9xxx Subtarget > Generic Target Profile > Linksys WRT160NL Target Images > tar.gz Base system > bridge Base system > wireless tools . . dst .. . . 6. Protocols > luci-proto-3g . . Kernel Modules > USB Support > kmod-usb-serial kmod-usb-serial-ipw kmod-usb-serial-option kmod-usb-serial-qualcomm kmod-usb-serial-wwan Utilities > iwinfo

Update SVN jika di perlukan, kita dapat melakukan di folder trunk sebagai berikut,

cd ~/openwrt.trunk/trunk/ svn cleanup svn update ./scripts/feeds update

Lokasi Image hasil compile akan berada di

~/openwrt.trunk/trunk/bin/ar71xx/

Tepatnya

~/openwrt.trunk/trunk/bin/ar71xx/openwrt-ar71xx-generic-wrt160nl-squashfs-factory.bin ~/openwrt.trunk/trunk/bin/ar71xx/openwrt-ar71xx-generic-wrt160nl-squashfs-sysupgrade.bin

Build Firmware OpenWRT untuk Ubiquiti NanoStation2 Dalam contoh ini akan di perlihatkan cara compile firmware Ubiquiti NanoStation2 untuk keperluan MESH dengan OLSRD. Karena memory yang ada dalam Ubiquiti NanoStation2 relatif kecil, kita perlu menghilangkan interface Web agar kita mempunyai cukup tempat untuk OLSR yang kita butuhkan. Aplikasi yang kita butuhkan adalah

• olsrd • meshwizard

Khusus untuk Ubiquiti kita perlu memastikan,

• Target System Atheros AR231x/AR5312 • Profile UBNT • Driver wireless Atheros AR9381? di install. • Network olsrd

Sebelum proses compile dapat dilakukan, kita perlu mengcompile aplikasi pendukung seperti,

sudo su apt-get update apt-get install subversion gawk flex sharutils bison libz-dev \ zlib1g-dev patch fakeroot lzma git-core build-essential unzip \ libncurses5-dev

Agar hasilnya baik, tidak banyak bug & masalah, sangat di sarankan untuk mengcompile OpenWRT menggunakan Development Trunk. Sebagai user biasa kita dapat melakukan

svn co svn://svn.openwrt.org/openwrt/trunk/ ~/openwrt.trunk/trunk cd ~/openwrt.trunk/trunk/ ./scripts/feeds update ./scripts/feeds install meshwizard openssh-server openssh-client . . dst sama dengan di atas . . make -j 3 world

Bagian yang paling penting sebetulnya saat kita mengkonfigirasi menuconfig. Agar lebih ringan ke UBNT sangat disarankan untuk tidak mengcompile / memasukan WebGUI ke firmware. Maka menuconfig untuk UBNT2 menjadi jauh lebih sederhana sebagai berikut,

Target System > Atheros AR231x/AR5312 Target Profile > Default Target Images > tar.gz Base system > bridge Network > Routing and Redirection > ip Network > Routing and Redirection > relayd Network > Routing and Redirection > olsrd Network > Routing and Redirection > olsrd > olsrd-mod-arprefresh olsrd-mod-bmf olsrd-mod-dot-draw olsrd-mod-dyn-gw olsrd-mod-dyn-gw-plain olsrd-mod-httpinfo olsrd-mod-jsoninfo olsrd-mod-mdns olsrd-mod-nameservice olsrd-mod-p2pd olsrd-mod-pgraph olsrd-mod-quagga olsrd-mod-secure olsrd-mod-tas olsrd-mod-txtinfo olsrd-mod-watchdog Network > SSH > openssh-server Network > hostapd Network > Time Synchronization > ntpclient Kernel modules > Wireless Drivers > kmod-ath9k-htc kmod-ath9k-common kmod-ath9k Kernel modules > Network Support > kmod-bridge Utilities > iwinfo

Setelah selesai proses compile, maka lokasi image firmware OpenWRT biasanya ada di

cd ~/openwrt.trunk/trunk/bin/atheros/

Jika telah berhasil di compile, akan terlihat firmware OpenWRT untuk UBNT2 sebagai berikut,

openwrt-atheros-ubnt2-squashfs.bin

Flash Firmware OpenWRT ke Buffalo WZRHP300NH2 Bagian paling ber-”bahaya” adalah memasukan firmware OpenWRT ke Device yang kita inginkan. Istileh teknik-nya adalah mem-”flash” firmware OpenWRT. Masing-masing device akan mempunyai cara yang berbada. Disini akan diperlihatkan cara mem-”flash” firmware OpenWRT ke Buffalo WZRHPG300NH2.

Buffalo cukup aman untuk di flash. Jika kita salah mem-flash, kita dapat mengulangi proses flash tanpa takut device menjadi rusak. Hal ini biasanya tidak terjadi di device lain.

Untuk mem-”flash” Buffalo WZR HP G300NH2, pertama-tama yang perlu kita lakukan adalah membuat script sederhana, misalnya,

vi buatflashbuffalo.sh

Isi dengan perintah berikut

ifconfig eth0 192.168.11.2 arp -s 192.168.11.1 02:aa:bb:cc:dd:1a curl -T openwrt-ar71xx-generic-wzr-hp-g300nh2-squashfs-tftp.bin tftp://192.168.11.1 & ifconfig eth0 192.168.11.2 arp -s 192.168.11.1 02:aa:bb:cc:dd:1a ifconfig eth0 192.168.11.2 arp -s 192.168.11.1 02:aa:bb:cc:dd:1a .. di ulang terus 2 line di atas .. ifconfig eth0 192.168.11.2 arp -s 192.168.11.1 02:aa:bb:cc:dd:1a ifconfig eth0 192.168.11.2 arp -s 192.168.11.1 02:aa:bb:cc:dd:1a

Save script di tempat firmware OpenWRT Untuk Buffalo WZR HP G300NH2 tersebut berada. Langkah flash firmware OpenWRT untuk Buffalo WZR HP G300NH2 adalah sebagai berikut,

• Matikan Buffalo • Masukan kabel LAN PC ke LAN4 Buffalo yang pas sebelah Internet. • Pastikan LAN PC menggunakan IP statik 192.168.11.2 • Masuk ke folder tempat image openwrt berada. • Jadi superuser

sudo su

• Masukan power Buffalo • Tunggu sekitar 3-4 detik, kemudian jalankan

./buatflashbuffalo.sh

Jika berhasil, maka akan tampak pada layar

% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 6656k 0 0 100 6656k 0 336k 0:00:19 0:00:19 --:--:-- 483k 100 6656k 0 0 100 6656k 0 336k 0:00:19 0:00:19 --:--:-- 336k

Pastikan % yang dicapai adalah 100. Kadang kala susah untuk mencapai 100. Jika kita cek arp -n arp -n maka akan tampak

Address HWtype HWaddress Flags Mask Iface 192.168.11.1 ether 02:aa:bb:cc:dd:1a CM eth0

Pastikan Hwaddress adalah 02:aa:bb:cc:dd:1a. Untuk Buffalo tipe lain biasanya HWAddress yang bisa di flash akan berbeda, umumnya menggunakan format 02:aa:bb:cc:dd:xx.

Langkah selanjutnya adalah

• ping ke 192.168.1.1 sampai ada responds yang stabil

ping 192.168.1.1

• Telnet ke 192.168.1.1

telnet 192.168.1.1

• Reset password root menggunakan perintah

passwd

Selesai sudah proses flash firmware dan reset password root. Selanjutnya kita dapat mengakses Web atau SSH untuk mengkonfigurasi lebih lanjut.

Flash Firmware OpenWRT ke Linksys WRT160NL Teknik Flash firmware OpenWRT untuk keluarga besar Linksys rata-rata mirip / sama. Berikut ini adalah catatan flash firmware OpenWRT yang dilakukan untuk Linksys WRT160NL.

Agar dapat mem-flash LinkSys WRT160NL yang perlu dipastikan adalah,

• PC / laptop menggunakan IP address statik 192.168.1.254 • PC / laptop tidak menggunakan IP address dynamic.

Langkah yang perlu dilakukan untuk mem-flash firmware OpenWRT ke Linksys WRT160NL adalah,

• Matikan router • Sambungkan kabel LAN laptop ke LAN di router • rename firmware menjadi code.bin

cd openwrt.trunk/openwrt/bin/ar71xx cp openwrt-ar71xx-generic-wrt160nl-squashfs-factory.bin code.bin

• Lakukan flash yang sebenarnyta, ketik di shell

ifconfig eth0 192.168.1.254 echo -e "binary\nrexmt 1\ntimeout 60\ntrace\nput code.bin\n" | tftp 192.168.1.1 • Nyalakan router, tunggu beberapa saat sampai proses flash selesai.

Setelah firmware di upload ke Linksys, yang perlu kita lakukan hanya menunggu proses flashing sampai selesai untuk kemudian set password root agar kita bisa akses ke Web dan SSH. Langkah yang perlu dilakukan adalah,

• Tunggu sampai selesai proses tranfer. • Tunggu sampai router booting kembali • ping ke 192.168.1.1 tunggu sampai ada responds.

ping 192.168.1.1

• Jika ping sudah ada responds dan cukup stabil maka kemungkinan besar proses flashing berjalan dengan baik. • Telnet ke router 192.168.1.1

telnet 192.168.1.1

• Akan keluar tampilan berikut, kita dapat menset password root

=== IMPORTANT ======Use 'passwd' to set your login password this will disable telnet and enable SSH ------

BusyBox v1.19.4 (2013-04-10 08:27:23 WIT) built-in shell (ash) Enter 'help' for a list of built-in commands. ______| |.-----.-----.-----.| | | |.----.| |_ | - || _ | -__| || | | || _|| _| |______|| __|_____|__|__||______||__| |____| |__| W I R E L E S S F R E E D O M ------BARRIER BREAKER (Bleeding Edge, r36235) ------* 1/2 oz Galliano Pour all ingredients into * 4 oz cold Coffee an irish coffee mug filled * 1 1/2 oz Dark Rum with crushed ice. Stir. * 2 tsp. Creme de Cacao ------root@OpenWrt:/# passwd Changing password for root New password: Bad password: too weak Retype password: Password for root changed by root

Setelah root password diubah kita dapat mengakses Web & SSH.

Selesai sudah proses flashing firmware OpenWRT untuk LinkSys WRT160NL. Flash Firmware OpenWRT ke Ubiquity Flash firmware OpenWRT ke peralatan Ubiquiti secara umum hampir sama semua. Pada kesempatan ini, akan jelaskan cara flash firmware OpenWRT ke Ubiquiti NanoStation2. Langkah yang perlu dilakukan adalah sebagai berikut,

• Buat shell script sederhana yang isinya sebagai berikut ifconfig eth0 192.168.1.254 cp openwrt-ar71xx-generic-ubnt-nano-m-squashfs-factory.bin code.bin echo -e "binary\nrexmt 1\ntimeout 60\ntrace\nput code.bin flash_update\n" | tftp 192.168.1.20

• Lakukan chmod 777 shellscript.sh tersebut • Jalankan di folder tempat firmware berada • Nyalakan UBNT • Jika transfer berhasil maka lampu akan menyala ke kiri dan ke kanan terus menerus. • ping sampai ada responds.

ping 192.168.1.20 (utk firmware UBNT) ping 192.168.1.1 (utk firmware OpenWRT)

Setelah berhasil ping kita perlu menset password root dengan cara telnet ke UBNT yang kita flash

telnet 192.168.1.1

dan set password menggunakan perintah

passwd

Referensi • http://openwrt.org • http://wiki.openwrt.org/toh/start - Daftar Router yang bisa di Flash OpenWRT • https://forum.openwrt.org/viewtopic.php?id=15201 • http://wiki.openwrt.org/doc/howto/build • http://downloads.openwrt.org/docs/buildroot-documentation.html BAB 8: TUNING TASK SCHEDULER SISTEM OPERASI

Sistem operasi modern biasanya menjalankan tugas-tugas yang berbeda pada waktu yang bersamaan. Misalnya, Anda dapat mencari dalam sebuah file teks sambil menerima e-mail dan menyalin file besar ke hard drive eksternal. Tugas-tugas mudah tersebut memerlukan proses tambahan yang harus dijalankan oleh sistem. Untuk memberikan setiap tugas dengan sumber daya yang diperlukan , kernel Linux membutuhkan alat untuk mendistribusikan sumber daya sistem yang tersedia untuk tugas individu. Dan ini adalah tugas scheduler .

Mengapa tune kernel? Perilaku default kernel UNIX biasanya tidak optimal karena sulit untuk mengantisipasi jenis pekerjaan atau beban kerja yang akan diberikan kepada sistem operasi . Oleh karena itu, UNIX menyediakan parameter yang dapat mengubah alokasi sumber daya. Parameter kernel tuning adalah spesifik UNIX.

Administrator sistem bertanggung jawab untuk menentukan jenis target pekerjaan dan beban kerja untuk mesin dan untuk memantau apakah terjadi perubahan dari waktu ke waktu. Administrator sistem harus memastikan bahwa setiap parameter kernel diatur untuk mengoptimalkan kinerja mesin.

WARNING: Tuning Kernel merupakan topik lanjut dan tidak boleh dilakukan tanpa pemahaman lengkap tentang hal tersebut.

Kernel Tuning Secara Praktis Menggunakan sysctl Kernel Linux cukup fleksibel, kita bahkan dapat memodifikasi cara kerjanya sambil komputer jalan secara dinamis mengubah beberapa parameter, berkat perintah sysctl. Sysctl menyediakan sebuah antarmuka yang memungkinkan kita untuk memeriksa dan mengubah ratusan parameter kernel di Linux atau BSD. Perubahan segera berlaku, dan bahkan ada cara untuk membuat parameter tersebut tidak hilang setelah reboot. Dengan menggunakan sysctl secara bijak, kita dapat mengoptimalkan komputer tanpa harus mengkompilasi ulang kernel , dan mendapatkan hasilnya dengan cepat.

Untuk mendapatkan sedikit rasa parameter apa saja yang dapat di modifikasi oleh sysctl, jalankan sysctl -a

$ sysctl -a

Hasilnya

kernel.sched_child_runs_first = 0 kernel.sched_min_granularity_ns = 1500000 kernel.sched_latency_ns = 12000000 kernel.sched_wakeup_granularity_ns = 2000000 kernel.sched_tunable_scaling = 1 kernel.sched_migration_cost = 500000 kernel.sched_nr_migrate = 32 kernel.sched_time_avg = 1000 kernel.sched_shares_window = 10000000 kernel.timer_migration = 1 kernel.sched_rt_period_us = 1000000 kernel.sched_rt_runtime_us = 950000 kernel.sched_autogroup_enabled = 1 kernel.sched_cfs_bandwidth_slice_us = 5000 kernel.panic = 0 ... dan seterusnya ...

Jika kita ingin mendapatkan nilai hanya satu variabel, gunakan perintah seperti

sysctl vm.swappiness atau hanya

sysctl vm untuk daftar semua variabel yang dimulai dengan "vm." Tambahkan opsi -n untuk mengeluarkan hanya nilai variabel, tanpa nama,-N memiliki efek sebaliknya, dan menghasilkan nama-nama tapi tidak nilai.

Kita dapat mengubah nlai variabel dengan menggunakan opsi-w dengan sintaks

sysctl -w variable=nilai

Misalnya,

sysctl -w net.ipv6.conf.all.forwarding=1 set variabel menjadi benar / true (0 sama dengan "tidak" atau "salah", 1 berarti "ya" atau "benar") sehingga memungkinkan IP6 forwarding. Anda mungkin tidak membutuhkan opsi -w tampaknya akan usang.

Informasi lebih lanjut tentang sysctl dapat di baca dengan cara mengetik

man sysctl sysctl dan directory /proc Virtual directory /proc/sys juga memberikan interface ke parameter sysctl memungkinkan kita untuk melihat dan mengubah parameter tersebut. Contoh, file /proc/sys/vm/swappiness sama dengan parameter vm.swappiness parameter di sysctl.conf. Oleh karenanya, melakukan

echo 10 >/proc/sys/vm/swappiness sama dengan

sysctl -w vm.swappiness=10

Yang perlu kita perhatikan, jika file /proc/sys read-only, maka kita tidak akan bisa mengubahnya juga dengan sysctl.

Tulis

ls /proc/sys/kernel untuk melihat parameter kernel yang bisa kita ubah. Konfigurasi sysctl.conf Nilai paramter sysctl akan di load dari file /etc/sysctl.conf saat boot. File ini dapat memiliki baris kosong, komen (start dengan #), dan baris dengan format "variable=nilai" format. Contoh isi sysctl.conf adalah sebagai berikut,

# Disable response to broadcasts. net.ipv4.icmp_echo_ignore_broadcasts = 1

# enable route verification on all interfaces net.ipv4.conf.all.rp_filter = 1

# enable ipV6 forwarding net.ipv6.conf.all.forwarding = 1

# increase the number of possible (7) watches fs.inotify.max_user_watches = 65536

Jika kita ingin mengaktifkan / mereload parameter sysctl, dapat dilakukan dengan perintah

sysctl -p

Gambaran Teori Tuning Kernel Scheduler

Tujuan Scheduling Kernel Linux mengontrol cara task (atau proses) dikelola dalam sistem yang berjalan. Task scheduler, kadang-kadang disebut proses scheduler, adalah bagian dari kernel yang memutuskan task mana yang akan di jalankan berikutnya. Task scheduler adalah salah satu komponen inti dari sistem operasi multitasking (seperti Linux), yang bertanggung jawab untuk memanfaatkan sumber daya sistem sebaik-baiknya untuk menjamin bahwa beberapa task dapat berjalan secara bersamaan.

Preemption Teori di balik task scheduling sangat sederhana. Jika ada proses runnable dalam suatu sistem, setidaknya satu proses harus senantiasa berjalan. Jika ada lebih banyak runnable proses daripada prosesor dalam sistem, tidak semua proses dapat berjalan sepanjang waktu.

Oleh karena itu, beberapa proses perlu dihentikan sementara, atau ditangguhkan, sehingga proses lain dapat berjalan kembali. Task scheduler memutuskan proses mana dalam antrian akan berjalan selanjutnya.

Seperti telah disebutkan, Linux, seperti semua varian Unix lainnya, adalah sistem operasi multitasking. Ini berarti bahwa beberapa task dapat berjalan pada waktu yang sama. Linux menyediakan apa yang disebut preemptive multitasking, di mana Task scheduler memutuskan kapan proses dihentikan. Suspensi secara paksa ini disebut preemption. Semua turunan Unix telah menyediakan preemptive multitasking sejak awal.

Timeslice Periode waktu yang digunakan suatu proses yang akan berjalan terlebih dulu didefinisikan di awal. Hal ini disebut proses timeslice dan mewakili jumlah waktu prosesor yang diberikan kepada setiap proses. Dengan menetapkan timeslices, scheduler membuat keputusan global untuk sistem berjalan, dan mencegah proses individu untuk mendominasi sumber daya prosesor.

Prioritas Process Task scheduler mengevaluasi proses berdasarkan prioritas mereka. Untuk menghitung prioritas sebuah proses, Task Scheduler menggunakan algoritma yang komplek. Akibatnya, setiap proses diberi nilai yang berdasarkan nilai tersebiut proses itu "diperbolehkan" untuk berjalan di prosesor.

Dalam bahasa yang lebih sederhana, tujuan dari scheduling adalah: • Efficiency : scheduling harus berusaha untuk mengijinkan sebanyak mungkin pekerjaan di selesaikan dalam batasan berbagai kebutuhan yang ada (contoh, Context Switching adalah mahal dan mengijinkan proses untuk di jalankan dalam waktu yang lama akan menaikan effisiensi) Effisiensi biasanya akan kesulitan kalau kita harus mencapai goal interaktifitas yang berarti lebih banyak context switch. • Interactivitas : Contoh dari interactivitas adalah klik mouse atau tekanan pada tombol keyboard. Kejadian tersebut akan membutuhkan responds yang cepat dan lebih banyak context switch. Banyaknya context switch akan memberikan impresi akan responds yang cepat dengan mengorbankan effisiensi. • Fairness dan Starvation : Task / tugas harus ditangani dengan adil / fairness. Starvation / kelaparan akan terjadi jika sebuah thread tidak diijinkan untuk di run untuk jangka waktu yang cukup lama karena adanya prioritas dari thread lain. Keadilan / fairness berarti tidak boleh ada thread yang lapar / starve atau harus bisa mengakali scheduler untuk memberikan prioritas lebih banyak CPU daripada yang diperoleh saat itu.

Tuning Scheduler Kernel multitasking (Linux) memungkinkan lebih dari satu proses untuk berada pada satu saat dan setiap proses di mungkinkan untuk jalan seperti dia satu-satunya yang ada pada sistem. Banyak thread dari banyak proses seperti berjalan pada saat yang sama. Scheduler memungkinkan ini terjadi dan scheduler berjalan dalam thread dan dibangunkan oleh interupsi waktu, kernel thread lain, atau system call. kernel/sched.c : di kernel source tree dapat di mengatur nilai berikut ini untuk men-tune scheduler. • MIN_TIMESLICE (minimum timeslice yang akan di peroleh sebuah task) • MAX_TIMESLICE (maximun timeslice yang akan di peroleh sebuah task) • Nilai rata-rata timeslice di tentukan dengan cara me-rata-rata nilai MIN & MAX. Menaikan nilai MIN dan MAx akan menaikan panjang timeslice secara umum. Menaikan panjang TimeSlice akan menaikan EFFICIENCY karena akan lebih context switch (BAGUS untuk HPC dan server systems) • PRIO_BONUS_RATIO : adalah pertengahan dari total range prioritas dimana sebuah task dapat menerima sebagai bonus atau hukuman dalam kalkulasi prioritas dinamis. (Nilai default adalah 25). Jika nilai tinggi, menggunakan nice() untuk menset prioritas statik menjadi kurang effektif sedangkan jika nilai rendah, menset prioritas statik lebih effektif. • MAX_SLEEP_AVG : semakin besar nilainya, semakin lama sebuah task harus sleep sebelum diperhitungkan untuk di aktifkan. Meningkatkan nilai ini akan melukai interaktifitas, akan tetapi untuk beban non-interaktif, kesamaan antar task lebih di sukai. • STARVATION_LIMIT : Mengurangi nilai ini akan melukai interaktifitas karena task akan lebih sering merelakan CPU time, dan menaikan nilai ini akan menaikan performance interaktif dengan mengorbankan task non-interaktif.

Schedulers : menjaga kebijakan scheduling thread, termasuk kapan, untuk berapa lama, dan untuk beberapa kasus dimana (untuk kernel SMP dimana menjadi penting) sebuah thread akan di jalankan. • SMP Scheduling (scheduling pada beberapa CPU) • SMT Scheduling (Hyper Threading atau Symetric Mult-Thread scheduling) • NUMA Scheduling(Non Uniform Memory Access yang artinya scheduler dapat berjalan di image single system yang tersebar pada beberapa node atau mesin secara fisik. (satu instance kernel pada beberapa mesin secara fisik , HPC) • Soft Real Time Scheduling : schedule task yang mempunyai kebutuhan pewaktu (timing) yang sangat ketat. Real Time task di tugaskan oleh mode khusus scheduling dan scheduler memberikan task ini prioritas di atas task lainnya di sistem. Mode Real Time (RT) scheduling termasuk FIFO (first in first out) dan Round Robin. Secara effektif akan mengabaikan task non RT di sistem. Context Switches : adalah proses switch dari satu eksekusi thread ke yang lain.

Beberapa Definisi dan Klasifikasi Process Beberapa definisi tentang program dan process yang digunakan dalam pembahasan tuning kernel adalah sebagai berikut: • Program : Sebuah kombinasi dari instruksi dan data yang bersatu untuk menjalankan sebuah tugas saat di eksekusi. • Process : Sebuah instance dari sebuah program. (Sebuah abstraksi yang merepresentasikan kondisi program saat di eksekusi). Sebuah proses dapat dilihat sebagai sebuah grup dari thread yang menggunakan apa yang disebut thread group id (TGID). • Thread : Sebuah proses dapat memiliki beberapa thread eksekusi yang saling bekerjasama untuk mencapai tujuannya. Hanya 1 thread yang dapat di eksekusi di sebuah CPU pada satu waktu. Semua thread secara sederhana adalah proses. Proses biasanya diklasifikasikan menurut tujuan dan perilaku mereka. Meskipun batas tersebut tidak selalu jelas, umumnya ada dua kriteria yang digunakan untuk menyortir mereka. Kriteria yang independen dan tidak mengecualikan satu sama lain.

Salah satu pendekatan adalah dengan mengklasifikasi sebuah proses apakah sebagai I/O-bound atau processor-bound. I/O-bound I/O adalah singkatan dari perangkat Input / Output , seperti keyboard, mouse, atau cakram optik dan harddisk. I/O-bound proses menghabiskan sebagian besar waktu untuk mengajukan dan menunggu permintaan. Mereka berjalan sangat sering, tapi untuk interval waktu yang singkat, tidak untuk memblokir proses-proses lain yang menunggu permintaan I/O. processor-bound Di sisi lain, prosesor-bound task menggunakan waktu mereka untuk mengeksekusi kode, dan biasanya dijalankan sampai mereka ditunda eksekusinya oleh Task scheduler. Mereka tidak menghalangi proses yang menunggu permintaan I / O, dan, karenanya, dapat dijalankan lebih jarang tetapi untuk interval waktu yang lebih lama.

Pendekatan lain adalah untuk membagi proses sebagai proses interaktif, batch atau real-time.

Proses Interaktif Proses interaktif menghabiskan banyak waktu yang menunggu permintaan I / O, seperti operasi keyboard atau mouse. Task scheduler harus membangunkan proses tersebut dengan cepat atas permintaan pengguna, jika tidak pengguna akan menemukan lingkungan tidak tanggap. Penundaan biasanya sekitar 100 ms. Aplikasi office, editor teks atau program manipulasi gambar merupakan contoh aplikasi yang membutuhkan proses interaktif.

Proses Batch Proses Batch sering berjalan di latar belakang dan tidak perlu responsif. Mereka biasanya mendapat prioritas lebih rendah dari Task scheduler. Konverter multimedia, mesin database pencarian, atau file log analisis adalah contoh dari proses batch.

Proses Real-Time Proses Real-time tidak harus diblokir oleh proses prioritas rendah, dan Task scheduler menjamin waktu respon singkat kepada mereka. Aplikasi untuk mengedit konten multimedia adalah salah satu contoh-nya.

Tuning Scheduler Performance Tidak ada settingan yang ideal untuk scheduler. Tidak ada satu goal yang cocok untuk sebuah scheduler. Contoh, selalu ada perebutan untuk memberikan dan mengambil pada sebuah sistem desktop yang interaktif yang membutuhkan proses interaktif yang sangat tinggi (context switchin) dengan sistem HPC yang lebih sedikit context switching-nya yang mengakibatkan peningkatkan effisiensi. Dengan objektif performance antara multi tasking dan interaktif desktop, thread yang sedang di run / di eksekusi harus melepaskan processor sebelum timeslice (waktu penggunaan CPU) habis sehingga context dapat switch ke mouse klik atau keyboard. Sebuah sistem server di sisi lain, akan lebih memfokuskan diri pada performance. Di HPC, dimana sistem biasanya bekerja untuk mencari solusi dapt perhitungan yang sangat kompleks yang membutuhkan waktu berhari-hari untuk selesai maka context switch menjadi tidak penting bahkan akan sangat merugikan effisiensi. Begitulah seni dari tuning scheduler. Algoritma Scheduling di kernel Linux: • Linux 2.4 O(n) algorithm : linux scheduler legacy yang tua dan tidak effisien. Algoritma waktu eksekusi berkembang secara linier saat input size berkembang. • Linux 2.6 O(1) Algorithm : Linux scheduler baru (ditulis oleh Ingo Molnar) - berusaha untuk membuat konstanta batas atas untuk algoritma running time juga algoritma menjamin untuk selesai pada waktu tertentu berapapun besarnya input.

O(1) Scheduler Versi kernel Linux 2.6 memperkenalkan Task scheduler baru, yang disebut O (1) scheduler (lihat Big notasi O), itu digunakan sebagai default Task scheduler sampai versi Kernel 2.6.22. Tugas utamanya adalah untuk menjadwalkan task dalam jumlah waktu yang tetap, tidak peduli berapa banyak proses terdapat dalam sistem.

Scheduler menghitung timeslices secara dinamis. Namun, untuk menentukan proses timeslice yang tepat adalah tugas yang kompleks: timeslices Terlalu lama menyebabkan sistem menjadi kurang interaktif dan responsif, sementara yang terlalu pendek membuat prosesor membuang banyak waktu di overhead switching proses yang terlalu sering. proses timeslice standar biasanya agak rendah, misalnya 20ms . scheduler menentukan proses timeslice berdasarkan prioritas dari proses, yang memungkinkan proses dengan prioritas yang lebih tinggi untuk menjalankan lebih sering dan untuk waktu yang lama.

Sebuah proses tidak harus memanfaatkan semua proses timeslice sekaligus. Misalnya, dengan proses timeslice dari 150ms tidak harus berjalan selama 150ms dalam satu kali. Hal ini dapat berjalan di lima slot jadwal yang berbeda untuk 30ms . task interaktif biasanya memperoleh manfaat dari pendekatan ini karena mereka tidak perlu seperti proses timeslice besar sekaligus saat mereka harus responsif selama mungkin.

Scheduler juga menetapkan prioritas proses secara dinamis. Scheduler memonitor perilaku proses dan, jika diperlukan, menyesuaikan prioritas. Sebagai contoh, proses yang diskors untuk waktu yang lama dinyalakan dengan meningkatkan prioritas.

Completely Fair Scheduler (CFQ) Sejak kernel Linux 2.6.23, pendekatan baru telah dibawa ke proses task scheduling . Completely Fair Scheduler (CFS) menjadi default Linux kernel scheduler. Sejak itu, perubahan-perubahan penting dan perbaikan telah dibuat. Informasi dalam bagian berlaku untuk Linux dengan versi kernel 2.6.32 dan yang lebih tinggi (termasuk kernel 3.x). Lingkungan scheduler dibagi menjadi beberapa bagian, dan tiga fitur utama baru yang diperkenalkan:

• Modular Scheduler Core - Inti dari scheduler ditingkatkan dengan kelas task scheduling. Kelas-kelas yang modular dan merepresentasikan kebijakan task scheduling.

• Completely Fair Scheduler - Diperkenalkan pada kernel 2.6.23 dan diperpanjang di 2.6.24, CFS mencoba untuk memastikan bahwa setiap proses memperoleh bagian yang "fair" dari waktu prosesor.

• Group Scheduling - Misalnya, jika kita membagi proses menjadi kelompok-kelompok yang berdasarkan group tersebut pengguna menjalankan proses tersebut, CFS mencoba untuk memberikan masing-masing kelompok dengan jumlah waktu prosesor yang sama. Akibatnya, CFS membawa task scheduling lebih dioptimalkan untuk server dan desktop.

Bagaimana Completely Fair Scheduler (CFS) Bekerja CFS mencoba untuk menjamin pendekatan yang adil untuk setiap task . Untuk menemukan cara yang paling seimbang penjadwalan tugas, menggunakan konsep pohon merah-hitam . Sebuah pohon merah-hitam adalah jenis self-balancing pohon pencarian data yang menyediakan memasukkan dan menghapus entri dalam cara yang wajar sehingga tetap seimbang. Untuk informasi lebih lanjut, lihat halaman wiki Pohon Merah-hitam http://en.wikipedia.org/wiki/Red_black_tree.

Ketika task masuk ke dalam antrian run (timeline rencana proses yang akan dieksekusi berikutnya), scheduler mencatat waktu saat tersebut. Saat proses menunggu waktu prosesor, Nilai "wait / tunggu" akan bertambah dengan jumlah yang berasal dari banyaknya task saat ini dalam antrian run dan prioritas proses. Segera setelah prosesor menjalankan tugas, Nilai "wait / tunggu" akan dikurangi. Jika nilai turun di bawah tingkat tertentu, tugas yang ditunda eksekusinya oleh scheduler dan tugas-tugas lain akan menjadi lebih dekat untuk dieksekusi oleh prosesor. Dengan algoritma ini, CFS mencoba untuk mencapai kondisi ideal di mana nilai "wait / tunggu" selalu nol.

Grouping Proses Sejak kernel Linux 2.6.24, CFS dapat disetel untuk bersikap adil kepada pengguna atau group dan bukan hanya task saja. task runnable kemudian dikelompokkan untuk membentuk entitas, dan CFS mencoba untuk bersikap adil terhadap entitas bukan task individu. scheduler juga mencoba untuk bersikap adil terhadap task individu dalam entitas.

Task dapat dikelompokkan dalam dua kategori yang saling eksklusif:

• Berdasarkan user ID • Berdasarkan kernel control group.

Kernel scheduler kernel memungkinkan kita mengelompokan task tergantung pada pengaturan pilihan kernel compile-time yaitu CONFIG_FAIR_USER_SCHED dan CONFIG_FAIR_CGROUP_SCHED. Pengaturan default biasanya menggunakan group kontrol, yang memungkinkan kita membuat grup sesuai kebutuhan.

Linux Scheduler Yang akan Datang Di masa datang isu besar dalam Linux scheduler adalah sebagai berikut: • Swappable Kernel : Kemampuan untuk switch scheduler (lebih dari 1 scheduler dan kita dapat memilih berdasarkan fungsi sistem). • Scheduler Mode : memecah beban scheduler menjadi beberapa kategori, dan mengijinkan root untuk memilih perilaku scheduler dari sistem secara dinamis. Menggunakan sysctl dan /etc/sysctl.conf untuk membuat perubahan secara dinamis dari scheduler kernel pada saat berjalan.

Berbagai Istilah Dalam Kernel Scheduling Dokumen tentang task scheduling policy kadang kala menggunakan beberapa istilah teknik yang perlu kita ketahui dengan benar. Berikut adalaha beberapa diantara istilah tersebut:

Latency Delay antara waktu sebuah proses di jadwalkan untuk di run vs. waktu eksekusi proses yang sebenarnya.

Granularity Hubungan antara granularity dengan latency dapat di tulis dengan persamaan berikut:

gran = ( lat / rtasks ) - ( lat / rtasks / rtasks ) dimana

• gran adalah granularity • lat adalah latency • rtasks adalah jumlah task yang running / berjalan

Scheduling Policies Kernel Linux mendukung kebijakan scheduling berikut:

• SCHED_FIFO - kebijakan scheduling yang di rancang untuk aplikasi yang time-critical. Kebijakan ini menggunakan algoritma scheduling First In-First Out. • SCHED_BATCH - kebijakan scheduling di rancang untuk task yang CPU-intensive. • SCHED_IDLE - kebijakan scheduling yang di rancang untuk task yang prioritasnya sangat rendah. • SCHED_OTHER - kebijakan default Linux time-sharing scheduling yang digunakan oleh sebagian besar proses. • SCHED_RR - mirip dengan SCHED_FIFO, tapi menggunakan algoritma Round Robin scheduling.

Mengubah Atribut Secara Real-time dari proses dengan chrt Perintah chrt digunakan untuk set atau melihat atribute real-time scheduling dari sebuah proses yang sedang running, atau menjalankan sebuah perintah dengan atribut tertentu. Kita dapat mengambil baik kebijakan scheduling maupun prioritas proses.

Untuk melihat semua proses & PID yang sedang berjalan dapat menggunakan perintah

ps ax

Pada contoh berikut, sebuah proses dengan PID 3088 akan dijadikan contoh. Untuk melihat atribut real-time dari task yang ada:

chrt -p 3088

Contoh keluaran:

pid 3088's current scheduling policy: SCHED_OTHER pid 3088's current scheduling priority: 0 Sebelum menset ke kebijakan scheduling yang baru pada sebuah proses, kita perlu melihat prioritas minimum dan maximum yang valid untuk setiap algoritma scheduling melalui perintah:

chrt -m

Contoh keluaran:

SCHED_OTHER min/max priority : 0/0 SCHED_FIFO min/max priority : 1/99 SCHED_RR min/max priority : 1/99 SCHED_BATCH min/max priority : 0/0 SCHED_IDLE min/max priority : 0/0

Pada contoh di atas, kebijakan SCHED_OTHER, SCHED_BATCH, SCHED_IDLE hanya mengijinkan prioritas 0, sementara SCHED_FIFO dan SCHED_RR dapat di set antara 1 sampai dengan 99.

Untuk menset agar menjadi SCHED_BATCH scheduling:

chrt -b -p 0 3088 chrt -p 3088

Contoh keluaran:

pid 3088's current scheduling policy: SCHED_BATCH pid 3088's current scheduling priority: 0

Untuk info lebih lanjut tentang chrt, kita dapat menulis

chrt -h

Contoh keluaran:

chrt - manipulate real-time attributes of a process

Set policy: chrt [options] { | [ ...]}

Get policy: chrt [options] { | [ ...]}

Scheduling policies: -b | --batch set policy to SCHED_BATCH -f | --fifo set policy to SCHED_FIFO -i | --idle set policy to SCHED_IDLE -o | --other set policy to SCHED_OTHER -r | --rr set policy to SCHED_RR (default)

Scheduling flags: -R | --reset-on-fork set SCHED_RESET_ON_FORK for FIFO or RR

Options: -a | --all-tasks operate on all the tasks (threads) for a given pid -h | --help display this help -m | --max show min and max valid priorities -p | --pid operate on existing given pid -v | --verbose display status information -V | --version output version information -m | --max show min and max valid priorities -p | --pid operate on existing given pid -v | --verbose display status information -V | --version output version information

Lebih Dalam Tuning Runtime Menggunakan sysctl Interface sysctl dapat digunakan untuk melihat dan mengubah parameter kernel saat runtime yang mana kita dapat mengubah perilaku default dari task scheduler. Sintax dari sysctl sangat sederhana, dan harus di ketik oleh root.

Untuk membaca nilai dari variable kernel, ketik,

sysctl variable

Untuk menset nilai variable, ketik,

sysctl variable=value

Untuk memperoleh daftar dari semua variable sysctl yang berhubungan dengan scheduler, ketik,

sysctl -A | grep "sched" | grep -v "domain"

Contoh hasilnya:

kernel.sched_autogroup_enabled = 1 kernel.sched_cfs_bandwidth_slice_us = 5000 kernel.sched_child_runs_first = 0 kernel.sched_latency_ns = 12000000 kernel.sched_migration_cost_ns = 500000 kernel.sched_min_granularity_ns = 1500000 kernel.sched_nr_migrate = 32 kernel.sched_rt_period_us = 1000000 kernel.sched_rt_runtime_us = 950000 kernel.sched_shares_window_ns = 10000000 kernel.sched_time_avg_ms = 1000 kernel.sched_tunable_scaling = 1 kernel.sched_wakeup_granularity_ns = 2000000

CATATAN: variable yang di akhiri dengan “_ns”, “_us” dan “_ms” menerima nilai dalam nanosecond, microsecond dan mikrosecond.

Daftar dari variable yang paling penting untuk di tuning pada task scheduler terdapat pada /proc/sys/kernel/ dengan penjelasan pendek berikut: sched_child_runs_first

Fork child dijalankan sebelum parent meneruskan eksekusi. Menset parameter ini menjadi 1 akan menguntungkan untuk aplikasi dimana child menjalankan eksekusi setelah fork. Contoh, make -j akan lebih baik jika sched_child_runs_first dimatikan.

Default adalah 0. sched_migration_cost_ns

Lama waktu sesudah eksekusi terakhir dimana sebuah task akan di perhitungkan sebagai "cache hot" dalam keputusan untuk migrasi / perubahan. Sebuah "hot" task akan kemungkinan kecil untuk di migrasi, oleh karenanya menaikan nilai variabel ini akan menurunkan migrasi task.

Default adalah 500000 (ns).

Jika waktu idle CPU lebih tinggi dari yang diharapkan jika ada proses yang bisa di jalankan, coba kecilkan nilai ini. Jika task bounce antara CPU atau node terlalu sering, coba naikan nilai ini. sched_latency_ns

Latency preemtion yang di ijinkan untuk task CPU bound. Menaikan nilai variable ini akan menaikan task CPU bound timeslice. Task timeslice diberi bobot pembagi secara fair dalam perioda scheduling:

timeslice = scheduling period * (bobot task/total bobot task di antrian run)

Bobot task tergantung pada level nice task dan kebijakan scheduling. Bobot minimal task untuk task SCHED_OTHER adalah 15, ini sama dengan nice 19. Bobot maximum task adalah 88761, ini sama dengan nice -20.

Semakin kecil timeslice maka load CPU naik. Jika jumlah task yang akan di jalankan melebihi sched_latency_ns/sched_min_granularity_ns, maka timeslice akan menjadi number_of_running_tasks * sched_min_granularity_ns. Sebelum itu terjadi, timeslice akan sama sched_latency_ns.

Nilai ini pada dasarnya mengatur jumlah waktu maksimum untuk sebuah task yang sedang sleeping untuk di perhitungkan dalam kalkulasi ijin run. Menaikan nilai ini akan menaikan jumlah waktu bagi task yang bangun yang dapat di gunakan sebelum di preempted, ini akhirnya akan menaikan scheduler latency untuk task yang CPU bound.

Nilai Default adalah 20000000 (ns). sched_min_granularity_ns

Minimal preemption granularitas untuk task CPU bound. Baca-baca sched_latency_ns untuk lebih detail.

Nilai default adalah 1500000 (ns). sched_wakeup_granularity_ns

Granularitas preemption untuk wake-up (bangun). Menaikan nilai variable ini akan mengurangi preemption wake-up, menggurangi gangguan bagi task yang banyak melakukan perhitungan. Menurunkan nilai ini akan memperbaiki latency wake-up dan throughput untuk task penting, terutama jika komponen dengan beban pendek harus berkompetisi dengan komponen CPU bound.

Nilai default adalah 2000000 (ns).

WARNING: Menset lebih besar dari setengah sched_latency_ns akan menyebabkan zero wake-up preemption dan task pendek akan tidak bisa berkompetisi secara effektif dengan task yang memakan CPU. sched_rt_period_us

Perioda dimana pelaksanaan task real-time di ukur.

Nilai default adalah 1000000(µs). sched_rt_runtime_us

Alokasi waktu untuk task real-time (RT) saat sched_rt_period_us. Menset menjadi -1 akan men-disable pelaksanaan waktu real-time (RT).

Nilai default, task real-time (RT) akan mengkonsumsi 95% CPU/detik, oleh karenanya hanya akan menyisakan 5% CPU/detik atau 0.05s untuk digunakan oleh task SCHED_OTHER.

Nilai Default 950000(µs). sched_nr_migrate

Mengatur berapa task yang dapat di pindahkan antar processor melalui interupsi software migrasi (softirq). Jika sebagian besar task dibuat oleh kebijakan SCHED_OTHER, mereka semua biasakan akan jalan di processor yang sama.

Nilai default adalah 32.

Menaikan nilai ini biasakan akan menaikan performance untuk thread besar pada SCHED_OTHER dengan mengorbankan latency yang lebih tinggi untuk task yang real- time.

Interface Debugging dan Statistik Scheduler CFS digunakan dengan interface debugging yang baru, dan dapat memberikan informasi statiktik runtime. File yang relevan ada di directory /proc, yang dapat di pelajari hanya dengan printah cat atau less. Sedikit tentang file /proc dan penjelasan pendeknya:

/proc/sched_debug Berisi nilai saat ini dari semua variabel yang dapat di tuning yang akan mempengaruhi perilaku task scheduler, CFS statistik, dan informasi tentang antrian run di semua processor yang tersedia.

less /proc/sched_debug Hasilnya kira-kira

Sched Debug Version: v0.10, 3.8.0-19-generic #29-Ubuntu ktime : 9554237.456344 sched_clk : 3443663.598195 cpu_clk : 9554237.455442 jiffies : 4297280855 sched_clock_stable : 0

sysctl_sched .sysctl_sched_latency : 12.000000 .sysctl_sched_min_granularity : 1.500000 .sysctl_sched_wakeup_granularity : 2.000000 .sysctl_sched_child_runs_first : 0 .sysctl_sched_features : 24187 .sysctl_sched_tunable_scaling : 1 (logaritmic)

cpu#0, 1296.774 MHz .nr_running : 1 .load : 975 .nr_switches : 6381240 .nr_load_updates : 933324 .nr_uninterruptible : -5 .next_balance : 4297.280863 .curr->pid : 2895 .clock : 9554237.447969 .cpu_load[0] : 0 .cpu_load[1] : 240 .cpu_load[2] : 443 .cpu_load[3] : 444 .cpu_load[4] : 328 .yld_count : 9

cfs_rq[0]:/autogroup-143 .exec_clock : 2509.690835 .MIN_vruntime : 0.000001 .min_vruntime : 2939.675233 .max_vruntime : 0.000001 .spread : 0.000000 .spread0 : -1001396.309802 .nr_spread_over : 93 .nr_running : 0 .load : 0

…. dst ...

rt_rq[0]:/ .rt_nr_running : 0 .rt_throttled : 0 .rt_time : 0.000000 .rt_runtime : 950.000000

… dst … runnable tasks: task PID tree-key switches prio exec-runtime sum-exec sum-sleep ------R less 4077 2491.689597 4 120 2491.689597 4.768736 13.647862 /autogroup-143 /proc/schedstat Menampilkan statistik relevan terhadap run queue saat itu. Juga domain-spesifik statistik dari sistem SMP untuk semua prosesor yang tersambung. Karena format output tidak terlalu user-friendly, untuk informasi lebih lanjut ada baiknya baca

more /usr/src/linux/Documentation/scheduler/sched-stats.txt

Untuk melihat informasi lebih detail untuk sebuah Proses ID (PID), ketik,

less /proc/PID/sched misalnya jika ada proses 10485, ketik

less /proc/3101/sched

Akan keluar seperti

oosplash (3101, #threads: 3) ------se.exec_start : 1214009.469485 se.vruntime : 718400.302359 se.sum_exec_runtime : 44.427158 se.statistics.wait_start : 0.000000 se.statistics.sleep_start : 1214009.469485 se.statistics.block_start : 0.000000 se.statistics.sleep_max : 1024250.076696 se.statistics.block_max : 1595.939715 se.statistics.exec_max : 3.001692 se.statistics.slice_max : 0.000000 se.statistics.wait_max : 6.005764 se.statistics.wait_sum : 23.781582 se.statistics.wait_count : 202 se.statistics.iowait_sum : 5173.560377 se.statistics.iowait_count : 79 se.nr_migrations : 14 se.statistics.nr_migrations_cold : 0 se.statistics.nr_failed_migrations_affine: 0 se.statistics.nr_failed_migrations_running: 1 se.statistics.nr_failed_migrations_hot: 0 se.statistics.nr_forced_migrations : 0 se.statistics.nr_wakeups : 117 se.statistics.nr_wakeups_sync : 17 se.statistics.nr_wakeups_migrate : 13 se.statistics.nr_wakeups_local : 81 se.statistics.nr_wakeups_remote : 36 se.statistics.nr_wakeups_affine : 9 se.statistics.nr_wakeups_affine_attempts: 43 se.statistics.nr_wakeups_passive : 0 se.statistics.nr_wakeups_idle : 0 avg_atom : 0.219936 avg_per_cpu : 3.173368 nr_switches : 202 nr_voluntary_switches : 118 nr_involuntary_switches : 84 avg_atom : 0.219936 avg_per_cpu : 3.173368 nr_switches : 202 nr_voluntary_switches : 118 nr_involuntary_switches : 84 se.load.weight : 1024 policy : 0 prio : 120 clock-delta : 230

Baca informasi tentang task scheduler di file di bawah /usr/src/linux/Documentation/scheduler

Referensi

• http://www.techtinker.com/linux/LinuxKernel.html#HowRedHat • http://archive09.linux.com/feature/146599 Oleh Federico Kereki 9 September 2008 (4:00:00 PM) • http://www.inf.fu-berlin.de/lehre/SS01/OS/Lectures/Lecture08.pdf • http://doc.opensuse.org/documentation/html/openSUSE/opensuse-tuning/book.tuning.html • http://doc.opensuse.org/documentation/html/openSUSE/opensuse- tuning/cha.tuning.taskscheduler.html BAB 9: TUNING I/O SCHEDULER

I/O scheduling mengontrol bagaimana operasi input/output akan dikirim ke storage, seperti harddisk / flashdisk. Linux memberikan berbagai algoritma I/O - disebut elevator - yang cocok untuk berbagai beban kerja. Elevators dapat membantu untuk mengurangi operasi seek (pencarian), dapat memprioritaskan permohonan I/O, dan memastikan permohonan I/O dilakukan sebelum deadline yang diberikan.

Memilih I/O elevator yang terbaik, tidak hanya tergantung pada beban kerja, tapi juga hardware. Sebuah disk ATA, SSD, RAID, atau sistem storage di jaringan, masing-masing membutuhkan strategi tuning yang berbeda.

Switching I/O Scheduling Linux mengijinkan kita untuk menset I/O scheduler default saat boot pertama kali, ini dapat berubah sambil berjalan untuk masing-masing block device (harddisk dll). Hal ini memungkinkan kita untuk mengset algoritma yang berbeda, misalnya untuk, device hosting partisi sistem dan device hosting sebuah database.

Secara default, scheduler CFQ (Completely Fair Queuing) akan digunakan. Ubah default ini dengan cara masuk ke boot parameter

elevator=SCHEDULER

Dimana SCHEDULER adalah salah satu dari cfq, noop, or deadline.

Unuk mengubah elevator dari device yang spesifik dalam sistem yang berjalan, jalankan perintah berikut:

echo SCHEDULER > /sys/block/DEVICE/queue/scheduler dimana SCHEDULER adalah salah satu dari cfq, noop, atau deadline dan DEVICE adalah block device (contoh sda). Untuk melihat semua DEVICE yang terdapat pada komputer yang tersambung pada kita dapat menggunakan perintah, misalnya,

ls /sys/block/

Akan terlihat misalnya,

loop0 loop3 loop6 ram1 ram12 ram15 ram4 ram7 sda loop1 loop4 loop7 ram10 ram13 ram2 ram5 ram8 loop2 loop5 ram0 ram11 ram14 ram3 ram6 ram9

I/O Elevator Yang Tersedia Elevator berikut tersedia di Linux. Setiap elevator mempunyai parameter yang dapat di tune, yang dapat di set menggunakan perintah berikut:

echo VALUE > /sys/block/DEVICE/queue/iosched/TUNABLE dimana VALUE adalah nilai yang di inginkan untuk parameter TUNABLE dan blok DEVICE tertentu.

Untuk mengetahui elevator mana yang saat ini digunakan, jalankan perintah berikut:

cat /sys/block/sda/queue/scheduler

Akan tampak seperti di bawah ini, scheduler yang saat ini digunakan berada dalam kurung siku:

noop [deadline] cfq

Kebanyakan default sistem operasi Linux di desktop akan menggunakan default DEADLINE sebagai I/O ELEVATOR.

CFQ (Completely Fair Queuing) CFQ adalah scheduler yang berorientasi pada fairness dan digunakan secara default oleh Linux. Melalui algoritma ini setiap thread akan memperoleh pembagian yang adil dari throughput I/O. Algoritma ini juga memungkinkan kita menentukan prioritas task I/O yang akan di perhitungkan saat memutuskan scheduling,lihat perintah

man ionice

Scheduler CFQ mempunyai parameter tuneable berikut:

/sys/block//queue/iosched/slice_idle

Saat sebuah task tidak ada lagi I/O yang masuk pada timeslice-nya, I/O scheduler akan menungggu beberapa saat sebelum menjadwalkan thread selanjutnya untuk memperbaiki lokalitas I/O. Untuk media dimana lokalitas tidak terlalu menentukan (seperti SSD, SAN dengan banyak disk) menset /sys/block//queue/iosched/slice_idle menjadi 0 akan sangat memperbaiki throughput.

/sys/block//queue/iosched/quantum

Pilihan ini akan membatasi request maximum yang akan di proses sebuah device pada satu saat. Nilai default adalah 4. Untuk storage dengan beberapa disk, setting ini akan membatasi request paralel proses. Oleh karenanya, menaikan nilai-nya akan memperbaiki performance meskipun cara ini mungkin akan menyebabkan naiknya latency di beberapa I/O karena request di buffer dalam storage. Jika kita mengubah nilai ini, ada baiknya juga mentune /sys/block//queue/iosched/slice_async_rq (nilai default adalah 2) yang akan membatasi jumlah maximum request asinkron - biasanya request untuk menulis - yang di lakukan dalam satu time slice.

/sys/block//queue/iosched/low_latency

Untuk beban dimana latency I/O menjadi penting, menset /sys/block//queue/iosched/low_latency ke 1 akan menolong.

NOOP Scheduler sederhana yang hanya menyampaikan semua yang ditujukan dia langsung ke I/O. Akan sangat berguna untuk mencek apakah sebuah keputusan I/O scheduling dari scheduler lain tidak menyebabkan penurunan performance I/O.

Dalam beberapa kasus, scheduler ini sangat bermanfaat untuk device yang melakukan I/O scheduling sendiri, sebagai intelligent storage, atau device yang tidak tergantung pada gerakan mekanik, seperti SSD. Biasanya, DEADLINE I/O scheduler adalah pilihan yang baik untuk device ini, karena NOOP mempunyai overhead yang lebih sedikit ini akan memhasilkan performance yang lebih baik untuk beban kerja tertentu.

DEADLINE DEADLINE adalah I/O scheduler yang berorientasi pada latency. Setiap I/O reuqest akan diberi deadline. Biasanya, request akan di simpan dalam antrian (read dan write) berdasarkan nomor sector. Algoritma DEADLINE memelihara dua antrian (read dan write) tambahan dimana request di simpan berdasarkan deadline. Selama tidak ada request yang time out, maka antrian "sector" yang akan digunakan. Jika terjadi time out, maka request dari antrian "deadline" akan digunakan sampai tidak adalah request yang habis masanya. Secara umum, algoritma ini lebih menyukai read daripada write.

Scheduler ini dapat memberikan throughput yang lebih baik daripada CFQ I/O scheduler pada saat dimana thread read dan write dan fairness (keadilan) bukan lagi masalah. Contoh, untuk beberapa proses read paralel dari SAN dan untuk database (terutama menggunakan "TCQ" disk). DEADLINE scheduler mempunyai parameter tunable berikut:

/sys/block//queue/iosched/writes_starved

Control berapa banyak read dapat dikirim ke disk sebelum dia dapat mengirim write. Nilai 3 berarti, untuk tiga operasi read dapat dilakukan satu operasi write.

/sys/block//queue/iosched/read_expire

Set deadline (waktu sekarang plus nilai read_expire) untuk operasi read dalam millisecond. Default adalah 500.

/sys/block//queue/iosched/write_expire

/sys/block//queue/iosched/read_expire set deadline (waktu sekarang plus read_expire) untuk operasi read dalam millisecond. Default adalah 500.

I/O Barrier Tuning Kebanyakan file sistem (XFS, ext3, ext4, reiserfs) mengirim penghalang write ke disk sesudah fsync atau saat komit transaksi. Penghalang write memastikan urutan yang benar dari proses write, membuat disk write cache aman untuk digunakan (dengan sedikit pengurangan performance). Jika disk yang kita gunakan menggunakan backup batere, mematikan penghalang write akan secara aman menaikan performance.

Pengalang write dapat di disable mengunakan pilihan mount barrier=0 (untuk ext3, ext4, dan reiserfs), atau menggunakan pilihan mount nobarrier (atau XFS). WARNING: mematikan barrier pada disk yang tidak dapat menggaransi crash saat penulisan terjadi mati lampu / listrik akan menyebabkan korup pada file system dan kehilangan data.

Referensi • http://doc.opensuse.org/documentation/html/openSUSE/opensuse-tuning/book.tuning.html • http://doc.opensuse.org/documentation/html/openSUSE/opensuse-tuning/cha.tuning.io.html BAB 10: TUNING MANAJEMEN MEMORY

Untuk mengerti dan men-tune perilaku manajemen memory di kernel, akan sangat penting untuk mengetahui bagaimana cara dia bekerja dengan subsistem lainnya.

Subsistem menajemen memory, biasa di sebut virtual memory manager, yang selanjutnya akan di sebut "VM". Fungsi VM adalah untuk mengatur alokasi dari memory fisik (RAM) untuk seluruh kernel dan user program. VM juga bertanggung jawab untuk memberikan lingkungan virtual memory untuk keperluan user (di managed melalui API POSIX dengan extensi Linux). Terakhir, VM bertanggung jawab untuk membebaskan RAM jika terjadi kekurangan, baik dengan memotong cache atau swapping "anonymous" memory.

Hal paling penting untuk dimengerti ketika mempelajari dan men-tune VM adalah bagaimana cache di manaje. Tujuan utama VM cache adalah untuk meminimalkan cost dari I/O yang di sebabkan oleh swaping dan operasi file sistem (termasuk network file system). Hal ini dapat dicapai dengan menghindari I/O secara keseluruhan, atau dengan memasukan I/O ke pola yang lebih baik.

Free memory akan digunakan dan di isi oleh cache jika dibutuhkan. Semakin banyak memory yang tersedia untuk cache dan anonymous memory, semakin effektif operasi cache dan swapping. Akan tetapi, jika terjadi kekurangan memory, cache akan dipangkas atau memory akan di swap-kan.

Untuk beban kerja tertentu, hal pertama yang dapat dilakukan untuk memperbaiki performance adalah menaikan memory dan mengurangi frekuensi dimana memory harus dipangkas atau di swap- kan. Hal kedua adalah ubah cara mengatur cache dengan mengubah parameter kernel.

Terakhir, beban kerja itu sendiri harus dipelajari dan di tune. Jika aplikasi di ijinkan untuk menjalankan lebih banyak proses atau thread, effektifitas cache VM akan berkurang, jika setiap proses beroperasi di wilayah-nya sendiri di file system. Overhead memory akan bertambah. Jika aplikasi meng-alokasikan sendiri buffer atau cache yang digunakan, semakin besar cache berarti lebih sedikit memory yang tersedia untuk cache VM. Akan tetapi, semakin banyak proses dan thread juga berarti lebih banyak kemungkinan untuk overlap dan pipeline I/O, dan akan lebih baik dalam mengambil manfaat dari multiple core. Experimen perlu dilakukan untuk memperoleh hasil yang terbaik.

Penggunaan Memory Alokasi memory secara umum dapat di lihat sebagai "pinned" (juga dikenal sebagai “unreclaimable”), “reclaimable” atau “swappable”.

Anonymous Memory Anonymous memory cenderung merupakan program heap dan stack memory (contoh, >malloc()). Memory ini reclaimable, kecuali kasus khusus seperti mlock atau jika tidak tersedia space swap. Anonymous memory harus di tulis ke swap sebelum dia dapat di reclaim. Swap I/O (baik swapping in dan swapping out page) cenderung untuk tidak effisien daripada pagecache I/O, karena allocation dan pola akses. Pagecache Cache dari file data. Juga sebuah file di baca (read) dari disk atau network, isi akan di simpan di pagecache. AKses ke disk dan network tidak dibutuhkan, jika isi pagecache up-to- date. tmpfs dan segmen shared memory bertumpu pada pagecache.

Ketika sebuah file di tulis (write), data yang baru di simpan di pagecache sebelum di tulis kembali ke disk atau network (membuat dia menjadi write-back cache). Juga pada page ada data baru yang belum di tulis kembali (write back), ini di sebut "dirty". Page yang tidak diklasifikasikan sebagai dirty adalah "clean". Pagecache yang clean akan di reclaim jika terjadi kekurangan memory dengan cara membebaskan mereka. Page dirty harus di clean terlebih dulu sebelum bisa di reclaim.

Buffercache Ini adalah tipe pagecache untuk block device (seperti, /dev/sda). Sebuah file sistem biasanya menggunakan buffercache pada saat mengakses struktur "meta-data" di disk seperti tabel inode, alokasi bitmap, dan sebagainya. Buffercache dapat di reclaim seperti halnya pagecache.

Buffer Heads Buffer heads adalah sebuah struktur tambahan kecil yang biasanya dibuat saat akses pagecache. Ini biasanya dapat dengan mudah di reclaim ketika page pagecache atau buffercache sudah clean.

Writeback Saat aplikasi menulis (write) ke file, pagecache (dan buffercache) menjadi dirty. Ketiga page dirty untuk selang waktu yang ditentukan, atau ketika jumlah memory dirty mencapai persentase tertentu dari RAM, kernel akan mulai melakukan writeback. Memaksa thread untuk melakukan writeback di background dan mengijinkan agar aplikasi tetap berjalan. Jika I/O tidak dapat mengikuti aplikasi dalam membuat dirty pagecache, dan data dirty mencapai persentasi kritis dari RAM, maka aplikasi mulai dikurangi kecepatannya untuk menjaga data dirty tidak melebihi batas.

Readahead VM akan memperhatikan pola akses file dan akan berusaha uantuk melakukan readahead (membaca duluan). Readahead membaca page dari file system dan masukan pagecache walaupun belum di request. Ini dilakukan untuk memungkinkan lebih sedikit, I/O request yang besar untuk dimasukan (sehingga lebih effisien). Dan agar I/O lebih pipeline (I/O dilakukan pada saat yang sama saat aplikasi berjalan).

VFS caches

Inode Cache

Ini adalah in-memory cache dari structure inode untuk setiap file system. Disini berisi atribut seperti file size, permission (ijin) dan ownership (kepemilikan), dan pointer ke data file. Directory Entry Cache Ini adalah in-memory cache dari directory entry di sistem. Ini berisi nama (nama file), dan inode yang nunjuk pada file tersebut, dan children entry. Cache ini digunakan saat kita mengakses struktur directory dan mengakses file menggunakan nama.

Mengurangi Penggunaan Memory

Mengurangi Penggunaan malloc (Anonymous) Aplikasi jalan di linux yang baru biasanya dapat mengalokasikan lebih banyak memory di bandingkan dengan yang lama. Ini karena glibc mengubah perilaku defaultnya saat mengalokasikan memory userspace. Ada baiknya membaca-baca http://www.gnu.org/s/libc/manual/html_node/Malloc-Tunable-Parameters.html untuk lebih jelasnya.

Untuk mengembalikan ke perilaku yang lama, M_MMAP_THRESHOLD harus di set ke 128*1024. Ini dapat dilakukan dengan call mallopt() dari aplikasi, atau memlalui setting variable environment MALLOC_MMAP_THRESHOLD sebelum aplikasi di jalankan.

Mengurangi Overhead Kernel Memory Kernel memory yang dapat di reclaim (cache seperti di jelaskan di atas) dapat di pangkas secara automatis saat terjadi kekurangan memory. Kebanyakan kernel memory tidak dengan mudah untuk dikurangi tapi ini merupakan bagian dari beban kerja yang diberikan pada kernel.

Mengurangi kebutuhan dari beban kerja user akan mengurangi penggunaan memory kernel (lebih sedikit proses, lebih sedikit file dan soket yang terbuka, dll).

Memory Controller (Memory Cgroups) Jika fitur memory cgroups tidak dibutuhkan, dia dapat dimatikan dengan cara mengirimkan cgroup_disable=memory di kernel command line. Ini akan mengurangi sedikit penggunaan memory di kernel.

Parameter Virtual Memory Manager (VM) yang dapat di Tune Saat kita men-tune VM perlu kita sadari bahwa perubahan yang terjadi akan membutuhkan waktu untuk mempengaruhi beban kerja dan untuk berefek secara maksimum. Jika beban kerja berubah- ubah, maka perilaku akan berbeda-beda dari waktu ke waktu. Perubahan yang menyebabkan throughput membaik dalam satu kondisi mungkin akan menjadi buruk di kondisi yang lain.

Perbandingan Reclaim /proc/sys/vm/swappiness Parameter ini mengontrol tingkat agresif kernel untuk melakukan swap out anonymous memory relatif terhadap pagecache dan cache lainnya. Menaikan nilai ini akan menaikan jumlah memory anonymous yang di swap. Nilai default adalah 60.

Swap I/O cenderung tidak se-effisien I/O lainnya. Akan tetapi, beberapa pagecache akan di akses lebih sering daripada anonymous memory yang jarang digunakan. Keseimbangan yang tepat perlu dicari disini. Jika aktifitas swap terlihat saat sistem berjalan dengan perlahan, maka ada baiknya mengurangi parameter ini. Jika banyak aktifitas I/O dan besarnya pagecache di sistem terlalu kecil, atau jika banyak aplikasi besar yang running, menaikan nilai ini akan memperbaiki performance.

Perlu di catat bahwa lebih banyak data yang di swap, lebih lama waktu yang dibutuhkan sistem untuk men-swap data kembali saat dibutuhkan.

/proc/sys/vm/vfs_cache_pressure Parameter ini mengontrol tendensi kernel untuk me-reclaim memory yang digunakan untuk cache VFS, versus pagecache dan swap. Menaikan nilai ini akan menaikan kecepatan VFS cache di reclaim.

Sulit untuk mengetahui kapan parameter ini harus diubah, kecuali melalui experimen. Perintah slabtop (bagian dari paket procps) akan memperlihatkan top memory object yang digunakan oleh kernel. vfs cache adalah object "dentry" dan "*_inode_cache". Jika ini mengkonsumsi memory yang besar relatif terhadap pagecache, maka ada baiknya kita naikan nilai pressure. Juga ada baiknya dicoba untuk mengurangi swapping. Nilai default adalah 100.

/proc/sys/vm/min_free_kbytes Parameter ini mengontrol jumlah memory yang harus bebas (free) untuk digunakan untuk aplikasi khusus termasuk yang "atomic" (yang tidak bisa menunggu reclaim). Parameter ini sebaiknya tidak di kecilkan kecuali sistem di tune secara seksama untuk penggunaan memory (ini terutama berguna di aplikasi embedded dibandingkan server). Jika ada message “page allocation failure” dan jejak stack sering terlihat di log, min_free_kbytes dapat di naikan sampai error hilang. Tidak ada yang perlu di kuatirkan, jika message tersebut jarang keluat. Nilai default tergantung dari jumlam RAM.

Parameter Writeback Perubahan perilaku writeback terutama ke memory mmap() akan di lihat langsung sebagai memory dirty (yang akan diperhitungkan untuk di writeback). Sedang sebelumnya, hanya akan di perhitungkan untuk di writeback, sesudah di unmapped, oleh sistem call msync(), atau di bawah tekanan memory yang sangat berat.

Beberapa aplikasi tidak berharap adanya modifikasi mmap dan mengalami perilaku writeback yang baru, dan performance dapat berkurang. Berkeley DB (dan aplikasi yang menggunakannya) adalah salah satu contoh yang diketahui dapat menyebabkan masalah. Menaikan perbandingan dan waktu writeback dan akan memperbaiki slowdown yang seperti ini.

/proc/sys/vm/dirty_background_ratio Ini ada persentase dari total free dan reclaimable memory. Jika jumlah dari pagecache dirty melebihi persentase ini, thread writeback akan mulai write back memory dirty. Nilai default adalah 10 (%).

/proc/sys/vm/dirty_ratio Sama denga nilai persentase di atas. Jika nilai ini dilalui, aplikasi yang akan write ke pagecache akan di blokir dan mulai melakukan writeback juga. Nilai default adalah 40 (%). Kedua nilai ini secara bersama menentukan perilaku pagecache writeback. Jika nilai ini di naikan, akan lebih banyak memory dirty yang di simpan di sistem untuk waktu yang lebih lama. Dengan lebih banyak memory dirty yang ada di sistem, kemungkinan untuk memperbaiki throughput dengan menghindari I/O writeback dan memberikan pola I/O yang lebih baik akan meningkat. Akan tetapi, dengan lebih banyak memory dirty akan menyebabkan latency ketika memory perlu di reclaim atau saat integritas data (sync) perlu di tulis kembali ke disk.

Parameter Readahead /sys/block//queue/read_ahead_kb Jika satu atau lebih proses secara berurutan membaca (read) sebuah file, kernel akan membaca beberapa data lebih dulu (ahead) untuk mengurangi waktu tunggu proses agar data tersedia. Banyaknya data yang dibaca terlebih dulu di hitung secara dinamik, tergantung seberapa "urut" proses I/O tersebut. Parameter ini menset jumlah data maksimum yang dapat di baca oleh kernel dari sebuah file. Jika kita melihat pembacaan berurut dari sebuah file tidak cukup cepat, kita dapat mencoba menaikan nilai ini. Menaikan nilai ini terlalu besar akan menyebabkan readahead membuat sampah pada pagecache yang digunakan, karena readahead akan di reclaim sebelum digunakan, atau menjadi lambat karena jumlah I/O yang percuma. Nilai default adalah 512 (kb).

Lebih Lanjut Tentang Parameter VM Untuk daftar lengkap dari parameter VM yang dapat di tune, ada baiknya melihat isi file

/usr/src/linux/Documentation/sysctl/vm.txt yang tersedia juga anda menginstalasi source code kernel, atau paket kernel-source.

Non-Uniform Memory Access (NUMA)

Salah satu fungsi VM yang semakin penting adalah memberikan strategi alokasi NUMA yang baik. NUMA singkatan dari non-uniform memory access, dan sebagian besar multi-socket server hari ini adalah mesin NUMA. NUMA adalah perhatian kedua dalam mengatur swapping dan cache khususnya untuk performance. Ada banyak dokumen yang menjelaskan tentang bagaimana memperbaiki alokasi memory NUMA. Salah satu parameter yang berinteraksi dengan reclaim page adalah:

/proc/sys/vm/zone_reclaim_mode Parameter ini mengontrol apakah memory reclaim di lakukan di node lokal NUMA meskipun banyak memory free di node lainnya. Parameter ini secara automatis akan diaktifkan pada mesin yang mempunyai NUMA karakteristik yang menonjol.

Jika cache VM tidak di ijinkan untuk mengisi semua memory di mesin NUMA, itu kemungkinan karena zone_reclaim_mode di set. Menset ke 0 akan mematikan perlaku ini.

Monitoring Perilaku VM Ada beberapa tool sederhana yang dapat digunakan untuk monitor perilaku VM:

• vmstat: tool ini memberikan ringkasan yang baik tentang apa yang terjadi di VM. • /proc/meminfo: File ini memberikan detail kemana saja memory digunakan.

• slabtop: tool ini memberikan informasi detail tentang penggunaan memory slab kernel. buffer_head, dentry, inode_cache, ext3_inode_cache, dll adalah cache utama. Perintah ini merupakan bagian dari paket procps.

Referensi • http://doc.opensuse.org/documentation/html/openSUSE/opensuse- tuning/cha.tuning.memory.html • http://www.pythian.com/blog/the-mysterious-world-of-shmmax-and-shmall/ BAB 11: MEMBUAT KERNEL MODUL SEDERHANA

Bagi anda yang pernah menginstalasi sistem operasi Windows, mungkin akan tahu bahwa untuk setiap alat yang tersambung ke komputer akan dibutuhkan driver, kadang kala dikenal sebagai device driver. Driver di windows biasanya di siapkan dalam bentuk CD oleh alat yang kita gunakan. Akibatnya, setiap kita memasang alat baru maka harus install driver. Yang menyedihkan kalau CD driver hilang, kita biasanya akan pusing kepala.

Di Linux, selain istilah driver atau device driver, untuk aplikasi tersebut kita sering menggunakan instilah kernel modul karena biasanya device driver berbentuk modul-modul di kernel yang tidak lagi perlu di install oleh user. Artinya kernel / sistem operasi Linux sudah menyiapkan semua driver yang dibutuhkan, sehingga user tidak perlu lagi pusing menginstalasi driver seperti di windows. Alat apapun tinggal di colok langsung akan di deteksi oleh sistem operasi Linux.

Pada bagian ini akan di terangkan:

• bagaimana cara kerja kernel modul yang mengandalkan system call. • bagaimana cara membuat kernel modul sederhana sekali.

Saat kita membaca-baca code device driver akan mulai berfikir, "Bagaimana function foo_read() di panggil?" Atau kita berfikir, "Ketika kita menulis cat /proc/cpuinfo, bagaimana function cpuinfo() dipanggil?"

Setelah kernel selesai booting, flow control berubah dari yang bersifat langsung "Function mana yang akan di panggil selanjutnya?" menjadi tergantung pada system call, exception dan interupsi. Mari kita bahas terlebih dulu bagaimana cara sistem call dilakukan?

Apakah system call? Secara gamblang, system call (biasa di kenal sebagai "syscall") adalah sebuah instruksi, mirip dengan instruksi "add" atau "jump". Pada tingkat tinggi, sebuah system call adalah cara sebuah program pada level user untuk meminta pada sistem operasi untuk menjalankan sesuatu untuknya. Jika kita seorang programmer, dan kita membutuhkkan untuk membaca dari sebuah file, kita akan menggunakan system call untuk meminta sistem operasi untuk membaca file tersebut untuk kita.

Lebih detail tentang System call Cara system call bekerja adalah sebagai berikut. Pertama-tama, user program akan mensetup argument untuk system call. Salah satu argumen adalah nomor system call. Perlu di catat bahwa semua ini dilakukan secara automatis oleh fungsi library kecuali jika kita menulis menggunakan bahasa assembler. Sesudah semua argumen di setup, program akan menjalankan instruksi "system call". Instruksi ini akan menyebabkan exception: event yang akan menyebabkan processor untuk jump ke satu address dan mulai menjalankan program / code di address tersebut.

Instruksi di alamat yang baru akan menyimpan state user program, menentukan sistem call apa yang kita inginkan, kemudian call fuction tersebut di kernel yang mengimplementasikan system call, setelah selesai maka mengembalikan program state, dan kembali ke user program. Sebuah system call adalah salah satu cara agar function yang di definisikan dalam device driver untuk bisa di panggil. Bagi yang ingin mendalami lebih lanjut, di persilahkan untuk membaca selanjutnya.

Contoh System Call Berikut kita akan mulai memperlihatkan code beserta sedikit teorinya. Kita akan mengikuti gerakan dari system call read(), mulai dari instruksi system call di jalankan. Arsitektur PowerPC akan digunakan sebagai contoh dari code yang spesifik arsitektur. Di PowerPC, saat kita menjalankan system call, processor akan jump ke address 0xc00. Code pada lokasi ini di definisikan pada file:

arch/ppc/kernel/head.S

Ini akan tampak seperti:

/* System call */ . = 0xc00 SystemCall: EXCEPTION_PROLOG EXC_XFER_EE_LITE(0xc00, DoSyscall)

/* Single step - not used on 601 */ EXCEPTION(0xd00, SingleStep, SingleStepException, EXC_XFER_STD) EXCEPTION(0xe00, Trap_0e, UnknownException, EXC_XFER_EE)

Yang akan dilakukan oleh code ini adalah menyimpan state program, dan call function DoSyscall. Berikut adalah penjelasan lebih detail:

• EXCEPTION_PROLOG adalah sebuah macro yang akan menangani switch dari user ke kernel space, yang akan melakukan hal seperti menyimpan kondisi register dari proses user.

• EXC_XFER_EE_LITE akan dipanggil menggunakan address dari route tersebut, dan address dari function DoSyscall. Pada suatu saat, register akan di simpan dan DoSyscall akan di panggil. Dua kalimat selanjutnya adalah exception vector pada address 0xd00 dan 0xe00.

EXC_XFER_EE_LITE akan tampak sebagai berikut:

#define EXC_XFER_EE_LITE(n, hdlr) \ EXC_XFER_TEMPLATE(n, hdlr, n+1, COPY_EE, transfer_to_handler, \ ret_from_except)

EXC_XFER_TEMPLATE adalah macro, dan code akan tampak sebagai berikut:

#define EXC_XFER_TEMPLATE(n, hdlr, trap, copyee, tfer, ret) \ li r10,trap; \ stw r10,TRAP(r11); \ li r10,MSR_KERNEL; \ copyee(r10, r9); \ bl tfer; \ i##n: \ .long hdlr; \ .long ret li singkatan dari "load immediate", yang berarti nilai kontanta yang diketahui saat waktu compile di simpan di register. Pertama kali, trap di load ke register r10. Di kalimat selanjutnya, nilai tersebut di simpan ke address yang diberikan oleh TRAP(r11). TRAP(r11) dan dua kalimat selanjutnya melakukan manipulasi bit spesifik, yang pada dasarnya melakukan housekeeping, dan kemudian men-transfer kontrol ke register, oleh karenanya kita akan melihat .long DoSyscall bukan bl DoSyscall.

Selanjutnya, mari kita lihat DoSyscall. Ini ada di file:

arch/ppc/kernel/entry.S

Pada saatnya, function ini akan me-load address dari tabel syscall dan index ke address tersebut menggunakan nomor system call . Tabel syscall adalah apa yang digunakan oleh sistem operasi (OS) untuk menterjemahkan nomor system call ke system call tertentu. Tabel system call bernama sys_call_table didefinisikan di:

arch/ppc/kernel/misc.S

Tabel syscall berisi address dari function yang mengimplementasikan setiap system call. Contoh, function system call read() bernama sys_read. Nomor system call read() adalah 3, oleh karenanya address dari sys_read() adalah entry ke 4 di tabel system call (karena nomor pertama system call adalah 0). Kita membaca data dari address sys_call_table + (3 * word_size) dan kita akan memperoleh address dari sys_read().

Setelah DoSyscall diperoleh address system call yang benar, dia akan mentransfer kontrol ke system call tersebut. Mari kita lihat dimana sys_read() di definisikan, dalam file:

fs/read_write.c

Function ini akan mengambil fice struct yang berhubungan dengan nomor fd yang kita kirim ke function read(). Struct ini berisi pointer ke function yang harusnya digunakan untuk membaca data dari file tertentu. Setelah melakukan beberapa check, dia akan call function read untuk file tertentu untuk membaca data dari file, dan kemudian return. Function file spesifik ini di definisikan di tempat lain, contohnya,socket code, file system code, atau device driver code. Di titik ini, sebuah subsystem kernel yang spesifik akan berinteraksi dengan kernel secara keseluruhan. Setelah function read kita selesai, kita akan kembali dari sys_read(), kembali ke DoSyscall(), akan akan men-switch control ret_from_except, yang di definisikan di:

arch/ppc/kernel/entry.S

Di tempat sini akan di cek task yang perlu diselesaikan sebelum switch kembali ke user mode. Jika tidak ada lagi yang perlu dilakukan, kita akan kembali ke function restore, yang akan me-restore state user proses dan mengembalikan control ke user program. Selesai sudah call ke read(). Jika kita beruntung, kita akan memperoleh data kita kembali.

Kita dapat mengeksplorasi syscall lebih dalam lagi dengan menempatkan printk pada berbagai tempat yang strategis. Pastikan untuk memberi batasan jumlah output dari printk, Contoh, kita dapat menambahkan printk ke syscall sys_read(), kita dapat menambahkan sebagai berikut:

static int mycount = 0;

if (mycount < 10) { printk ("sys_read called\n"); mycount++; } Selamat menikmati!

Membuat Kernel Modul Pada bagian ini, kita akan menulis dan load sebuah kernel modul sederhana. Dengan menuliskan sendiri modul kita menjadi belajar bagaimana menulis code kernel yang berdiri sendiri, belajar bagaimana menggunakan modul, dan menemukan beberapa aturan bagaimana kernel terkait menjadi satu kesatuan.

Catatan: instruksi disini ditulis untuk kernel 3.9.x yang mungkin tidak cocok untuk versi kernel yang berbeda.

Apakah kernel mendukung modul? Kernel yang kita gunakan, harus di compile dengan option:

[*] Enable loadable module support ---> [ ] Forced module loading [*] Module unloading [ ] Forced module unloading [*] Module versioning support [*] Source checksum for all modules [*] Module signature verification [ ] Require modules to be validly signed [*] Automatically sign all modules (NEW)

Pastikan pada saat kita mengcompile kernel opsi di atas di aktifkan. Jika tidak, kita perlu mengcompile ulang kernel.

Sebaiknya, sebelum berexperimen dengan kernel modul, kita mengcompile ulang kernel yang kita gunakan. Tentunya lengkap dengan update-grub dan kemudian boot ke kernel baru tersebut untuk berexperimen dengan kernel modul yang kita buat.

Rangka Kernel Modul Sederhana Pertama kali, kita perlu mencari lokasi directory tempat kernel di compile, biasanya di /usr/src/linux. Kemudian ubah directory ke drivers/misc dari directory source code Linux. Lakukan di shell

cd /usr/src/linux/drivers/misc

Edit file, misalnya, mymodule.c

vi mymodule.c

Sekarang, copy paste code berikut ke file mymodule.c

#include #include #include

static int __init mymodule_init(void) { printk ("My module worked!\n"); return 0; }

static void __exit mymodule_exit(void) { printk ("Unloading my module.\n"); return; }

module_init(mymodule_init); module_exit(mymodule_exit);

MODULE_LICENSE("GPL");

Simpan file .c tersebut. Edit Makefile di directory tersebut.

cd /usr/src/linux/drivers/misc vi Makefile

Tambahkan kalimat:

obj-m += mymodule.o

Compile module yang kita tulis:

# make -C [top directory dari source kernel] SUBDIRS=$PWD modules

Atau yang lebih jelas

# make -C /usr/src/linux SUBDIRS=$PWD modules

Jalankan Module

Load module. Tergantung versi kernel yang kita gunakan, ketik:

cd /usr/src/linux/drivers/misc insmod ./mymodule.ko Atau: cd /usr/src/linux/drivers/misc insmod ./mymodule.o

Tampaknya untuk kernel versi 3.8 ke atas lebih aman menggunakan .ko.

Cek apakah modul yang kita masukan jalan dengan baik, ketik:

# dmesg | tail

Kita harusnya melihat di akhir printout sebagai berikut:

My module worked!

Cek menggunakan

# lsmod | more Harusnya keluar kira-kira

Module Size Used by mymodule 12428 0

Selanjutnya, coba kita buang kernel module tersebut menggunakan perintah:

# rmmod mymodule

Cek output di dmesg,

# dmesg | tail

Kita harusnya akan melihat:

Unloading my module.

Selamat! Kita baru saja menulis & menjalankan kernel module yang baru.

Interface module/kernel Selanjutnya, mari kita bermain dengan module yang kita buat. Satu hal yang harus kita sadari bahwa module hanya dapat "melihat" function dan variable yang secara sengaja oleh kernel dibuat terlihat ke module.

Pertama-tama, mari kita coba cara yang SALAH! :) ..

Edit file kernel/printk.c

vi /usr/src/linux/kernel/printk.c

Dan tambahkan kalimat berikut sesudah semua include file dan dekat deklarasi variable global (tapi di luar semua function):

int my_variable = 0;

Atau yang lebih lengkap kira-kira sebagai berikut,

#define CREATE_TRACE_POINTS #include

int my_variable = 0;

/* * Architectures can override it: */ void asmlinkage __attribute__((weak)) early_printk(const char *fmt, ...) { }

Sekarang compile ulang kernel, update-grub dan reboot ke kernel yang baru.

Selanjutnya, tambahkan kalimat berikut di awal dari module kita dalam function mymodule_init, sebelum code lainnya:

extern int my_variable; printk ("my_variable is %d\n", my_variable); my_variable++;

Lebih jelasnya lakukan modifikasi pada function mymodule_init agar menjadi,

static int __init mymodule_init(void) { extern int my_variable; printk ("my_variable is %d\n", my_variable); my_variable++; printk ("My module worked!\n"); return 0; }

Simpan file yang kita ubah, dan di recompile module menggunakan perintah:

cd /usr/src/linux/drivers/misc make -C /usr/src/linux SUBDIRS=$PWD modules

Dan load module (ini harusnya akan gagal):

cd /usr/src/linux/drivers/misc insmod ./mymodule.ko

Saat loading module yang kita buat harusnya fail dengan message berikut:

insmod: error inserting './mymodule.ko': -1 Unknown symbol in module ini artinya kernel tidak mengijinkan module untuk "melihat" variable tersebut. Saat module di load, kernel akan me-resolve semua referensi external, seperti nama function atau nama variable. Jika dia tidak berhasil me-resolve semua nama yang ada dalam daftar simbol yang di export kernel, maka module tidak bisa menulis / menggunakan variable atau call ke function tersebut. Kernel mengalokasi tempat bagi variable my_variable entah mana, sayangnya module tidak bisa menemukannya.

Untuk memperbaiki ini, kita akan memasukan my_varible ke daftar symbol yang di export oleh kernel. Banyak directory di kernel mempunyai file yang di khususkan untuk meng-export symbol yang di definisikan dalam directory tersebut. Buka lagi file kernel/printk.c

vi /usr/src/linux/kernel/printk.c dan tambahkan kalimat berikut sesudah deklarasi varibel my_variable:

EXPORT_SYMBOL(my_variable);

Atau yang lebih lengkap kira-kira sebagai berikut,

#define CREATE_TRACE_POINTS #include

int my_variable = 0; EXPORT_SYMBOL(my_variable);

/* * Architectures can override it: */ void asmlinkage __attribute__((weak)) early_printk(const char *fmt, ...) { }

Recompile kernel, update-grub dan reboot ke kernel yang baru.

Sekarang coba untuk load module lagi:

cd /usr/src/linux/drivers/misc insmod ./mymodule.ko

Sekarang, saat kita cek dmesg

# dmesg | tail kita harusnya melihat:

my_variable is 0 My module worked!

Reload module:

cd /usr/src/linux/drivers/misc rmmod mymodule && insmod ./mymodule.ko

Cek dmesg

# dmesg | tail

Sekarang kita akan melihat:

Unloading my module. my_variable is 1 My module worked!

Setiap kali kita me-reload module, my_variable harus bertambah satu. Module yang kita buat dapat mengakses variable atau function yang ada di main kernel, selama secara explisit di export melalui deklarasi EXPORT_SYMBOL(). Contoh, function printk() di definisikan di kernel dan di export di file kernel/printk.c.

Membuat loadable kernel module sederhana adalah cara menyenangkan untuk mengeksplorasi kernel. Contoh, kita dapat menggunakan sebuah module untuk menyalakan dan mematikan printk, dengan mendefinisikan variable do_print di kernel yang awalnya di set 0. Maka semua printk menjadi tergantung pada "do_print":

if (do_print) printk ("Big long obnoxious message\n"); dan menyalakan do_print jika kernel module yang kita buat di load. Kita dapat mendefinisikan di modul yang kita buat ke daftar function yang di panggil ketika kernel menerima interupsi tertentu (gunakan cat /proc/interrupts untuk mencari tahu interupsi yang digunakan). function request_irq() menambahkan function yang kita buat ke daftar handler untuk line IRQ (Interrupt ReQuest) tertentu, yang mana kita dapat gunakan untuk mem-print out sebuah message setiap kita menerima interupsi di line tersebut. Kita dapat melakukan investigasi nilai dari variable yang di export dengan cara me-load module yang dapat membaca nilai tersebut dan langsung keluar (return nilai non-zero dari function module_init()). Variabel jiffies, yang naik setiap 1/100 detik (di kebanyakan platform), adalah kandidat yang baik untuk module seperti ini.

Semoga anda cukup bersemangat untuk bermain dengan kernel module!

Referensi • http://www.linuxchix.org/content/courses/kernel_hacking/lesson7 • http://www.linuxchix.org/content/courses/kernel_hacking/lesson8 • http://www.tldp.org/LDP/lkmpg/2.6/html/lkmpg.html BAB 12: MONITOR SISTEM OPERASI

Seringkali dalam mengoperasikan sebuah sistem operasi, kita perlu melihat performance sistem operasi yang sedang berjalan. Di Linux ada beberapa built-in command dan beberapa tool tambahan yang dapat digunakan untuk keperluan tersebut. Kebanyakan distribusi linux di persenjatai oleh banyak sekali tool untuk melakukan monitoring. Tool ini memberikan informasi tentang aktifitas sistem. Kita dapat menggunakan tool ini untuk melihat masalah dalam performance sistem.

Perintah di bawah ini akan dapat membantu analisa sistem dan debugging server seperti:

• Menemukan bottlenecks. • Disk (storage) bottlenecks. • CPU dan memory bottlenecks. • Network bottlenecks. top top menyediakan, dinamis real-time dari proses dalam sistem berjalan. Hal ini dapat menampilkan berbagai informasi, termasuk ringkasan kondisi sistem dan task yang saat ini sedang dikelola oleh kernel Linux. top akan mengupdate secara automatis setiap detik. Secara default, top akan menampilkan task yang paling memakan CPU.

Top juga memiliki kemampuan terbatas untuk memanipulasi proses. Kedua operasi dan informasi yang ditampilkan dapat dikonfigurasi, dan setiap detail konfigurasi dapat dibuat untuk bertahan saat restart.

Secara default, proses yang ditunjukkan diurutkan berdasarkan persentase penggunaan CPU, memberikan pandangan yang mudah ke dalam proses yang paling mengkonsumsi sumber daya. top - 08:39:14 up 14:18, 3 users, load average: 1.09, 1.04, 1.08 Tasks: 190 total, 2 running, 188 sleeping, 0 stopped, 0 zombie Cpu(s): 52.7%us, 3.1%sy, 0.0%ni, 44.2%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 2011972k total, 1631164k used, 380808k free, 53628k buffers Swap: 779148k total, 161836k used, 617312k free, 337676k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 3068 onno 20 0 1384m 495m 19m R 98 25.2 316:17.21 firefox 1267 root 20 0 170m 19m 4952 S 7 1.0 10:25.66 Xorg 2235 onno 20 0 1390m 63m 9088 S 5 3.3 5:03.61 compiz 2896 onno 20 0 513m 13m 6052 S 2 0.7 0:23.35 gnome-terminal 13162 root 20 0 17432 1364 952 R 0 0.1 0:00.07 top 1 root 20 0 24584 2008 1028 S 0 0.1 0:00.88 init 2 root 20 0 0 0 0 S 0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0 0.0 0:04.95 ksoftirqd/0 6 root RT 0 0 0 0 S 0 0.0 0:00.00 migration/0 7 root RT 0 0 0 0 S 0 0.0 0:00.24 watchdog/0

Hot key top yang sering digunakan

t Tampilkan informasi rangkuman off dan on. m Tampilkan informasi memory off dan on. A Urutkan tampilan berdasarkan konsumen sumber daya sistem yang paling besar. f Masuk ke layar konfigurasi interaktif pada top. o Enable agar kita dapat memilih secara interaktif dalam top. r Lakukan perintah renice. k Lakukan perintah kill. z Turn on or off color/mono htop seperti top, tapi agak lebih "user friendly". Instalasi htop menggunakan perintah

sudo apt-get install htop menjalankan htop menggunakan perintah

htop ps ps mengambil snapshot dari kelompok proses terpilih yang aktif. Secara default kelompok ini terbatas pada proses yang dimiliki oleh pengguna saat ini dan terkait dengan terminal yang sama.

Hal ini dapat memberikan informasi lebih rinci tentang proses yang terjadi daripada top, tapi tidak dinamis.

Untuk memilih semua proses gunakan -A atau -e:

ps -A ps -e

Contoh keluaran

PID TTY TIME CMD 1 ? 00:00:00 init 2 ? 00:00:00 kthreadd 3 ? 00:00:05 ksoftirqd/0 6 ? 00:00:00 migration/0 7 ? 00:00:00 watchdog/0 8 ? 00:00:00 migration/1 ...... 12400 ? 00:00:00 -worker-2 12403 ? 00:00:00 btrfs-endio-met 12508 ? 00:00:00 kworker/0:0 12723 ? 00:00:00 kworker/1:0 13329 ? 00:00:00 kworker/1:2 13541 pts/2 00:00:00 ps ps tidak berbeda jauh dengan top tapi memberikan lebih banyak informasi. Untuk memberikan Long Format output:

ps -Al

Untuk mengaktifkan extra full mode, ini akan memperlihatkan command line argumen yang dikirimkan ke proses ps -AlF

Untuk melihat thread ( LWP dan NLWP)

ps -AlFH

Untuk melihat thread setelah di proses

ps -AlLm

Untuk melihat semua proses yang ada di server

ps ax ps axu

Print proses tree

ps -ejH ps axjf pstree

Print informasi security

ps -eo euser,ruser,suser,fuser,f,comm,label ps axZ ps -eM

Lihat semua proses yang jalan sebagai User www-data

ps -U www-data -u www-data u

Set output dalam format yang user-defined

ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm ps -eopid,tt,user,fname,tmout,f,wchan

Display hanya proses ID dari firefox

ps -C firefox -o pid= ps -C soffice.bin -o pid= pgrep firefox pgrep soffice.bin

Tampilkan nama dari PID 55977

ps -p 55977 -o comm=

Tampilkan top 10 proses yang mengkonsumsi memory

ps -auxf | sort -nr -k 4 | head -10

Tampilkan top 10 proses yang mengkonsumsi CPU

ps -auxf | sort -nr -k 3 | head -10 vmstat vmstat (Statistik Virtual Memory) mengeluarkan laporan seketika tentang proses dalam sistem, memori, paging, block I/O, interupsi dan aktivitas CPU.

Meskipun tidak dinamis seperti top, kita dapat menentukan interval sampling, yang memungkinkan kita mengamati aktivitas sistem mendekati real time.

vmstat 3

Contoh output: procs ------memory------swap------io---- -system------cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 3 0 160988 93024 64376 609380 1 2 42 47 11 129 21 1 76 1 2 0 160988 75440 52892 640592 0 0 19168 0 963 760 91 4 0 5 2 0 160988 75208 38260 658948 0 0 16316 198 887 661 85 3 2 11 1 1 160988 75304 31272 663872 0 0 16584 4 1055 1014 92 5 0 4 1 1 160988 76816 30100 667352 0 0 4 55416 1349 3649 51 8 0 41

Dapatkan penggunaan memory

vmstat -m

Dapatkan informasi tentang penggunaan page memory yang aktif / tidak aktif.

vmstat -a sar sar (Sistem Reporter Activity) mengumpulkan dan melaporkan informasi tentang aktivitas sistem saat ini. sar dapat di instalasi melalui perintah

apt-get install sysstat

Dan edit file

vi /etc/default/sysstat agar

ENABLED="true"

Kemudian restart sysstat

/etc/init.d/sysstat restart setelah data di koleksi. Untuk melihat network counter, ketik

sar -n DEV | more

Untuk melihat network counter dari sa18

sar -n DEV -f /var/log/sysstat/sa18 | more

Kita juga dapat melihat penggunan secara real time menggunakan sar sar 2 5

Contoh keluaran

Linux 3.8.0-19-generic (mesh) 18/05/13 _x86_64_ (2 CPU)

05:39:35 CPU %user %nice %system %iowait %steal %idle 05:39:37 all 50,61 0,00 6,63 0,00 0,00 42,75 05:39:39 all 50,00 0,00 6,75 0,25 0,00 43,00 05:39:41 all 48,80 0,00 11,24 0,24 0,00 39,71 05:39:43 all 50,83 0,00 8,55 0,24 0,00 40,38 05:39:45 all 50,85 0,00 8,52 0,00 0,00 40,63 Average: all 50,22 0,00 8,36 0,15 0,00 41,27

Alat ini merupakan alternatif yang berguna untuk mencoba untuk membuat laporan berkala tentang aktivitas sistem dari top. w Perintah w menampilkan informasi tentang user yang saat ini sedang on di mesin, dan proses yang mereka gunakan.

Perintah yang dapat digunakan

w w username

Contoh keluaran

05:40:45 up 1:24, 3 users, load average: 1,47, 1,54, 1,48 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT onno tty7 :0 04:16 1:24m 3:08 0.32s gnome-session onno pts/0 :0 04:16 1:24m 1.21s 19.29s gnome-terminal onno pts/1 :0 04:51 48:51 0.20s 19.29s gnome-terminal uptime Perintah uptime dapat digunakan untuk melihat berapa lama sistem telah berjalan, waktu sekarang di komputer, berapa user yang sedang log on, beban sistem 1, 5 dan 15 menit terakhir.

uptime hasilnya kurang lebih

05:41:50 up 1:25, 3 users, load average: 1,57, 1,57, 1,50

Load akan berubah dari satu sistem ke sistem lain. Untuk sistem dengan 1 CPU maka load 1-3 cukup optimal. Untuk sebuah sistem SMP maka load 6-10 masih dapat di terima. free Perintah ini menampilkan jumlah memory yang digunakan secara fisik dan swap memory yang ada di sistem, juga buffer yang digunakan oleh kernel.

free Contoh output

total used free shared buffers cached Mem: 1945972 1848784 97188 0 20016 747324 -/+ buffers/cache: 1081444 864528 Swap: 779148 7384 771764 iostat Perintah iostat melaporkan statistik CPU dan input/output dari device, partisi maupun network file system (NFS)

iostat

Contoh output

Linux 3.2.0-29-generic (openbts28) 03/23/2013 _x86_64_ (2 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 21.76 0.14 1.04 1.28 0.00 75.79

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 4.41 56.67 52.68 3183588 2959436 sdb 4.44 28.00 43.68 1572868 2454036 mpstat Perintah mpstat menampilkan aktifitas masing-masing processor yang tersedia. Processor 0 sebagai yang pertama. Untuk menampilkan rata-rata pengunakan CPU per processor, ketik:

mpstat -P ALL

Contoh output:

Linux 3.8.0-19-generic (mesh) 18/05/13 _x86_64_ (2 CPU)

05:44:05 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 05:44:05 all 36,38 0,34 5,30 7,54 0,00 0,56 0,00 0,00 49,88 05:44:05 0 36,23 0,31 5,26 7,42 0,00 1,05 0,00 0,00 49,73 05:44:05 1 36,53 0,36 5,34 7,66 0,00 0,07 0,00 0,00 50,04 pmap Perintah pmap melaporkan memory map dari sebuah proses. Gunakan perintah ini untuk melihat bottleneck di memory. Ketik

pmap -d PID

Untuk menampilkan informasi memory proses untuk PID # 15070, ketik:

pmap -d 15070

Contoh output:

15070: /usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe=6 Address Kbytes Mode Offset Device Mapping 0000000000400000 4 r-x-- 0000000000000000 008:00002 soffice.bin 0000000000600000 4 r---- 0000000000000000 008:00002 soffice.bin 0000000000601000 4 rw--- 0000000000001000 008:00002 soffice.bin 0000000001d4d000 19612 rw--- 0000000000000000 000:00000 [ anon ] 00007fc830000000 140 rw--- 0000000000000000 000:00000 [ anon ] 00007fc830023000 65396 ----- 0000000000000000 000:00000 [ anon ] 00007fc834718000 32 r-x-- 0000000000000000 008:00002 libmcnttype.so 00007fc834720000 2044 ----- 0000000000008000 008:00002 libmcnttype.so 00007fc83491f000 4 r---- 0000000000007000 008:00002 libmcnttype.so 00007fc834920000 4 rw--- 0000000000008000 008:00002 libmcnttype.so 00007fc834921000 72 r-x-- 0000000000000000 008:00002 gnome-keyring-pkcs11.so 00007fc834933000 2044 ----- 0000000000012000 008:00002 gnome-keyring-pkcs11.so 00007fc834b32000 8 r---- 0000000000011000 008:00002 gnome-keyring-pkcs11.so 00007fc834b34000 4 rw--- 0000000000013000 008:00002 gnome-keyring-pkcs11.so ...... 00007fc872ccd000 4 r-xs- 0000000000000000 008:00002 .execoooxQzg4m (deleted) 00007fc872cce000 4 rw-s- 0000000000000000 008:00002 .execoooxQzg4m (deleted) 00007fc872ccf000 4 rw--- 0000000000000000 000:00000 [ anon ] 00007fc872cd0000 12 r---- 0000000000000000 008:00002 user 00007fc872cd3000 4 r--s- 0000000000000000 008:00002 user 00007fc872cd4000 80 rw--- 0000000000000000 000:00000 [ anon ] 00007fc872ce8000 4 r---- 0000000000022000 008:00002 ld-2.15.so 00007fc872ce9000 8 rw--- 0000000000023000 008:00002 ld-2.15.so 00007fff36b4d000 132 rw--- 0000000000000000 000:00000 [ stack ] 00007fff36bff000 4 r-x-- 0000000000000000 000:00000 [ anon ] ffffffffff600000 4 r-x-- 0000000000000000 000:00000 [ anon ] mapped: 1105764K writeable/private: 97360K shared: 15184K

Kalimat terakhir sangat penting:

• mapped: 1105764K total memory yang di map ke file. • writeable/private: 97360K jumlah alamat memory private. • shared: 15184K jumlah alamat memory dari proses ini yang di sharing dengan proses yang lain. netstat Perintah netstat menampilkan informasi tentang sambungan jaringan, tabel routing, statitik interface, sambungan masquerade, dan keanggotaan multicast. Contoh penggunaannya:

netstat -nr

Contoh output:

Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 0.0.0.0 192.168.0.222 0.0.0.0 UG 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 192.168.13.0 192.168.0.33 255.255.255.0 UG 0 0 0 eth0

Melihat IP dan socket yang saling terhubung

netstat -an

Contoh output

Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN tcp 0 0 192.168.0.3:59669 173.194.38.149:443 ESTABLISHED tcp 0 0 192.168.0.3:34229 69.171.235.16:80 ESTABLISHED tcp 0 0 192.168.0.3:33922 69.171.235.16:80 ESTABLISHED tcp 0 0 192.168.0.3:34049 69.171.235.16:80 ESTABLISHED tcp 0 0 192.168.0.3:34252 69.171.235.16:80 ESTABLISHED tcp 0 0 192.168.0.3:34097 69.171.235.16:80 ESTABLISHED tcp 0 0 192.168.0.3:50100 192.168.0.7:9090 ESTABLISHED tcp 0 0 192.168.0.3:38858 111.95.240.27:443 ESTABLISHED tcp 0 0 192.168.0.3:34076 69.171.235.16:80 ESTABLISHED ss Perintah ss digunakan untuk dump statistik socket. ss memungkinkan untuk melihat informasi yang mirip dengan netstat. Cara mengunakannya

ss

Contoh tampilan State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.0.3:55530 111.94.248.38:https ESTAB 0 0 192.168.0.3:59669 173.194.38.149:https ESTAB 0 0 192.168.0.3:34229 69.171.235.16:http ESTAB 0 0 192.168.0.3:33922 69.171.235.16:http ESTAB 0 0 192.168.0.3:34049 69.171.235.16:http ESTAB 0 0 192.168.0.3:34252 69.171.235.16:http ESTAB 0 0 192.168.0.3:34097 69.171.235.16:http ESTAB 0 0 192.168.0.3:50100 192.168.0.7:9090 iptraf Perintah iptraf adalah IP LAN monitor yang berwarna warni. iptraf menampilkan berbagai statistik jaringan termasuk TCP info, UDP count, informasi ICMP dan OSPF, info load Ethernet, statistik node, cek IP.

Instalasi iptraf menggunakan perintah

apt-get install iptraf

Menjalankan iptraf menggunakan perintah

iptraf

Hasilnya kira-kira Dalam gambar tampak tampilan awal saat iptraf mulai di aktifkan. Gambar di atas memperlihatkan tampilan pilihan menu yang dapat kita pilih saat menggunakan iptraf. Kita dapat memilih, misalnya,

• Memonitor traffic IP di jaringan. • Statistik berbagai interface jaringan yang ada. • Melihat traffic yang spesifik menggunakan fasilitas filter yang ada. Gambar di atas memperlihat tampilan layar saat kita memilih interface mana yang akan di monitor. Gambar di atas memperlihat traffic IP yang berhasil di tangkap oleh iptraf. Gambar di atas memperlihatkan statistik masing-masing interface maupun kecepatan paket yang ada. Gambar di atas memperlihatkan tampilan dari statistik traffic secara detail dari salah satu interface jaringan yang ada di komputer kita.

Referensi • http://www.cyberciti.biz/tips/top-linux-monitoring-tools.html BAB 13: BENCHMARK SISTEM OPERASI

Salah satu pekerjaan yang tidak kalah penting dalam mengeksplorasi sebuah sistem operasi adalah mengukur kemampuan sistem operasi yang kita gunakan. Kegiatan pengukuran ini biasanya di sebut “Benchmarking”.

Ada cukup banyak aplikasi yang tersedia secara bebas untuk melakukan benchmatking. Bagi anda yang cukup rajin dapat dengan mencari di Google dengan keyword “benchmark”. Berikut adala daftar dari sebagian aplikasi tersebut, sebagian besar belum sempat penulis coba dan cek. Informasi yang diberikan juga sebagian masih dalam bahasa Inggris. Beberapa aplikasi yang ada dalam daftar di bawah mungkin sudah kadaluarsa, bagi pembaca yang cukup ulet mungkin dapat memperoleh dan memperbaiki aplikasi benchmark tersebut.

Synthetic Benchmark • http://www.bitmover.com/lmbench/ lmbench - a GPL'd suite of atomic benchmarks, no publishing restrictions • UnixBench - a fundamental high-level Linux benchmark suite, Unixbench integrates CPU and file I/O tests, as well as system behaviour under various user loads • LLCBench http://icl.cs.utk.edu/projects/llcbench/index.htm - LLCbench (Low-Level Characterization Benchmarks) was created by combining MPBench, CacheBench, and BLASBench into a single benchmark package. • IOZone http://www.iozone.org/ - IOzone is a filesystem benchmark tool. • http://www.caldera.com/developers/community/contrib/aim.html AIM9 - the AIM Independent Resource Benchmark exercises and times each component of a UNIX computer system, independently. The benchmark uses 58 subtests to generate absolute processing rates, in operations per second, for subsystems, I/O transfers, function calls, and UNIX system calls. GPL'd and can be published under the "non-audited" clause. • http://www.netperf.org/netperf/NetperfPage.html Netperf - a sophisticated network and filesystem benchmark, freely available, publishable? • ftp://onet4.external.hp.com/dist/networking/benchmarks/SSLperf/ SSLperf - open source web benchmark designed to measure performance of SSL operations • ftp://samba.org/pub/tridge/dbench/README dbench - similar workload to netbench but GPL'd and much easier to config and run (doesn't require clients), suite also includes tbench and smbtorture, no publishing restrictions • http://www.garloff.de/kurt/linux/bonnie/ Bonnie - io throughput benchmark, GPL'd with no publishing restrictions • Bonnie++ an enhanced version of bonnie written in C++, GPL'd with no publishing restrictions • http://www.iozone.org/ Iozone is useful for performing a broad filesystem analysis of a vendor's computer platform. The benchmark tests file I/O performance for the following operations: Read, write, re-read, re-write, read backwards, read strided, fread, fwrite, random read, pread ,mmap, aio_read, aio_write. It has recently added tests for NFS, CIFS, and distributed/cluster systems. • http://www.spec.org/ SPEC CPU2000 - benchmark suite designed to evaluate raw cpu and compiler power • http://www.tux.org/~mayer/linux/bmark.html BYTEmark - CPU benchmark suite, reporting CPU/cache/memory, integer and floating-point performance • http://icl.cs.utk.edu/projects/llcbench/cachebench.html Cachebench - measures bandwidth of the memory subsystem (L1, L2 and main memory) • http://www.cs.virginia.edu/stream/ Stream - measures sustainable memory bandwidth vs. FPU performance • http://www.spec.org/ SPECviewperf - synthetic graphics benchmark • http://www.tux.org/pub/benchmarks/ Xengine - a little X window toy that shows the speed with which a system will redraw a coloured bitmap on screen (a simulation of a four cycle engine). • http://www.ibiblio.org/pub/X11/contrib/utilities/xbench-0.2.README Xbench Xserver benchmark

Benchmark Aplikasi • http://www.acnc.com/benchmarks/bonnie.tar.gz - Bonnie - One of the best "open systems" benchmarks available. It can be compiled under different UNIX flavors. We have successfully run it under SCO UNIX, Linux, Solaris, and BSDI. It should also compile with minimal changes under other • http://osdb.sourceforge.net/ Open Source Database Benchmark - GPL'd benchmark based on the AS3AP database benchmark with no publishing restrictions • http://www.volano.com/benchmarks.html VolanoMark - a Java-based chat room benchmark, freely availible, publishable? • http://lbs.sourceforge.net/chat/chat-1.0.1.tar.gz chat - a GPL'd chat room benchmark written in C, designed to emulate VolanoMark behavior, no publishing restrictions • http://www.coker.com.au/postal/ Postal SMTP mail delivery test and POP mail reception test • http://www.caldera.com/developers/community/contrib/aim.html AIM7 - the AIM Multiuser Benchmark - Suite VII tests and measures the performance of Open System multiuser computers. It comes with preconfigured workload mixes for Multiuser/Shared System, Compute Server, Large Database,and File Server. Publishable under the "non-audited" clause. • http://www.mindcraft.com/webstone/ Webstone - web server benchmark, freely availible, publishable? • http://www.sissa.it/furio/mdbnch.html MDBNCH - a large FORTRAN 77 application benchmark, accesses a large data set in a very irregular pattern, generates misses in both the L1 and L2 caches • http://www.tpc.org/bench.descrip.html TPC-A - now defunct Online Transaction Processing (OLTP) database benchmark • http://www.tpc.org/bench.descrip.html TPC-B - now defunct Online Transaction Processing (OLTP) database benchmark • http://www.tpc.org/bench.descrip.html TPC-C - current industry standard Online Transaction Processing (OLTP) database benchmark • http://www.tpc.org/bench.descrip.html TPC-D - now defunct Decision Support System (DSS) database benchmark • http://www.tpc.org/bench.descrip.html TPC-H - current industry standard ad-hoc DSS database benchmark • http://www.tpc.org/bench.descrip.html TPC-R - current industry standard Business Reporting database benchmark • http://www.tpc.org/bench.descrip.html TPC-W - current industry standard E-commerce database benchmark • http://www.spec.org/ SPEC apc - graphics application benchmark • http://www.spec.org/ SPEC HPC96 - hpc application benchmark • http://www.spec.org/ SPEC JBB2000 - server-side Java benchmark • http://www.spec.org/ SPEC JVM98 - client-side Java benchmark • http://www.spec.org/ SPEC SFS97 - NFS benchmark • http://www.spec.org/ SPEC WEB99 - Web server benchmark • http://www.spec.org/ SPEC SDM - defunct multi-user system benchmark • http://www.nas.nasa.gov/Software/NPB/ NAS Parallel Benchmark - Computational Fluid Dynamics benchmark, source freely available, publishable? • http://www.nas.nasa.gov/Research/Software/swdesciption.html ARC2D Benchmark - scientific benchmark, source freely available, publishable? • http://www.netlib.org/parkbench/ PARKBENCH - PARellel Kernels and BENCHmarks • http://www.netlib.org/benchmark/hpl/ High Performance Linpack Benchmark

UnixBench UnixBench adalah salah satu aplikasi yang dapat kita gunakan untuk mengevaluasi kemampuan komputasi komputer yang kita gunakan. Ada banyak test yang dilakukan oleh UnixBench yang lumayan memusingkan untuk di bahas dalam waktu yang singkat. Yang menarik UnixBench akan pada akhirnya memberikan Final Score dari komputer yang kita evaluasi / benchmarking.

UnixBench versi 4.1.0 lebih di arahkan untuk single processor. UnixBench 5.1.3 lebih di arahkan untuk multicore. Dalam contoh disini akan digunakan UnixBench 5.1.3.

Dari hasil evaluasi yang ada tampak bahwa score UnixBench untuk masing-masing processor berikut adalah,

Hasil UnixBench 5.1.2 • UnixBench 5.2.1: Laptop Celeron CPU 550 @ 2.00GHz FINAL SCORE 649.0 • UnixBench 5.2.1: Laptop Axioo Zetta Dual CPU U7300 @ 1.30GHz FINAL SCORE 745.2 • UnixBench 5.2.1: Server Rainer Quad CPU X3430 @ 2.40GHz FINAL SCORE 2871.5

Hasil UnixBench 5.1.3 • UnixBench 5.1.3: Pentium Dual Core T2390 1.86GHz FINAL SCORE 1289 • UnixBench 5.1.3: Server Rainer Quad CPU Baru FINAL SCORE 3922

Proses instalasi UnixBench cukup sederhana. Pertama-tama kita perlu menginstalasi aplikasi pendukung sebagai berikut

sudo apt-get install mesa-common-dev libsdl-net1.2-dev libsdl-net1.2

Download UnixBench dari

• http://code.google.com/p/byte-unixbench/downloads/detail? name=UnixBench5.1.3.tgz&can=2&q= • http://byte-unixbench.googlecode.com/files/UnixBench5.1.3.tgz Buka source code UnixBench menggunakan perintah

cp UnixBench5.1.3.tgz /usr/local/src/ cd /usr/local/src/ tar zxvf UnixBench5.1.3.tgz cd /usr/local/src/UnixBench

Entah kenapa -lXext tidak tersedia di Ubuntu source. Oleh karenanya Makefile perlu di edit

cd /usr/local/src/UnixBench vi Makefile pastikan

# Set "GL_LIBS" to the libraries needed to link a GL program. # GL_LIBS = -lGL -lXext -lX11 GL_LIBS = -lGL -lX11

Lanjutkan dengan mengcompile UnixBench

cd /usr/local/src/UnixBench make

Untuk menjalankan UnixBench dapat menggunakan perintah

cd /usr/local/src/UnixBench ./Run

Contoh Hasil Evaluasi UnixBench untuk Rainer Server Quad Core Setelah menjalankan

cd /usr/local/src/UnixBench ./Run

Atau jika kita ingin menyimpan hasilnya di sebuah file text dapat menggunakan perintah

cd /usr/local/src/UnixBench ./Run > hasilevaluasi.txt

Maka akan tampak hasil sebagai berikut make all make[1]: Entering directory `/usr/local/src/UnixBench' Checking distribution of files ./pgms exists ./src exists ./testdir exists ./tmp exists ./results exists make[1]: Leaving directory `/usr/local/src/UnixBench' sh: 3dinfo: not found

# # # # # # # ##### ###### # # #### # # # # ## # # # # # # # ## # # # # # # # # # # # ## ##### ##### # # # # ###### # # # # # # ## # # # # # # # # # # # # ## # # # # # # # ## # # # # #### # # # # # ##### ###### # # #### # # Version 5.1.3 Based on the Byte Magazine Unix Benchmark

Multi-CPU version Version 5 revisions by Ian Smith, Sunnyvale, CA, USA January 13, 2011 johantheghost at yahoo period com

1 x Dhrystone 2 using register variables 1 2 3 4 5 6 7 8 9 10

1 x Double-Precision Whetstone 1 2 3 4 5 6 7 8 9 10

1 x Execl Throughput 1 2 3

1 x File Copy 1024 bufsize 2000 maxblocks 1 2 3

1 x File Copy 256 bufsize 500 maxblocks 1 2 3

1 x File Copy 4096 bufsize 8000 maxblocks 1 2 3

1 x Pipe Throughput 1 2 3 4 5 6 7 8 9 10

1 x Pipe-based Context Switching 1 2 3 4 5 6 7 8 9 10

1 x Process Creation 1 2 3

1 x System Call Overhead 1 2 3 4 5 6 7 8 9 10

1 x Shell Scripts (1 concurrent) 1 2 3

1 x Shell Scripts (8 concurrent) 1 2 3

4 x Dhrystone 2 using register variables 1 2 3 4 5 6 7 8 9 10

4 x Double-Precision Whetstone 1 2 3 4 5 6 7 8 9 10

4 x Execl Throughput 1 2 3

4 x File Copy 1024 bufsize 2000 maxblocks 1 2 3

4 x File Copy 256 bufsize 500 maxblocks 1 2 3

4 x File Copy 4096 bufsize 8000 maxblocks 1 2 3

4 x Pipe Throughput 1 2 3 4 5 6 7 8 9 10

4 x Pipe-based Context Switching 1 2 3 4 5 6 7 8 9 10

4 x Process Creation 1 2 3

4 x System Call Overhead 1 2 3 4 5 6 7 8 9 10

4 x Shell Scripts (1 concurrent) 1 2 3

4 x Shell Scripts (8 concurrent) 1 2 3

======BYTE UNIX Benchmarks (Version 5.1.3)

System: ubuntu: GNU/Linux OS: GNU/Linux -- 2.6.38-8-generic-pae -- #42-Ubuntu SMP Mon Apr 11 05:17:09 UTC 2011 Machine: i686 (i386) Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8") CPU 0: Intel(R) Xeon(R) CPU E31220 @ 3.10GHz (6186.5 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, Intel virtualization CPU 1: Intel(R) Xeon(R) CPU E31220 @ 3.10GHz (6185.6 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, Intel virtualization CPU 2: Intel(R) Xeon(R) CPU E31220 @ 3.10GHz (6185.6 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, Intel virtualization CPU 3: Intel(R) Xeon(R) CPU E31220 @ 3.10GHz (6185.7 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, Intel virtualization 10:13:44 up 37 min, 2 users, load average: 0.00, 0.20, 0.33; runlevel 2

------Benchmark Run: Mon Aug 22 2011 10:13:44 - 10:41:53 4 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables 27028995.2 lps (10.0 s, 7 samples) Double-Precision Whetstone 3694.6 MWIPS (10.1 s, 7 samples) Execl Throughput 1818.2 lps (29.9 s, 2 samples) File Copy 1024 bufsize 2000 maxblocks 905571.6 KBps (30.0 s, 2 samples) File Copy 256 bufsize 500 maxblocks 235938.4 KBps (30.0 s, 2 samples) File Copy 4096 bufsize 8000 maxblocks 2394304.6 KBps (30.0 s, 2 samples) Pipe Throughput 1391286.6 lps (10.0 s, 7 samples) Pipe-based Context Switching 103200.4 lps (10.0 s, 7 samples) Process Creation 6928.6 lps (30.0 s, 2 samples) Shell Scripts (1 concurrent) 2988.6 lpm (60.0 s, 2 samples) Shell Scripts (8 concurrent) 2173.9 lpm (60.0 s, 2 samples) System Call Overhead 3454151.4 lps (10.0 s, 7 samples)

System Benchmarks Index Values BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 27028995.2 2316.1 Double-Precision Whetstone 55.0 3694.6 671.7 Execl Throughput 43.0 1818.2 422.8 File Copy 1024 bufsize 2000 maxblocks 3960.0 905571.6 2286.8 File Copy 256 bufsize 500 maxblocks 1655.0 235938.4 1425.6 File Copy 4096 bufsize 8000 maxblocks 5800.0 2394304.6 4128.1 Pipe Throughput 12440.0 1391286.6 1118.4 Pipe-based Context Switching 4000.0 103200.4 258.0 Process Creation 126.0 6928.6 549.9 Shell Scripts (1 concurrent) 42.4 2988.6 704.9 Shell Scripts (8 concurrent) 6.0 2173.9 3623.1 System Call Overhead 15000.0 3454151.4 2302.8 ======System Benchmarks Index Score 1192.4

------Benchmark Run: Mon Aug 22 2011 10:41:53 - 11:10:06 4 CPUs in system; running 4 parallel copies of tests

Dhrystone 2 using register variables 101277900.4 lps (10.0 s, 7 samples) Double-Precision Whetstone 13912.2 MWIPS (10.1 s, 7 samples) Execl Throughput 17314.3 lps (29.9 s, 2 samples) File Copy 1024 bufsize 2000 maxblocks 1038497.5 KBps (30.0 s, 2 samples) File Copy 256 bufsize 500 maxblocks 260124.3 KBps (30.0 s, 2 samples) File Copy 4096 bufsize 8000 maxblocks 3481131.0 KBps (30.0 s, 2 samples) Pipe Throughput 5225083.6 lps (10.0 s, 7 samples) Pipe-based Context Switching 1090117.8 lps (10.0 s, 7 samples) Process Creation 51257.5 lps (30.0 s, 2 samples) Shell Scripts (1 concurrent) 19170.4 lpm (60.0 s, 2 samples) Shell Scripts (8 concurrent) 2577.0 lpm (60.0 s, 2 samples) System Call Overhead 10050981.5 lps (10.0 s, 7 samples)

System Benchmarks Index Values BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 101277900.4 8678.5 Double-Precision Whetstone 55.0 13912.2 2529.5 Execl Throughput 43.0 17314.3 4026.6 File Copy 1024 bufsize 2000 maxblocks 3960.0 1038497.5 2622.5 File Copy 256 bufsize 500 maxblocks 1655.0 260124.3 1571.7 File Copy 4096 bufsize 8000 maxblocks 5800.0 3481131.0 6001.9 Pipe Throughput 12440.0 5225083.6 4200.2 Pipe-based Context Switching 4000.0 1090117.8 2725.3 Process Creation 126.0 51257.5 4068.1 Shell Scripts (1 concurrent) 42.4 19170.4 4521.3 Shell Scripts (8 concurrent) 6.0 2577.0 4295.0 System Call Overhead 15000.0 10050981.5 6700.7 ======System Benchmarks Index Score 3922.1

Tampak score yang di peroleh untuk Rainer Server dengan processor Xeon Quad adalah sekitar 3922.

Akan menarik jika kita dapat melakukan tuning kernel dan mencoba melihat effek-nya menggunakan UnixBench.

Referensi • http://www.acnc.com/benchmarks.html • http://lbs.sourceforge.net/ • http://www.tux.org/bench/ • http://code.google.com/p/byte-unixbench/ • http://www.hermit.org/Linux/Benchmarking/ • http://oss.sgi.com/LDP/HOWTO/Benchmarking-HOWTO.html BAB 14: SEPINTAS MEMBUAT ROM ANDROID SENDIRI

Sebetulnya ada beberapa sistem operasi yang dikembangkan untuk handphone. Beberapa diantaranya adalah, iOS, android, Firefox OS, , BlackBerry 10, , Sailfish OS, . Perbandingan berbagai sistem operasi handphone ini dapat dilihat di https://en.wikipedia.org/wiki/Comparison_of_mobile_operating_systems

Dari sekian banyak sistem operasi handphone yang tersedia, android merajai sistem operasi handphone dengan market share 86.6% (Q3 2016) di susul oleh iOS 12.5% (Q3 2016). Jelas disini bahwa android menjadi menarik untuk di pelajari di bandingkan sistem operasi handphone lainnya.

Android adalah sistem operasi mobile yang dikembangkan oleh Google, berdasarkan kernel Linux dan dirancang terutama untuk perangkat mobile touchscreen seperti smartphone dan tablet. user interface Android terutama didasarkan pada manipulasi langsung, menggunakan gerakan sentuh yang secara longgar sesuai dengan tindakan dunia nyata, seperti menggesekkan, menekan dan mencubit, untuk memanipulasi objek di layar, bersama dengan keyboard virtual untuk input teks. Selain perangkat touchscreen, Google telah mengembangkan lebih lanjut Android TV untuk televisi, Android Auto untuk mobil, dan Android Wear untuk jam tangan, masing-masing dengan user interface khusus. Varian Android juga digunakan pada notebook, konsol game, kamera digital, dan elektronik lainnya.

Awalnya dikembangkan oleh Android, Inc, yang dibeli Google pada tahun 2005, Android diresmikan pada tahun 2007 bersama dengan pendirian - konsorsium hardware, software, dan perusahaan telekomunikasi yang ditujukan untuk memajukan standar terbuka untuk perangkat mobile. Pada Juli 2013, Google Play Store telah memiliki lebih dari satu juta aplikasi Android ("apps") yang diterbitkan - termasuk banyak "aplikasi kelas bisnis" yang menyaingi bersaing platform mobile - dan lebih dari 50 miliar aplikasi yang diunduh. Sebuah 2013 survei April-Mei pengembang aplikasi mobile menemukan bahwa 71% dari pengembang membuat aplikasi untuk Android, dan survei 2015 menemukan bahwa 40% dari pengembang profesional penuh waktu melihat Android sebagai platform target prioritas mereka, yang sebanding dengan Apple iOS di 37% dengan kedua platform jauh di atas orang lain. Pada bulan September 2015, Android memiliki 1,4 miliar perangkat aktif bulanan.

Source code Android yang dirilis oleh Google di bawah lisensi open source, meskipun sebagian besar perangkat Android akhirnya dikirimkan dengan kombinasi open source dan software proprietary, termasuk perangkat lunak proprietary diperlukan untuk mengakses layanan Google. Android populer dengan perusahaan teknologi yang membutuhkan, murah siap pakai dan sistem operasi disesuaikan untuk perangkat berteknologi tinggi. Keterbukaannya telah mendorong komunitas besar pengembang dan penggemar untuk menggunakan kode open-source sebagai dasar untuk proyek-proyek berbasis masyarakat, yang memberikan update untuk perangkat yang lebih tua, menambahkan fitur baru untuk pengguna tingkat lanjut atau membawa Android ke perangkat awalnya dikirim dengan lainnya sistem operasi. Keberhasilan Android telah membuatnya menjadi target untuk paten (dan hak cipta) litigasi sebagai bagian dari apa yang disebut "perang smartphone" antara perusahaan teknologi.

Pada kesempatan ini akan di fokuskan cara membuat atau lebih tepatnya mengcompile sendiri sistem operasi android. Melakukan porting sistem operasi android di luar pembahasan nasakah buku ini, karena tingkat kesulitan yang ada. Sangat disarankan untuk memperhatikan berbagai diskusi di xda-developers.com forum bagi mereka yang ingin secara serius melakukan porting.

Bagi anda yang sudah berhasil menyelesaikan mengcompile sendiri sistem operasi Linux, maka sebetulnya mengcompile sistem operasi android tidak berbeda terlalu jauh dengan membuat sistem operasi Linux, karena android sendiri sebetulnya menggunakan kernel Linux juga. Perlu di catat bahwa membuat sistem operasi android hanya bisa dilakukan di sistem operasi Linux, tidak mungkin di lakukan di sistem operasi Windows.

Pengembangan Android Android dikembangkan secara private oleh Google sampai perubahan terbaru dan update siap untuk dirilis, pada saat itu source code dibuka untuk umum. Source code ini hanya akan berjalan tanpa modifikasi pada perangkat tertentu, biasanya perangkat seri Nexus. Source code, pada gilirannya, diadaptasi oleh Original Equipment Manufacturer (OEM) untuk dijalankan pada hardware mereka. Source code Android ini tidak mengandung driver perangkat yang sering kali proprietary yang dibutuhkan untuk komponen hardware tertentu.

Linux kernel Kernel android didasarkan pada salah satu cabang Linux kernel Long Term Support (LTS). Sejak April 2014, perangkat Android terutama menggunakan versi 3.4, 3.10 atau 3.18 dari kernel Linux. Versi kernel tertentu tergantung pada perangkat Android yang sebenarnya dan platform perangkat keras; Android telah menggunakan berbagai versi kernel sejak versi 2.6.25 yang digunakan dalam Android 1.0.

Varian Android dari kernel Linux memiliki perubahan arsitektur yang diimplementasikan oleh Google di luar siklus pengembangan kernel Linux yang biasa, seperti masuknya komponen seperti Binder, ashmem, pmem, logger, wakelocks, dan penanganan out-of-memori (OOM) yang berbeda. Fitur tertentu yang di kontribusikan kembali oleh Google ke kernel Linux, terutama fitur manajemen daya yang disebut "wakelocks", ditolak oleh pengembang kernel utama sebagian karena mereka merasa bahwa Google tidak menunjukkan niat untuk menjaga kode sendiri. Google mengumumkan pada bulan April 2010 bahwa mereka akan menyewa dua karyawan untuk bekerja dengan komunitas kernel Linux, tapi Greg Kroah-Hartman, saat ini pengelola kernel Linux untuk cabang stabil, mengatakan pada Desember 2010 bahwa ia khawatir bahwa Google tidak lagi berusaha untuk mendapatkan perubahan kode mereka termasuk dalam arus utama Linux. Beberapa pengembang Google Android mengisyaratkan bahwa "tim Android semakin muak dengan proses," karena mereka adalah tim kecil dan memiliki pekerjaan yang lebih mendesak untuk dilakukan pada Android.

Pada bulan Agustus 2011, Linus Torvalds mengatakan bahwa "Pada akhirnya Android dan Linux akan kembali ke kernel yang sama, tapi mungkin tidak akan dalam empat sampai lima tahun". Pada Desember 2011, Greg Kroah-Hartman mengumumkan dimulainya Android Mainlining Project, yang bertujuan untuk menempatkan beberapa driver Android, patch dan fitur kembali ke kernel Linux, mulai di Linux 3.3. Linux termasuk kemampuan autosleep dan wakelocks di 3,5 kernel, setelah banyak usaha sebelumnya di merger. Interface yang sama tetapi implementasi upstream Linux memungkinkan untuk dua suspend mode yang berbeda: ke memori (suspend tradisional yang Android gunakan), dan ke disk (hibernasi, seperti yang dikenal di desktop). Google mempertahankan repositori kode publik yang berisi karya eksperimental mereka untuk kembali basis Android dari versi Linux terbaru yang stabil.

Penyimpanan flash pada perangkat Android dibagi menjadi beberapa partisi, seperti / sistem untuk sistem operasi itu sendiri, dan /data untuk data pengguna dan instalasi aplikasi. Berbeda dengan distribusi Linux desktop, pemilik perangkat Android tidak diberikan akses root ke sistem operasi dan partisi sensitif seperti /sistem hanya read-only. Namun, akses root dapat diperoleh dengan memanfaatkan kelemahan keamanan di Android, yang sering digunakan oleh komunitas open source untuk meningkatkan kemampuan perangkat mereka, tetapi juga oleh pihak yang jahat untuk menginstal virus dan malware.

Android adalah distribusi Linux menurut , kepala open-source Google Chris DiBona, dan beberapa wartawan. Lainnya, seperti Google engineer Patrick Brady, mengatakan bahwa Android bukan Linux dalam arti distribusi Linux Unix-like tradisional; Android tidak memasukan C Library GNU (menggunakan Bionic sebagai alternatif C library) dan beberapa komponen lain yang biasanya ditemukan dalam distribusi Linux.

Software stack

Gambar 1: Diagram Arsitektur Android (dari Wikipedia karya Smieh)

Di atas kernel Linux, ada middleware, library dan API yang ditulis dalam C, dan perangkat lunak aplikasi yang berjalan pada kerangka aplikasi yang meliputi library yang compatible dengan Java. Perkembangan kernel Linux berjalan terus secara independent dari source code berbasis Android.

Sampai versi 5.0, Android digunakan Dalvik sebagai proses mesin virtual dengan kompilasi trace- based just-in-time (JIT) untuk menjalankan Dalvik "dex-code" (Dalvik Executable), yang biasanya diterjemahkan dari bytecode Java. Mengikuti prinsip JIT berbasis jejak, selain menafsirkan mayoritas kode aplikasi, Dalvik melakukan kompilasi dan eksekusi asli pilih segmen kode yang sering dieksekusi ("traces") setiap kali aplikasi diluncurkan. Android 4.4 diperkenalkan Android Runtime (ART) sebagai lingkungan runtime baru, yang menggunakan kompilasi ahead-of-time (AOT) untuk sepenuhnya mengkompilasi bytecode aplikasi ke dalam kode mesin pada instalasi aplikasi. Di Android 4.4, ART adalah fitur eksperimental dan tidak diaktifkan secara default; itu menjadi satu-satunya pilihan runtime dalam versi utama berikutnya dari Android, 5.0.

Untuk Java library, Android platform menggunakan subset dari Apache proyek Harmony sekarang telah dihentikan. Pada bulan Desember 2015, Google mengumumkan bahwa versi berikutnya dari Android akan beralih ke implementasi Java berdasarkan OpenJDK.

Standar C library Android, Bionic, dikembangkan oleh Google khusus untuk Android, sebagai derivasi dari standar code library BSD C. Bionic sendiri telah dirancang dengan beberapa fitur utama khusus untuk kernel Linux. Manfaat utama menggunakan Bionic bukan C Library GNU (glibc) atau uClibc adalah runtime footprint yang lebih kecil, serta optimasi untuk CPU frekuensi rendah. Pada saat yang sama, Bionic dilisensikan di bawah persyaratan lisensi BSD, yang menemukan Google lebih cocok untuk model lisensi Android secara keseluruhan.

Di tujukan untuk model lisensi yang berbeda, menjelang akhir 2012, Google mengalihkan stack Bluetooth di Android dari BlueZ GPL-lisensi ke Apache-lisensi BlueDroid.

Android tidak memiliki X Window System native secara default, juga tidak mendukung set lengkap GNU library standar. Hal ini membuat sulit untuk port aplikasi Linux atau perpustakaan untuk Android yang ada, sampai versi r5 dari Android native Development Kit mendukung untuk aplikasi yang ditulis sepenuhnya dalam C atau C ++. Perpustakaan yang ditulis dalam C juga dapat digunakan dalam aplikasi dengan suntikan dari shim kecil dan penggunaan dari JNI.

Sejak Marshmallow, "Toybox", koleksi utilitas command line (sebagian besar untuk digunakan oleh aplikasi, karena Android tidak menyediakan antarmuka command line secara default), diganti sama koleksi "Toolbox".

Android memiliki sistem operasi lain, Trusty OS, di dalamnya, sebagai bagian dari "Trusty" "komponen perangkat lunak pendukung Trusted Execution Environment (TEE) pada perangkat mobile." "Trusty dan API Trusty dapat berubah. Aplikasi untuk OS Trusty dapat ditulis dalam C / C ++ (dukungan C ++ lebih terbatas), dan mereka memiliki akses ke library C yang kecil Semua aplikasi Trusty adalah single-threaded; Multithreading di userspace Trustly saat ini tidak didukung. Pengembangan aplikasi pihak ketiga tidak didukung dalam versi saat ini, dan perangkat lunak yang berjalan pada OS dan prosesor untuk itu, menjalankan DRM framework untuk konten yang dilindungi. Ada banyak kegunaan lain untuk TEE seperti pembayaran mobile, secure banking, enkripsi full-disk, multi-factor authentication, perlindungan reset pada perangkat, replay-protected untuk penyimpanan persisten, display nirkabel ("cast") dari konten yang dilindungi, secure PIN dan pengolahan sidik jari, dan bahkan malware deteksi.

Komunitas Open-Source Android memiliki komunitas yang aktif dari pengembang dan penggemar yang menggunakan source code Android Open Source Project (AOSP) untuk mengembangkan dan mendistribusikan versi modifikasi sendiri dari sistem operasi. Rilis yang di kembangkan masyarakat ini sering membawa fitur baru dan update untuk perangkat lebih cepat daripada melalui saluran produsen / pembawa resmi, dengan tingkat kualitas yang sebanding; memberikan dukungan untuk perangkat yang lebih tua yang tidak lagi menerima update resmi; atau membawa Android ke perangkat yang dirilis resminya menjalankan sistem operasi lain, seperti HP TouchPad. Rilis masyarakat sering datang pre-rooted dan mengandung modifikasi yang tidak disediakan oleh vendor asli, seperti kemampuan untuk overclock atau lebih / undervolt prosesor perangkat. CyanogenMod adalah firmware masyarakat yang paling banyak digunakan, dan bertindak sebagai dasar untuk banyak orang. Android-x86 adalah versi Android untuk IBM PC yang kompatibel. Juga ada upaya dengan berbagai tingkat keberhasilan ke port Android ke iPhone, terutama Proyek iDroid.

Secara historis, produsen perangkat dan operator seluler biasanya tidak mendukung pengembangkan firmware pihak ketiga. Produsen mengungkapkan keprihatinan tentang fungsi yang tidak tepat dari perangkat yang menjalankan perangkat lunak tidak resmi dan biaya dukungan yang harus di keluarkan. Selain itu, Firmwares dimodifikasi seperti CyanogenMod kadang-kadang menawarkan fitur, seperti , yang operator lain akan dikenakan biaya premi. Akibatnya, kendala teknis termasuk bootloader terkunci dan akses terbatas ke akses root menjadi umum di banyak perangkat. Namun, karena perangkat lunak yang dikembangkan komunitas telah tumbuh lebih populer, dan menyusul pernyataan oleh Pustakawan Kongres di Amerika Serikat yang memungkinkan "jailbreaking" dari perangkat mobile, produsen dan operator telah melunakan posisi mereka mengenai pengembangan pihak ketiga, dengan beberapa, termasuk HTC, Motorola, Samsung dan Sony, memberikan dukungan dan mendorong pengembangan. Sebagai hasil dari ini, dari waktu ke waktu kebutuhan untuk menghindari pembatasan hardware untuk menginstal firmware resmi telah berkurang sebagai peningkatan jumlah perangkat yang dikirimkan dengan unlocked atau unlockable bootloader, mirip dengan Nexus seri ponsel, walaupun biasanya mengharuskan pengguna meninggalkan garansi perangkat jika melakukan hal tersebut. Namun, walaupaun produsen telah menerima, beberapa operator di AS masih mengharuskan ponsel dikunci, ini membuat frustrasi pengembang dan pelanggan.

Beberapa Distribusi Android Sebetulnya ada lumayan banyak distribusi sistem operasi android. Yang resmi dari Google adalah,

• AOSP – Android Open Source Project https://source.android.com/

Beberapa distribusi lain, yang non-Google ada banyak sekali, beberapa diantaranya adalah,

• AOKP - Android Open Kang Project http://aokp.co/source/ • - http://lineageos.org/ • PAC-ROM - http://www.pac-rom.com/#Home • Paranoid Android - http://paranoidandroid.co/ • SlimROMs - http://www.slimroms.net/

Untuk lebih jelasnya bisa di baca2 di https://www.androidpit.com/best-custom-roms-for-android dan https://forum.xda-developers.com/android/general/custom-rom-comparison-database- t3031005#post58850951

Selanjutnya mari kita membahas bagaimana cara membuat ROM android sendiri menggunakan source code yang disediakan oleh Google tepatnya Android Open Source Project (AOSP). Secara default memang kebanyakan yang pasti bisa di compile adalah untuk smartphone Nexus yang di keluarkan oleh Google. Akan tetapi beberapa Vendor seperti LG, Samsung membuka source code Android-nya dan bisa di ambil secara bebas via Internet, misalnya melalui, • http://opensource.lge.com/index • http://opensource.samsung.com/reception.do

Biasanya yang tidak terlalu rewel adalah smartphone dengan processor qualcomm. Smartphone murah kebanyakan menggunakan processor MediaTek (MTK) dari cina, ini biasanya susah memperoleh driver proprietary-nya. Akibatnya kita akan kesulitan untuk mengcompile sistem operasi Android untuk smartphone MTK. Sayang smartphone qualcomm biasanya mahal, yah mungkin kita bisa tertolong dengan beli second smartphone tersebut, terutama Nexus.

Bagi anda yang ingin memonitoring pergerakan mereka yang “ngoprek” sistem operasi android atau ROM android, dapat di baca2 di situs XDA developers http://fourm.xda-developers.com

Persiapan Membuat ROM Sebelum kita mendownload dan membuat Android dari source code, pastikan bahwa system yang kita gunakan memenuhi persyaratan berikut.

Kebutuhan Hardware Komputer yang kita gunakan minimal harus memenuhi persyaratan berikut,

• Untuk Gingerbread (2.3.x) ke atas, kita membutuhkan sistem 64 bit. • Paling tidak 100 Gbyte untuk checkout, 150 GB untuk sebuah build, 200GB atau lebih untuk banyak build. Jika kita menggunakan ccache, maka kita akan membutuhkan space yang lebih banyak lagi.

Jika kita menjalankan Linux di mesin virtual, kita akan membutuhkan paling tidak 16 GB RAM / swap. Sekedar catatan, penulis memperoleh error “Out of Memory” dan gagal mengcompile Android versi terbaru 7.1.1 di mesin dengan RAM 2GB swap 16GB.

Kebutuhan Software Master branch dari Android Open Source Project (AOSP) biasanya di developed dan di test pada release Ubuntu Long Term Support (LTS). Berikut adalah daftar sistem operasi yang digunakan untuk build AOSP.

Sistem Operasi Android biasanya di built dengan sistem operasi GNU/Linux atau Mac OS.

GNU/Linux

• Android 6.0 (Marshmallow) - AOSP master: Ubuntu 14.04 (Trusty) • Android 2.3.x (Gingerbread) - Android 5.x (Lollipop): Ubuntu 12.04 (Precise) • Android 1.5 (Cupcake) - Android 2.2.x (Froyo): Ubuntu 10.04 (Lucid)

Mac OS (Intel/x86)

• Android 6.0 (Marshmallow) - AOSP master: Mac OS v10.10 (Yosemite) atau yang lebih baru dengan Xcode 4.5.2 dan Command Line Tools • Android 5.x (Lollipop): Mac OS v10.8 (Mountain Lion) dengan Xcode 4.5.2 dan Command Line Tools • Android 4.1.x-4.3.x (Jelly Bean) - Android 4.4.x (KitKat): Mac OS v10.6 (Snow Leopard) atau Mac OS X v10.7 (Lion) dan Xcode 4.2 (Apple's Developer Tools) • Android 1.5 (Cupcake) - Android 4.0.x (Ice Cream Sandwich): Mac OS v10.5 (Leopard) atau Mac OS X v10.6 (Snow Leopard) dan the Mac OS X v10.5 SDK

Java Development Kit (JDK) • master branch dari Android di AOSP: Ubuntu - OpenJDK 8, Mac OS - jdk 8u45 atau yang lebih baru. • Android 5.x (Lollipop) - Android 6.0 (Marshmallow): Ubuntu - OpenJDK 7, Mac OS - jdk- 7u71-macosx-x64.dmg • Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat): Ubuntu - Java JDK 6, Mac OS - Java JDK 6 • Android 1.5 (Cupcake) - Android 2.2.x (Froyo): Ubuntu - Java JDK 5

Paket program yang penting • Python 2.6 -- 2.7 dari python.org • GNU Make 3.81 -- 3.82 dari gnu.org; Android 3.2.x (Honeycomb) dan yang lebih lama perlu mundur dari make 3.82 untuk mengatasi error saat build. Pada Ubuntu >16.04 akan di instalasi make 4.1. • Git 1.7 atau yang lebih baru dari git-scm.com.

Binary untuk Nexus & Pixel. Untuk mereka yang menggunakan Nexus & Pixel dapat mendownload preview, factory image, drivers, dan update over-the-air (OTA).

• https://developers.google.com/android/blobs-preview - Preview binaries (blobs) – untuk AOSP master branch development • https://developers.google.com/android/nexus/images - Factory image – untuk supported device yang menjalankan AOSP release branch. • https://developers.google.com/android/nexus/drivers - Binary hardware support file – untuk device yang menjalankan AOSP release branch. • https://developers.google.com/android/nexus/ota - OTA image – untuk update secara manual Nexus device over the air (OTA).

Membangun Build Environment Bagian ini menjelaskan cara mengatur local work environment untuk membangun source code Android. Hidup kita akan lebih mudah jika menggunakan Linux atau Mac OS. Proses code-review & code-update dari Android Open Source Project (AOSP) menggunakan tool berbasis web yang di kenal dengan Gerrit.

Memilih Branch Beberapa persyaratan untuk membangun build environment ditentukan oleh versi source code yang di rencanakan untuk di-kompilasi. Lihat Build Number untuk daftar lengkap dari branch yang dapat kita pilih. Anda juga dapat memilih untuk men-download dan membangun source code terbaru (disebut master), dalam hal ini Anda hanya akan menghilangkan spesifikasi branch ketika Anda menginisialisasi repositori.

Setup Linux build environment Instruksi di bawah ini berlaku untuk semua brach, termasuk master. Android build secara rutin di test di Google menggunakan versi terbaru dari Ubuntu LTS, tetapi distribusi lain harusnya memiliki build tools yang di butuhkan. Untuk Gingerbread (2.3.x) dan versi yang lebih baru, termasuk master branch, membutuhkan lingkungan 64 bit. Versi yang lebih tua dapat di compile menggunakan sistem 32 bit.

Install JDK Master brach dari Android di Android Open Source Project (AOSP) membutuhkan Java 8. Di Ubuntu, menggunakan OpenJDK. Jalankan perintah berikut,

$ sudo apt­get update $ sudo apt­get install openjdk­8­jdk

Versi java terbaru di Ubuntu 16.04 adalah 8u77. Jika anda harus menggunakan OpenJDK 7 dst, dapat menggunakan perintah,

$ sudo add­apt­repository ppa:openjdk­r/ppa $ sudo apt­get update $ sudo apt­get install openjdk­7­jdk

Untuk mengcompile android versi < 4.3.1 mau tidak mau harus mundur ke Sun/Oracle JDK 1.6. Jika kita ingin mengcompile android < 4.3.1, kita perlu menginstalasi sun/oracle JDK 1.6, caranya:

sudo add­apt­repository ppa:webupd8team/java sudo apt update sudo apt install oracle­java6­installer sudo apt install oracle­java6­set­default javac ­version

java version "1.6.0_45" Java(TM) SE Runtime Environment (build 1.6.0_45­b06) Java HotSpot(TM) 64­Bit Server VM (build 20.45­b01, mixed mode)

Versi JDK yang mungkin cocok untuk android < 4.3.1 adalah 6u45. Untuk memilih versi default yang digunakan dapat menggunakan perintah,

sudo update­alternatives ­­config java

Install paket yang dibutuhkan Kita membutuhkan Ubuntu 64 bit. Minimal Ubuntu 14.04 yang di rekomendasikan.

$ sudo apt­get install git­core gnupg flex bison gperf build­essential \ zip curl zlib1g­dev gcc­multilib g++­multilib libc6­dev­i386 \ lib32ncurses5­dev x11proto­core­dev libx11­dev lib32z­dev ccache \ libgl1­mesa­dev libxml2­utils xsltproc unzip python­lunch \ libswitch­perl

Bagi anda yang menggunakan Ubuntu 16.04 maka kemungkinan akan di instalasi make 4.1. Ini bisa di cek menggunakan perintah make ­­version

GNU Make 4.1 Built for x86_64­pc­linux­gnu Copyright (C) 1988­2014 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

Ini akan menjadi masalah jika ingin meng-compile android versi <4.3.1. Kita harus menggunakan make 3.81 dan meng-compile secara manual, caranya,

• Download source make 3.81 dari http://ftp.gnu.org/gnu/make/ dan lakukan

cd /usr/local/src/ wget http://ftp.gnu.org/gnu/make/make­3.81.tar.gz tar zxvf make­3.81.tar.gz cd /usr/local/src/make­3.81 ./configure make make install

• Timpa make 4.1 agar menjadi make 3.81

cd /usr/bin cp make make­4.1 cp /usr/local/src/make­3.81/make /usr/bin hash ­r make make –version

GNU Make 3.81 Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

This program built for x86_64­unknown­linux­gnu

• Untuk mengembalikan

sudo make uninstall cd /usr/bin cp make­4.1 make hash ­r make make ­­version

Mengkonfigurasi Akses pada USB Di bawah sistem GNU / Linux (dan khususnya di Ubuntu), pengguna biasa tidak dapat langsung mengakses perangkat USB secara default. Sistem perlu dikonfigurasi untuk mengizinkan akses tersebut. Cara yang di rekomendasikan, sebagai root, membuat file

/etc/udev/rules.d/51­android.rules Cara yang perlu dilakukan, termasuk memodifikasi file tersebut agar memasukan username anda, adalah sebagai berikut,

$ wget ­S ­O ­ http://source.android.com/source/51­android.rules | sed "s//$USER/" | sudo tee >/dev/null /etc/udev/rules.d/51­ android.rules; sudo udevadm control ­­reload­rules

Rules yang baru ini akan berfungsi jika sesuatu saat nanti device di colok. Oleh karena-nya sebaiknya unplug semua device android yang ada, dan colok kembali ke komputer setelah rules ini di buat.

Penggunaan Directory terpisah untuk output Secara default, output dari setiap build disimpan di out/ subdirektori dari source tree yang cocok.

Pada beberapa mesin dengan beberapa perangkat penyimpanan, build lebih cepat ketika menyimpan file dource dan output pada volume yang terpisah. Untuk menambah kinerja, output dapat disimpan pada filesystem dioptimalkan untuk kecepatan bukannya ketahanan crash, karena semua file dapat dibuat kembali jika ada filesystem yang corrupt.

Untuk menset ini, export variable OUT_DIR_COMMON_BASE ke titik / path dimana kita directory output ingin di simpan

$ export OUT_DIR_COMMON_BASE=

Direktori output untuk setiap source tree dipisah akan diberi nama setelah direktori holding / awal dari source tree. Contoh, jika kita mempunyai source tree sebagai /source/master1 dan /source/master2 dan OUT_DIR_COMMON_BASE di set ke /output, maka output directory-nya akan /output/master1 dan /output/master2.

Oleh karenanya sangat penting untuk tidak mempunyai beberapa source tree yang di simpan pada directory yang mempunyai nama yang sama, karena akan terjadi sharing output directory, yang mengakibatkan hasil yang tidak bisa di prediksi.

Hal ini hanya di dukung pada Jelly Bean (4.1) atau yang lebih baru, termasuk master branch.

Download Source Code Android Source Android terletak di repositori Git yang di host oleh Google. Dalam Git repositori termasuk metadata untuk source Android, termasuk yang terkait dengan perubahan source dan tanggal mereka dibuat. Bagian ini menjelaskan cara men-download source untuk code-line Android tertentu.

Installing Repo Repo adalah tool yang dibuat agar lebih mudah untuk bekerja dengan Git dalam konteks Android. Untuk menginstalasi repo, pastikan ada directory bin/ di home directory anda dan masuk dalam path,

$ mkdir ~/bin $ PATH=~/bin:$PATH

Download tool repo dan pastikan bisa di run, $ curl https://storage.googleapis.com/git­repo­downloads/repo > ~/bin/repo $ chmod a+x ~/bin/repo

Inisialisasi Repo Client Setelah menginstalasi repo, setup client anda untuk mengakses Android source directory, caranya,

• Buat sebuah directory kosong untuk menyimpan file android anda, misalnya,

$ mkdir WORKING_DIRECTORY $ cd WORKING_DIRECTORY atau $ mkdir android­source $ cd android­source

• Mengkonfigurasi git dengan nama asli dan alamat email. Untuk menggunakan Gerrit code- review tool, kita akan memerlukan sebuah alamat email yang terhubung dengan akun Google yang terdaftar. Pastikan ini adalah alamat hidup di mana kita dapat menerima pesan. Nama yang kita berikan di sini akan muncul di atribusi untuk pengajuan kode Anda.

$ git config ­­global user.name "Your Name" $ git config ­­global user.email "[email protected]"

• Jalankan repo init untuk mengambil versi terbaru dari repo dengan semua perbaikan bug yang terbaru. Anda harus menentukan URL untuk manifest, yang menentukan di mana berbagai repositori termasuk dalam source Android akan ditempatkan di dalam direktori kerja Anda.

$ repo init ­u https://android.googlesource.com/platform/manifest

Perintah di atas akan menginisialisasi source code untuk mengambil versi terbaru. Untuk memeriksa cabang selain "master", tentukan dengan -b.

$ repo init ­u https://android.googlesource.com/platform/manifest ­b android­4.3.1_r1 atau $ repo init ­u https://android.googlesource.com/platform/manifest ­b android­5.1.1_r38

Untuk daftar lengkap branch, dapat dilihat Source Code Tag and Build pada URL http://source.android.com/source/build-numbers.html#source-code-tags-and-builds. Beberapa Code Tag yang penting, antara lain adalah,

Code Tag Version android-7.1.1_r13 Nougat android-6.0.1_r77 Marshmallow android-5.1.1_r38 Lollipop android-4.4.4_r2 KitKat android-4.3.1_r1 Jelly Bean android-4.0.4_r2.1 Ice Cream Sandwich android-2.3.7_r1 Gingerbread android-2.2.3_r2 Froyo

Sebuah inisialisasi berhasil akan berakhir dengan pesan yang menyatakan bahwa Repo diinisialisasi di direktori kerja Anda. direktori klien Anda sekarang harus berisi direktori .repo dimana file seperti manifes akan disimpan.

Download Android Source Tree Untuk mengambil source Android ke direktori kerja Anda dari repositori sebagaimana ditentukan dalam manifes default, jalankan

$ repo sync

Source code Android akan berlokasi di direktori kerja Anda dengan nama proyek mereka. Operasi sinkronisasi awal akan memakan waktu satu jam atau lebih untuk bisa selesai. Sementara mendownload source code android menggunakan repo sync akan memakan waktu lama amat sangat lama sekali, penulis dengan menggunakan indihome kadang-kadang harus menunggu 1-2 hari untuk menyelesaikan download source code android.

Cara yang paling sederhana agar dapat menghemat waktu yang dibutuhkan adalah mengcopykan source code repository yang sudah ada sebelum mendownload source code yang lebih baru.

Misalkan, kita sudah men-download source code lama (contoh, android-2.2_r1.1), kita dapat mengcopykan ke folder source code yang baru, sehingga kita cukup mendownload hanya perbedaannnya saja, contoh,

$ mkdir android­2.3 $ cd android­2.3/ $ repo init ­u git://android.git.kernel.org/platform/manifest.git ­b android­2.3.4_r1 $ cp ­R ../android­2.2_r1.1/.repo/projects .repo/ $ repo sync

Jika kita boleh / bisa menimpa directory yang lama, maka dapat juga melakukan perintah berikut,

$ mv android­2.2_r1.1 android­2.3 $ cd android­2.3 $ repo init ­b android­2.3.4_r1 $ repo sync

Repo dapat dijalankan secara paralel, seperti perintah “make” menggunakan opsi “-j”. Pada dasarnya repo mempunyai opsi tersebut,

$ repo sync ­h Usage: repo sync [...]

Options: ­h, ­­help show this help message and exit ­f, ­­force­broken continue sync even if a project fails to sync ­l, ­­local­only only update working tree, don't fetch ­n, ­­network­only fetch only, don't update working tree ­d, ­­detach detach projects back to manifest revision ­q, ­­quiet be more quiet ­j JOBS, ­­jobs=JOBS number of projects to fetch simultaneously ­s, ­­smart­sync smart sync using manifest from a known good build repo Version options: ­­no­repo­verify do not verify repo source code

Jika anda ingin menjalankan 4 job sekaligus, hati-hati ini akan banyak memakan bandwidth, dapat menggunakan perintah,

$ repo sync ­j4

Untuk lebih lanjut tentang repo sync dan perintah Repo lainnya, lihat bagian Mengembangkan. menggunakan Otentikasi.

Penggunaan Authentication Secara default, akses ke source code Android source code adalah anonymous. Untuk memproteksi server dari penggunaan yang berlebihan, setiap IP address di beri quota. Jika

Jika sharing sebuah IP address dengan user lain, misalnya, di kampus di belakang NAT firewall, mekanisme quota akan bereaksi karena banyak client baru melakukan sync dari IP address yang sama dalam waktu yang pendek. Untuk hal seperti ini sangat di mungkinkan untuk menggunakan akses authenticated, yang kemudian akan membuat quota yang berbeda untuk setiap user, apapun IP address yang digunakan.

Langkah pertama, membuat password dengan password generator dan ikuti instruksi di password generator page.

Langkah ke dua, paksakan untuk access authentication dengan menggunakan URL berikut URI: https://android.googlesource.com/a/platform/manifest. Perhatikan bahwa prefix directory /a/ akan mentrigger kewajiban untuk authentikasi. Kita dapat mengkonversikan client yang ada untuk menggunakan mandatory authentication dengan perintah berikut,

$ repo init ­u https://android.googlesource.com/a/platform/manifest

Troubleshooting masalah jaringan Saat mendownload dari belakang proxy, sangat perlu untuk secara explisit men-spesify proxy yang digunakan oleh repo,

$ export HTTP_PROXY=http://:@: $ export HTTPS_PROXY=http://:@:

Ini sangat jarang terjadi, beberapa Linux client merasakan masalah sambungan, seperti berhenti saat di tengah-tengah download (biasanya saat "Receiving objects"). Di laporkan bahwa mengubah settingan TCP/IP stack dan menggunakan perintah non-paralel dapat memperbaiki situasi. Anda perlu akses root untuk memodifikasi TCP setting:

$ sudo sysctl ­w net.ipv4.tcp_window_scaling=0 $ repo sync ­j1

Menggunakan mirror local Jika kita melakukan download untuk beberapa client, terutama saat langka bandwidth, akan lebih baik untuk membuat mirror local dari seluruh content di server, dan sync client dari mirror tersebut yang tidak perlu akses Internet. Mendownload full mirror jauh lebih kecil dari daripada download dua buah client, padahal berisi informasi yang lebih banyak.

Misalkan mirror yang akan kita buat berada di /usr/local/aosp/mirror. Langkah pertama adalah membuat dan sync mirror itu sendiri. Perhatikan flag --mirror , yang dapat di spesifikasi hanya saat membuat client baru,

$ mkdir ­p /usr/local/aosp/mirror $ cd /usr/local/aosp/mirror $ repo init ­u https://android.googlesource.com/mirror/manifest ­­mirror $ repo sync

Saat mirror sudah sync, client baru dapat dibuat dari mirror tersebut. Perhatikan, sangat penting untuk menggunakan absolute path:

$ mkdir ­p /usr/local/aosp/master $ cd /usr/local/aosp/master $ repo init ­u /usr/local/aosp/mirror/platform/manifest.git $ repo sync

Akhirnya, untuk mensync client terhadap server, mirror perlu sync ke server, dan client sync ke mirror,

$ cd /usr/local/aosp/mirror $ repo sync $ cd /usr/local/aosp/master $ repo sync

Sangat mungkin untuk menyimpan mirror di server LAN dan akses menggunakan NFS, SSH atau Git. Juga sangat mungkin untuk menyimpannya di usb harddisk dan mengcopykan usb harddisk tersebut antar user atau antar mesin.

Verifying Git Tags Load public key berikut ke database GnuPG key yang kita miliki. Key ini digunakan untuk menanda tangani tag yang merepresentasikan release.

$ gpg –import

Copy dan paste key berikut, dan ketik EOF (Ctrl-D) untuk mengakhiri input dan proses dari key.

­­­­­BEGIN PGP PUBLIC KEY BLOCK­­­­­ Version: GnuPG v1.4.2.2 (GNU/Linux)

mQGiBEnnWD4RBACt9/h4v9xnnGDou13y3dvOx6/t43LPPIxeJ8eX9WB+8LLuROSV lFhpHawsVAcFlmi7f7jdSRF+OvtZL9ShPKdLfwBJMNkU66/TZmPewS4m782ndtw7 8tR1cXb197Ob8kOfQB3A9yk2XZ4ei4ZC3i6wVdqHLRxABdncwu5hOF9KXwCgkxMD u4PVgChaAJzTYJ1EG+UYBIUEAJmfearb0qRAN7dEoff0FeXsEaUA6U90sEoVks0Z wNj96SA8BL+a1OoEUUfpMhiHyLuQSftxisJxTh+2QclzDviDyaTrkANjdYY7p2cq /HMdOY7LJlHaqtXmZxXjjtw5Uc2QG8UY8aziU3IE9nTjSwCXeJnuyvoizl9/I1S5 jU5SA/9WwIps4SC84ielIXiGWEqq6i6/sk4I9q1YemZF2XVVKnmI1F4iCMtNKsR4 MGSa1gA8s4iQbsKNWPgp7M3a51JCVCu6l/8zTpA+uUGapw4tWCp4o0dpIvDPBEa9 b/aF/ygcR8mh5hgUfpF9IpXdknOsbKCvM9lSSfRciETykZc4wrRCVGhlIEFuZHJv aWQgT3BlbiBTb3VyY2UgUHJvamVjdCA8aW5pdGlhbC1jb250cmlidXRpb25AYW5k cm9pZC5jb20+iGAEExECACAFAknnWD4CGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIX gAAKCRDorT+BmrEOeNr+AJ42Xy6tEW7r3KzrJxnRX8mij9z8tgCdFfQYiHpYngkI 2t09Ed+9Bm4gmEO5Ag0ESedYRBAIAKVW1JcMBWvV/0Bo9WiByJ9WJ5swMN36/vAl QN4mWRhfzDOk/Rosdb0csAO/l8Kz0gKQPOfObtyYjvI8JMC3rmi+LIvSUT9806Up hisyEmmHv6U8gUb/xHLIanXGxwhYzjgeuAXVCsv+EvoPIHbY4L/KvP5x+oCJIDbk C2b1TvVk9PryzmE4BPIQL/NtgR1oLWm/uWR9zRUFtBnE411aMAN3qnAHBBMZzKMX LWBGWE0znfRrnczI5p49i2YZJAjyX1P2WzmScK49CV82dzLo71MnrF6fj+Udtb5+ OgTg7Cow+8PRaTkJEW5Y2JIZpnRUq0CYxAmHYX79EMKHDSThf/8AAwUIAJPWsB/M pK+KMs/s3r6nJrnYLTfdZhtmQXimpoDMJg1zxmL8UfNUKiQZ6esoAWtDgpqt7Y7s KZ8laHRARonte394hidZzM5nb6hQvpPjt2OlPRsyqVxw4c/KsjADtAuKW9/d8phb N8bTyOJo856qg4oOEzKG9eeF7oaZTYBy33BTL0408sEBxiMior6b8LrZrAhkqDjA vUXRwm/fFKgpsOysxC6xi553CxBUCH2omNV6Ka1LNMwzSp9ILz8jEGqmUtkBszwo G1S8fXgE0Lq3cdDM/GJ4QXP/p6LiwNF99faDMTV3+2SAOGvytOX6KjKVzKOSsfJQ hN0DlsIw8hqJc0WISQQYEQIACQUCSedYRAIbDAAKCRDorT+BmrEOeCUOAJ9qmR0l EXzeoxcdoafxqf6gZlJZlACgkWF7wi2YLW3Oa+jv2QSTlrx4KLM= =Wi5D ­­­­­END PGP PUBLIC KEY BLOCK­­­­­

Setelah mengimport key di atas, kita dapat memverifikasi semua tag dengan

$ git tag ­v TAG_NAME

Jika kita belum men-setup ccache, sekarang adalah saat yang tepat.

Persiapan untuk Build Instruksi build berikut berlaku untuk Android source tree untuk semua branch, termasuk master. Langkah yang perlu dilakukan akan di jelaskan pada bagian ini.

Pada saat kita mem-build Android 6.0 atau yang lebih baru, sebetulnya kita akan meng-compile menggunakan Jack. Jack adalah toolchain Android yang baru yang akan meng-compile Java source menjadi Android dex bytecode. Jack menggantikan berbagai Android toolchain yang lama, yang biasanya terdiri dari beberapa tool, seperti, javac, ProGuard, jarjar, dan dx.

Jack toolchain memberikan keuntungan berikut:

• Sepenuhnya open source. • Tersedia di AOSP, semua mitra di persilahkan untuk berkontribusi mengembangkan. • Mempercepatan waktu kompilasi. Jack mempunyai dukungan yang spesifik untuk mengurangi waktu kompilasi: pre-dexing, kompilasi berjenjang dan Jack compilation server. Mendukung shrinking, obfuscation, repackaging dan multidex. Penggunaan paket terpisah seperti ProGuard tidak lagi di perlukan.

Jack mempunyai format sendiri .jack, yang berisi pre-compiled dex code untuk library, yang memungkinkan proses kompilasi yang lebih cepat (pre-dex).

Walaupun demikian, sebetulnya kita tidak perlu melakukan apapun yang berbeda dengan menggunakan Jack – kita cukup menjalakan perintah standard make untuk compile tree atau project anda.

Binary proprietary AOSP tidak dapat digunakan dari hanya murni source code aja, akan membutuhkan tambahan library hardware proprietary untuk bisa jalan, seperti, untuk hardware graphics accelerator. Untuk mereka yang menggunakan Nexus & Pixel dapat mendownload preview, factory image, drivers, dan update over-the-air (OTA).

• https://developers.google.com/android/blobs-preview - Preview binaries (blobs) – untuk AOSP master branch development • https://developers.google.com/android/nexus/images - Factory image – untuk supported device yang menjalankan AOSP release branch. • https://developers.google.com/android/nexus/drivers - Binary hardware support file – untuk device yang menjalankan AOSP release branch. • https://developers.google.com/android/nexus/ota - OTA image – untuk update secara manual Nexus device over the air (OTA).

Binary di atas memberikan akses tambahan ke hardware yang ada dengan non-open source code. Dari pada membuat AOSP master branch, gunakan Binaries Preview untuk Nexus Device. Jika mem-build master branch untuk sebuah device, gunakan binary untuk release number atau tanggal yang paling baru.

Ekstrak proprietary binary Setiap binary di bungkus dengan script yang akan mengekstrak diri sendiri dari arsip yang di kompres. Buka setiap arsip, jalankan script ektrak dari root source tree, kemudian konfirmasi bahwa kita setuju dengan license agreement. Binary dan makefile-nya akan di instalasi di directory vendor/ dari source tree.

Clean up Untuk memastikan bahwa binary yang baru benar-benar di handel dengan baik, men-delete output dari build sebelumnya menggunakan perintah,

$ make clobber

Set up environment Inisialisasi environment menggunakan script envsetup.sh . Perlu di catat bahwa perintah “source” dapat di ganti dengan . (sebuah dot) untuk menghemat beberapa karakter, dan bentuk pendek ini yang banyak digunakan di dokumentasi,

$ source build/envsetup.sh atau $ . build/envsetup.sh

Memilih target Memilih target untuk di build menggunakan lunch. Jika lunch belum di install ada baiknya di install menggunakan perintah,

$ sudo apt install python­lunch

Konfigurasi yang benar akan di kirim sebagai argumen. Contoh, perintah berikut,

$ lunch aosp_arm­eng perintah di atas akan mem-build secara lengkap untuk emulator android, dengan semua debugging di enable.

Jika di jalankan tanpa argument maka lunch akan menanyakan target mana yang akan dibuat.

Semua build target akan berbentuk BUILD-BUILDTYPE, dimana BUILD adalah codename yang mengacu pada kombinasi fitur tertentu.

BUILDTYPE adalah salah satu dari hal berikut,

Buildtype Use user akses terbatas; cocok untuk produksi userdebug seperti "user" tapi dengan akses root dan kemampun untuk debugging. Eng konfigurasi untuk development dengan debugging tools tambahan.

Build code Jika semua telah benar di konfigurasi dll. Maka kita dapat mem-build android. Build semuanya menggunakan make. GNU make dapat menangani berbagai tugas secara paralel menggunakan argumen -jN, dan adalah biasa untuk menggunakan jumlah tugas antara 1 dan 2 dari hardware thread di komputer yang digunakan untuk build. Contoh, sebuah mesin dual-E5520 (2 CPU, 4 core per CPU, 2 thread per core), maka untuk build yang cepat dapat menggunakan perintah antara make -j16 dan make -j32. Contoh perintah make,

$ make ­j4 atau yang lebih aman,

$ make ­j1

Jalankan! Sebaiknya ini dilakukan di sore atau siang hari, untuk di jalankan semalam suntuk. Jika berhasil dengan baik kira-kira keluarannya adalah, build/tools/generate­notice­files.py out/target/product/generic/obj/NOTICE.txt Combining NOTICE files into HTML Combining NOTICE files into text Installed file list: out/target/product/generic/installed­files.txt Target system fs image: out/target/product/generic/obj/PACKAGING/systemimage_ Running: mkyaffs2image ­f out/target/product/generic/system out/target/product Install system fs image: out/target/product/generic/system.img

Kita dapat menjalankan hasil build pada emulator atau flash pada perangkat. Harap dicatat bahwa jika kita telah memilih target build dengan lunch, maka tidak mungkin menjalankan pada target yang berbeda dengan target yang pernah di sebut.

Untuk Device Non-Nexus Beberapa manufakturer, seperti samsung, LG dll. membuka source code android atau proprietary binary (binary blobs) & meletakan di web. Jika kita berhasil memperoleh source code tambahan untuk device yang perlu dilakukan adalah unpack, make clobber dan build. Sebagai contoh, penulis akan memperlihatkan untuk LG Optimus G Pro codename F240K agar menjadi lollypop (android 5.0). • Download source code terakhir untuk f240k dari http://opensource.lge.com dan unzip, akan keluar dua file penting,

LGF240_L_V30c_Android.tar.gz LGF240_L_V30c_Kernel.tar.gz

• init source android

cd source­android repo init ­b android­5.1.1_r38

• copy source f240 ke source android dan untar

cp LGF240K_Gpro_L_V30d.zip ~/source­android cd ~/source­android unzip LGF240K_Gpro_L_V30d.zip tar zxvf LGF240_L_V30c_Android.tar.gz

• Bagian yang paling pusing adalah menggabungkan source code vendor agar masuk ke manifest AOSP sehingga bisa di panggil oleh lunch, jika ini bisa dilakukan langkah selanjutnya adalah meng-compile,

source build/envsetup.sh lunch 1 make ­j4

• Jika kita meng-compile source code android, kita harus menambahkan prebuilt source (toolchain) google yang original ke directory android. • Setelah setelah build, outout dapat di peroleh di out/target/product/generic

Kita perlu membuat kernel dapat menggunakan langkah berikut

• Copy dan untar source kernel f240k

cp LGF240K_Gpro_L_V30d.zip ~/source­android cd ~/source­android unzip LGF240K_Gpro_L_V30d.zip tar zxvf LGF240_L_V30c_Kernel.tar.gz cd ~/source­android

• Jika kita mengcompile source code kernel, kita harus menambahkan prebuilt source(toolchain) google ke directory android. Untuk build kernel f240k kita perlu menjalankan script berikut

cd ~/source­android/kernel/ make ARCH=arm CROSS_COMPILE=../prebuilts/gcc/linux­x86/arm/arm­eabi­ 4.8/bin/arm­eabi­ gkkt_bcm­perf_defconfig zImage ­j4

• Setelah build, zImage kernel ada di arch/arm/boot

Untuk build chromium34_lge (vendor\lge\external\chromium34_lge\src) bisa di baca di README.txt dalam folder tersebut. Flash dengan fastboot Untuk flash sebuah device, kita perlu menggunakan fastboot, yang biasanya akan masuk dalam path sesudah berhasil build.

Emulate an Android Device Sebuah emulator di tambahkan di path oleh proses build. Untuk menjalankan emulator, ketik,

$ emulator

Harap bersabar untuk menjalankan emulator karena butuh waktu untuk loading, booting dll. Tampilan emulator kira-kira seperti tampak pada gambar.

Gambar 2: Emulator Android di Komputer

Troubleshooting Build Errors yang Umum

Salah Versi Java Jika kita berusaha build sebuah versi Android dengan versi Java yang yang salah, akan gagal dengan message berikut,

************************************************************ You are attempting to build with the incorrect version of java. Your version is: WRONG_VERSION. The correct version is: RIGHT_VERSION.

Please follow the machine setup instructions at https://source.android.com/source/initializing.html ************************************************************

Ini mungkin disebabkan oleh:

• Kegagalan dalam menginstalasi JDK yang benar seperti di jelaskan pada bagian kebutuhan JDK. • JDK lain yang di instalasi sebelumnya ada dalam path. Masukan JDK yang benar di awal PATH dan buang JDK yang bermasalah.

Python Version 3 Repo dibuat berdasar fungsi tertentu dari Python 2.x dan sayangnya tidak sepenuhnya compatible dengan Python 3. Untuk menggunakan repo, sebaiknya install Python 2.x:

$ apt­get install python

Tidak ada ijin USB Pada kebanyakan Linux, user biasa tidak bisa mengakses port USB. Jika kita melihat “permission denied error”, ikuti instruksi di atas untuk menginisialisasi konfigurasi akses USB.

Jika adb sudah jalan dan tidak dapat tersambung ke device sesudah rule di setup, bisa di bunuh dengan perintah adb kill-server. Ini akan membuat adb untuk restart dengan konfigurasi yang baru.

Running Build Bagian ini akan menjelaskan lebih detail bagaimana cara running build pada device tertentu, dan di rancang untuk mengkomplemen informasi untuk system yang dibuat.

Building fastboot and adb Jika kita belum mempunyai fastboot dan adb, kita dapat membuatnya menggunakan build system yang ada. Gunakan instruksi untuk build android, dan ganti dengan perintah berikut,

$ make fastboot adb

Booting ke mode fastboot Saat cold boot dari sebuah device, gunakan kombinasi tombol berikut untuk masuk ke mode fastmode, mode dimana bootloader dapat digunakan untuk mem flash device,

Device Tombol hikey Sambung pin 1 - 2 & 5 - 6 dari J15 angler Tekan & Tahan Volume Down, kemudian tekan & tahan Power bullhead Tekan & Tahan Volume Down, kemudian tekan & tahan Power shamu Tekan & Tahan Volume Down, kemudian tekan & tahan Power fugu Tekan & Tahan Power volantis Tekan & Tahan Volume Down, kemudian tekan & tahan Power hammerhead Tekan & Tahan Volume Up & Volume Down, kemudian tekan & tahan Power flo Tekan & Tahan Volume Down, kemudian tekan & tahan Power deb Tekan & Tahan Volume Down, kemudian tekan & tahan Power manta Tekan & Tahan Volume Up & Volume Down, kemudian tekan & tahan Power mako Tekan & Tahan Volume Down, kemudian tekan & tahan Power grouper Tekan & Tahan Volume Down, kemudian tekan & tahan Power tilapia Tekan & Tahan Volume Down, kemudian tekan & tahan Power phantasm Nyalakan device, tutup dengan tangan sampai LED menjadi merah. maguro Tekan & Tahan Volume Up & Volume Down, kemudian tekan & tahan Power toro Tekan & Tahan Volume Up & Volume Down, kemudian tekan & tahan Power toroplus Tekan & Tahan Volume Up & Volume Down, kemudian tekan & tahan Power panda Tekan & Tahan Input, then press Power wingray Tekan & Tahan Volume Down, kemudian tekan & tahan Power crespo Tekan & Tahan Volume Up, kemudian tekan & tahan Power crespo4g Tekan & Tahan Volume Up, kemudian tekan & tahan Power

Kita juga dapat menggunakan perintah

adb reboot bootloader untuk reboot Android langsung ke bootloader tanpa perlu tekan kombinasi tombol.

Unlocking bootloader Sangat mungkin untuk flash sebuah sistem custom hanya jika bootloader mengijinkan, dan bootloader terkunci secara default. Anda dapat unlock bootloader, tetapi menyadari bahwa hal tersebut akan menghapus data pengguna karena alasan privasi (operasi unlock perlu dijalankan hanya sekali). Setelah terbuka, semua data pada perangkat terhapus, kedua aplikasi yaitu private data dan shared data yang dapat diakses melalui USB, termasuk foto dan film. Pastikan untuk membuat backup dari file berharga sebelum unlock bootloader.

Jika device berada di fastboot mode, unlock bootloader menggunakan:

$ fastboot oem unlock

Prosedur tersebut harus di confirm on-screen.

Di Nexus 10, setelah unlock bootloader, internal storage akan unformatted. Kita dapat memformat device menggunakan perintah:

$ fastboot format cache $ fastboot format userdata

Untuk re-lock bootloader, menggunakan:

$ fastboot oem lock

Catatan: Re-locking bootloader di Motorola Xoom akan menghapus semua user data (termasuk shared USB data). Menggunakan Flash Unlock

Android 7.0 memperkenalkan sistem API baru, getFlashLockState(), untuk mengirimkan bootloader state.

Android 7.0 menambahkan sistem API berikut yang akan memberitahukan boottloader lock status pada device yang complient:

PersistentDataBlockManager.getFlashLockState() Return value Kondisi FLASH_LOCK_UNKNOWN Jawaban ini hanya oleh perangkat yang di upgrade ke Android 7.0 yang belum mendukung perubahan bootloader yang diperlukan untuk mendapatkan status lock flashdisk jika mereka mendukung kemampuan flashing lock / unlock.

Perangkat Android 7.0 yang baru harus berada pada state FLASH_LOCK_LOCKED atau FLASH_LOCK_UNLOCKED. Jika perangkat di upgrade ke Android 7.0 dan tidak mendukung flashing kemampuan unlock / lock, maka harus hanya mengembalikan state FLASH_LOCK_LOCKED. FLASH_LOCK_LOCKED Harus dikembalikan oleh setiap perangkat yang tidak mendukung flashing lock / unlock (yaitu perangkat selalu dalam kondisi lock), atau perangkat yang tidak mendukung flashing lock / unlock dan dalam keadaan locked. FLASH_LOCK_UNLOCKED Dikembalikan oleh perangkat yang mendukung flashing lock / unlock dan saat ini sedang dalam keadaan unlocked.

Contoh dan source Di Android 7.0 release, Android Open Source Project (AOSP) berisi referensi implementasi yang akan mengembalikan nilai berdasarkan pada property ro.boot.flash.locked. code berada di:

frameworks/base/services/core/java/com/android/server/PersistentDataBlockService.java frameworks/base/core/java/android/service/persistentdata/PersistentDataBlockManager.java

Validation Produsen harus menguji nilai keadaan yang dikembalikan oleh perangkat dengan bootloader locked atau unlocked.

Selecting a device build Cara build recommended untuk device tersedia dari menu lunch, dapat dilihat saat lunch dijalankan tanpa argumen, sebagai berikut,

lunch

You're building on Linux Lunch menu... pick a combo: 1. aosp_arm­eng 2. aosp_arm64­eng 3. aosp_mips­eng 4. aosp_mips64­eng 5. aosp_x86­eng 6. aosp_x86_64­eng 7. full_fugu­userdebug 8. aosp_fugu­userdebug 9. mini_emulator_arm64­userdebug 10. m_e_arm­userdebug 11. m_e_mips64­eng 12. m_e_mips­userdebug 13. mini_emulator_x86_64­userdebug 14. mini_emulator_x86­userdebug 15. aosp_dragon­userdebug 16. aosp_dragon­eng 17. aosp_marlin­userdebug 18. aosp_sailfish­userdebug 19. aosp_flounder­userdebug 20. aosp_angler­userdebug 21. aosp_bullhead­userdebug 22. hikey­userdebug 23. aosp_shamu­userdebug Which would you like? [aosp_arm­eng]

Anda dapat men-download factory Image dan binary untuk Nexus dari developers.google.com:

• Preview binaries (blobs) https://developers.google.com/android/nexus/blobs-preview • Factory image untuk Nexus dkk https://developers.google.com/android/nexus/images • Support driver untuk Nexus dkk https://developers.google.com/android/nexus/drivers

Berbagai nama device (khususnya Nexus), code name dan konfigurasi build-nya bisa dilihat pada tabel berikut.

Device Code name Build configuration HiKey hikey hikey­userdebug Nexus 6P angler aosp_angler­userdebug Nexus 5X bullhead aosp_bullhead­userdebug Nexus 6 shamu aosp_shamu­userdebug Nexus Player fugu aosp_fugu­userdebug Nexus 9 volantis (flounder) aosp_flounder­userdebug Nexus 5 (GSM/LTE) hammerhead aosp_hammerhead­userdebug Nexus 7 (Wi­Fi) razor (flo) aosp_flo­userdebug Nexus 7 (Mobile) razorg (deb) aosp_deb­userdebug Nexus 10 mantaray (manta) full_manta­userdebug Nexus 4 occam (mako) full_mako­userdebug Nexus 7 (Wi­Fi) nakasi (grouper) full_grouper­userdebug Nexus 7 (Mobile) nakasig (tilapia) full_tilapia­userdebug Galaxy Nexus (GSM/HSPA+) yakju (maguro) full_maguro­userdebug Galaxy Nexus (Verizon) mysid (toro) aosp_toro­userdebug Galaxy Nexus (Experimental) mysidspr (toroplus) aosp_toroplus­userdebug PandaBoard (Archived) panda aosp_panda­userdebug Motorola Xoom (U.S. Wi­Fi)wingray full_wingray­userdebug soju (crespo) full_crespo­userdebug Nexus S sojus (crespo4g) full_crespo4g­userdebug

Catatan: Jangan menggunakan Android 4.1.1 di Nexus 7 yang awalnya di jual menggunakan Android 4.1.2 atau yang lebih baru.

Flash device Kita dapat flash keseluruhan sistem Android dalam satu perintah; dalam melakukan hal itu perlu memverifikasi sistem yang di flash apakah kompatibel dengan bootloader dan radioyang terpasang, menulis partisi boot, recovery, dan sistem bersama-sama, kemudian reboot sistem. Flashing juga berarti menghapus semua data pengguna, mirip dengan fastboot oem unlock.

Ubah device agar berada di fastboot mode baik secara manual dengan menekan kombinasi tombol yang tepat saat booting, atau dari shell menggunakan perintah, $ adb reboot bootloader

Setlah device berada di fastboot mode, jalankan:

$ fastboot flashall ­w

Opsi -w akan menghapus partisi /data di device; ini sangat berharga untuk flash pertama kali sebuah device jika bukan pertama kali maka tidak di perlukan.

Catatan: Filesystem yang dibuat melalui fastboot di Motorola Xoom tidak berfungsi secara optimal. Sangat di rekomendasikan untuk membuat lagi filesystem melaluirecovery, menggunakan perintah:

$ adb reboot recovery

Saat di recovery, buka menu menu (tekan Power + Volume Up), hapus partisi cache, kemudian hapus data.

Restoring device ke factory state Factory image untuk Nexus 5, Nexus 10, Nexus 4, Nexus Q, Nexus 7, Galaxy Nexus (GSM/HSPA+ "yakju" dan "takju", dan CDMA/LTE "mysid" dan "mysidspr"), Nexus S, dan Nexus S 4G tersedia dari halaman Google factory image https://developers.google.com/android/images

Factory image untuk Motorola Xoom di distribusikan langsung oleh Motorola.

Build Kernel Halaman ini merinci bagaimana mem-build hanya kernel. Petunjuk berikut berasumsi bahwa kita belum download semua AOSP; jika kita sudah melakukannya, kita dapat melewati langkah-langkah git clone kecuali langkah yang men-download kernel source.

Sebagian contoh di bagian ini menggunakan hikey kernel sebagai contoh.

Memilih kernel Tabel daftar nama dan lokasi dari kernel source dan binary,

Device Lokasi Binary Lokasi Source Konfigurasi Build hikey device/linaro/hikey­kernel kernel/hikey­linaro hikey_defconfig angler device/huawei/angler­kernel kernel/msm angler_defconfig bullhead device/lge/bullhead­kernel kernel/msm bullhead_defconfig shamu device/moto/shamu­kernel kernel/msm shamu_defconfig fugu device/asus/fugu­kernel kernel/x86_64 fugu_defconfig volantis device/htc/flounder­kernel kernel/tegra flounder_defconfig hammerhead device/lge/hammerhead­kernel kernel/msm hammerhead_defconfig flo device/asus/flo­kernel/kernel kernel/msm flo_defconfig deb device/asus/flo­kernel/kernel kernel/msm flo_defconfig manta device/samsung/manta/kernel kernel/exynos manta_defconfig mako device/lge/mako­kernel/kernel kernel/msm mako_defconfig grouper device/asus/grouper/kernel kernel/tegra tegra3_android_defconfig tilapia device/asus/grouper/kernel kernel/tegra tegra3_android_defconfig maguro device/samsung/tuna/kernel kernel/omap tuna_defconfig toro device/samsung/tuna/kernel kernel/omap tuna_defconfig panda device/ti/panda/kernel kernel/omap panda_defconfig stingray device/moto/wingray/kernel kernel/tegra stingray_defconfig wingray device/moto/wingray/kernel kernel/tegra stingray_defconfig crespo device/samsung/crespo/kernel kernel/samsung herring_defconfig crespo4g device/samsung/crespo/kernel kernel/samsung herring_defconfig

Setelah menentukan device project yang akan kita kerjakan, lihat git log untuk kernel binary. Device projects menggunakan format device//.

$ git clone https://android.googlesource.com/kernel/hikey­linaro $ cd hikey­linaro $ git log ­­max­count=1 kernel

Commit message untuk kernel binary berisi parsial git log dari kernel yang digunakan untuk mem- build binary. Entri pertama dalam log adalah terbaru (yang digunakan untuk mem-build kernel). Buat catatan commit message karena kita akan membutuhkannya pada langkah berikutnya.

Mengidentifikasi versi kernel Untuk mengetahui versi kernel yang digunakan dalam image system, jalankan perintah berikut pada file kernel,

$ dd if=kernel bs=1 skip=$(LC_ALL=C grep ­a ­b ­o $'\x1f\x8b\x08\x00\x00\x00\x00\x00' kernel | cut ­d ':' ­f 1) | zgrep ­a 'Linux version'

Untuk Nexus 5 (hammerhead), perintah tersebut adalah,

$ dd if=zImage­dtb bs=1 skip=$(LC_ALL=C od ­Ad ­x ­w2 zImage­dtb | grep 8b1f | cut ­d ' ' ­f1 | head ­1) | zgrep ­a 'Linux version'

Downloading source Download source untuk kernel yang kita ingin build menggunakan perintah git clone yang benar:

$ git clone https://android.googlesource.com/kernel/common.git $ git clone https://android.googlesource.com/kernel/hikey­linaro $ git clone https://android.googlesource.com/kernel/x86_64.git $ git clone https://android.googlesource.com/kernel/exynos.git $ git clone https://android.googlesource.com/kernel/goldfish.git $ git clone https://android.googlesource.com/kernel/msm.git $ git clone https://android.googlesource.com/kernel/omap.git $ git clone https://android.googlesource.com/kernel/samsung.git $ git clone https://android.googlesource.com/kernel/tegra.git

• goldfish project berisi kernel source untuk emulate platform. • msm project berisi source untuk ADP1, ADP2, Nexus One, Nexus 4, Nexus 5, Nexus 6, Nexus 5X, Nexus 6P, Nexus 7 (2013), dan dapat digunakan sebagai pijakan awal untuk bekerja pada Qualcomm MSM chipset. • omap project digunakan untuk PandaBoard dan Galaxy Nexus, dan dapat digunakan untuk pijakan awal untuk bekerja dengan TI OMAP chipset. • samsung project digunakan untuk Nexus S, dan dapat digunakan untuk pijakan awal untuk bekerja dengan Samsung Hummingbird chipset. • tegra project digunakan untuk Xoom, Nexus 7 (2012), Nexus 9, dan dapat digunakan untuk pijakan awal untuk bekerja dengan NVIDIA Tegra chipset. • exynos project mempunyai kernel source untuk Nexus 10, dan dapat digunakan untuk pijakan awal untuk bekerja dengan Samsung Exynos chipset. • x86_64 project mempunyai kernel source untuk Nexus Player, dan dapat digunakan untuk pijakan awal untuk bekerja dengan Intel x86_64 chipsets. • hikey-linaro project digunakan untuk HiKey reference board, dan dapat digunakan untuk pijakan awal untuk bekerja dengan HiSilicon 620 chipset.

Downloading a prebuilt gcc Pastikan prebuilt toolchain ada dalam path:

$ export PATH=$(pwd)/prebuilts/gcc/linux­x86/arm/arm­eabi­4.6/bin:$PATH

Di mesin Linux, jika kita tidak memiliki Android source tree, kita dapat men-download prebuilt toolchain dari:

$ git clone https://android.googlesource.com/platform/prebuilts/gcc/linux­x86/arm/arm­eabi­4.6

Build kernel Jika kita tahu commit message terakhir untuk kernel dan berhasil download kernel source maupun prebuilt gcc, pada dasarnya kita siap untuk build kernel. Perintah build berikut menggunakan hikey kernel:

$ export ARCH=arm64 $ export CROSS_COMPILE=aarch64­linux­android­ $ cd hikey­linaro $ git checkout ­b android­hikey­linaro­4.1 origin/android­hikey­linaro­4.1 $ make hikey_defconfig $ make

Untuk build kernel yang berbeda, cukup mengganti kata hikey-linaro dengan nama kernel yang ingin kita build.

Image output ke directory arch/arm64/boot/Image ; kernel binary output ke file arch/arm64/boot/dts/hisilicon/hi6220-hikey.dtb . Copy Image directory dan file hi6220-hikey.dtb ke hikey-kernel directory.

Alternatif lain, kita dapat memasukan variabel TARGET_PREBUILT_KERNEL saat menggunakan make bootimage (atau make command lainnya yang akan build boot image). Variable ini di dukung oleh semua device karena di setup melalui device/common/populate-new-device.sh. Contoh:

$ export TARGET_PREBUILT_KERNEL=$your_kernel_path/arch/arm/boot/zImage­dtb

Catatan: Nama kernel berbeda untuk setiap device. Untuk mencari tahu lokasi filename yang benar untuk kernel kita, coba lihat di device// di kernel source.

Referensi • https://en.wikipedia.org/wiki/Android_(operating_system) • http://source.android.com/ • http://source.android.com/source/requirements.html • http://source.android.com/source/initializing.html • http://source.android.com/source/downloading.html • http://source.android.com/source/building.html • https://en.wikipedia.org/wiki/Comparison_of_mobile_operating_systems • http://lms.onnocenter.or.id/wiki/index.php/OS:_Android_-_Build_CyanogenMod • http://lms.onnocenter.or.id/wiki/index.php/OS:_Android_- _Mempersiapkan_Development_Environment • https://kobablog.wordpress.com/2011/05/12/tips-of-repo-sync-of-android/ • http://tipsonubuntu.com/2016/07/31/install-oracle-java-8-9-ubuntu-16-04-linux-mint-18/ BAB 15: Penutup

Buku ini merupakan kristalisasi materi mata kuliah sistem operasi yang saya ajarkan kepada mahasiswa selama 5+ tahun di kampus. Hasilnya cukup mencengangkan karena berhasil membuat Percaya Diri para mahasiswa khususnya dalam mengeksplorasi dan membuat sendiri sistem operasi komputer maupun Android di handphone. Beberapa hal yang di harapkan di peroleh dari buku ini adalah agar pembaca

• Mengerti akan berbagai pengertian dan konsep sistem operasi. • Mengerti anatomi / struktur source code sistem operasi. • Mengerti bagaimana cara membuat atau paling tidak mengcompile sistem operasi. • Mengerti bagaimana cara me-remaster sistem operasi yang sudah jadi. • Mengerti bagaimana membuat kernel modul / device driver sederhana. • Men-tune berbagai parameter sistem operasi. • Menilai / mengevaluasi sistem operasi apakah lebih baik atau tidak, setelah berbagai parameter kita ubah.

Dalam proses penyampaian materi buku ini lebih banyak mengajak para mahasiswa untuk mengeksplorasi sistem operasi itu sendiri dan melihat bahwa sistem operasi juga buatan manusia yang bisa dibuat sendiri oleh orang Indonesia. Semoga ini bisa meningkatkan percaya diri para mahasiswa.

Saya mengerti bahwa sebagian besar dosen yang mengajarkan sistem operasi di perguruan tinggi maupun di SMK kemungkinan besar tidak akan menggunakan pola yang saya ajarkan. Sebagian besar akan cenderung untuk mencari jalan yang aman untuk mengajar dan memberikan hal yang sifatnya sangat teoritis saja, tanpa memperlihatkan bagaimana cara membuat, mengcompile dan mentune sistem operasi secara live di depan kelas. Mudah-mudahan buku ini dapat menolong para pengajar untuk bisa berani mengajar teknik praktis sistem operasi di depan kelas. TENTANG PENULIS:

Onno W. Purbo adalah seorang tokoh (yang kemudian lebih dikenal sebagai pakar di bidang) teknologi informasi asal Indonesia. Ayah Onno,Hasan Poerbo, adalah seorang profesor di ITB bidang lingkungan hidup yang banyak memihak pada rakyat kecil. Onno masuk ITB pada jurusan Teknik Elektro angkatan 1981. Enam tahun kemudian Onno lulus dengan predikat wisudawan terbaik. Setelah itu Onno melanjutkan studi ke Kanada dengan beasiswa dari PAU-ME. RT/RW-Net adalah salah satu dari sekian banyak gagasan yang Onno lontarkan yang mengukir Sejarah Internet Indonesia. Ia juga aktif menulis dalam bidang teknologi informasi di berbagai media, seminar, konferensi nasional maupun internasional terutama untuk memberdayakan masyarakat Indonesia menuju masyarakat berbasis pengetahuan. Lebih dari 163 kota besar di 34 negara di kunjungi dalam perjalanan hidup-nya. Onno percaya filosofy copyleft, banyak tulisannya dipublikasi secara gratis di internet.