এই পোস্টটি কিছুটা ঘন / অগোছালো থাকলে অগ্রিম ক্ষমা চাইছি, তবে এটি আরও ভালভাবে গঠনের জন্য আমার খুব কষ্ট হচ্ছে ... মূলত, হার্ড ডিস্ক লেখার পরে কী ঘটে যায় তা আমি অধ্যয়ন করতে চাই এবং আমি জানতে চাই:
- নীচে আমার বোঝাটি কি সঠিক - এবং যদি না হয় তবে আমি কোথায় ভুল করছি?
- ডিস্ক লেখার সময় পিসিতে ঘটে যাওয়া সমস্ত দিক সম্পর্কে লগ ডেটা "ক্যাপচার" করার কি আরও ভাল সরঞ্জাম আছে?
আরও বিশদে - প্রথমে, আমি যে ওএসটি ব্যবহার করছি তা হ'ল:
$ uname -a
Linux mypc 2.6.38-16-generic #67-Ubuntu SMP Thu Sep 6 18:00:43 UTC 2012 i686 i686 i386 GNU/Linux
সুতরাং, আমার কাছে নিম্নলিখিতগুলি সহজ (উদাহরণস্বরূপ অপারেশনগুলির ব্যর্থতার জন্য সাধারণ চেকগুলি এড়িয়ে যায়) ব্যবহারকারী-স্পেস সি প্রোগ্রামে wtest.c
:
#include <stdio.h>
#include <fcntl.h> // O_CREAT, O_WRONLY, S_IRUSR
int main(void) {
char filename[] = "/tmp/wtest.txt";
char buffer[] = "abcd";
int fd;
mode_t perms = S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH;
fd = open(filename, O_RDWR|O_CREAT, perms);
write(fd,buffer,4);
close(fd);
return 0;
}
আমি এটি দিয়ে তৈরি gcc -g -O0 -o wtest wtest.c
। এখন, যেহেতু আমি লেখার চেষ্টা করছি /tmp
, আমি নোট করছি যে এটি মূলের নীচে একটি ডিরেক্টরি /
- সুতরাং আমি যাচ্ছি mount
:
$ mount
/dev/sda5 on / type ext4 (rw,errors=remount-ro,commit=0)
...
/dev/sda6 on /media/disk1 type ext4 (rw,uhelper=hal,commit=0)
/dev/sda7 on /media/disk2 type ext3 (rw,nosuid,nodev,uhelper=udisks,commit=0,commit=0,commit=0,commit=0,commit=0,commit=0)
...
সুতরাং, আমার মূল ফাইল সিস্টেমটি ডিভাইসের /
একটি বিভাজন /dev/sda
(এবং আমি অন্যান্য পার্টিশনগুলি "স্ট্যান্ডলোন" ডিস্ক / মাউন্ট হিসাবেও ব্যবহার করছি)। এই ডিভাইসের জন্য ড্রাইভারটি সন্ধান করতে, আমি ব্যবহার করি hwinfo
:
$ hwinfo --disk
...
19: IDE 00.0: 10600 Disk
...
SysFS ID: /class/block/sda
SysFS BusID: 0:0:0:0
...
Hardware Class: disk
Model: "FUJITSU MHY225RB"
...
Driver: "ata_piix", "sd"
Driver Modules: "ata_piix"
Device File: /dev/sda
...
Device Number: block 8:0-8:15
...
সুতরাং, /dev/sda
হার্ড ডিস্কটি স্পষ্টতই ata_piix
(এবং sd
) ড্রাইভার দ্বারা পরিচালিত হয় ।
$ grep 'ata_piix\| sd' <(gunzip </var/log/syslog.2.gz)
Jan 20 09:28:31 mypc kernel: [ 1.963846] ata_piix 0000:00:1f.2: version 2.13
Jan 20 09:28:31 mypc kernel: [ 1.963901] ata_piix 0000:00:1f.2: PCI INT B -> GSI 19 (level, low) -> IRQ 19
Jan 20 09:28:31 mypc kernel: [ 1.963912] ata_piix 0000:00:1f.2: MAP [ P0 P2 P1 P3 ]
Jan 20 09:28:31 mypc kernel: [ 2.116038] ata_piix 0000:00:1f.2: setting latency timer to 64
Jan 20 09:28:31 mypc kernel: [ 2.116817] scsi0 : ata_piix
Jan 20 09:28:31 mypc kernel: [ 2.117068] scsi1 : ata_piix
Jan 20 09:28:31 mypc kernel: [ 2.529065] sd 0:0:0:0: [sda] 488397168 512-byte logical blocks: (250 GB/232 GiB)
Jan 20 09:28:31 mypc kernel: [ 2.529104] sd 0:0:0:0: Attached scsi generic sg0 type 0
Jan 20 09:28:31 mypc kernel: [ 2.529309] sd 0:0:0:0: [sda] Write Protect is off
Jan 20 09:28:31 mypc kernel: [ 2.529319] sd 0:0:0:0: [sda] Mode Sense: 00 3a 00 00
Jan 20 09:28:31 mypc kernel: [ 2.529423] sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
Jan 20 09:28:31 mypc kernel: [ 2.674783] sda: sda1 sda2 < sda5 sda6 sda7 sda8 sda9 sda10 >
Jan 20 09:28:31 mypc kernel: [ 2.676075] sd 0:0:0:0: [sda] Attached SCSI disk
Jan 20 09:28:31 mypc kernel: [ 4.145312] sd 2:0:0:0: Attached scsi generic sg1 type 0
Jan 20 09:28:31 mypc kernel: [ 4.150596] sd 2:0:0:0: [sdb] Attached SCSI removable disk
অনেক কিছু স্থগিত করার সাথে সাথে আমাকে পুরনো সিসলগ থেকে টানতে হবে, তবে উপরেরটি বুট করার সময় সিসলগ থেকে যথাযথ স্নিপেটের মতো মনে হয়, যেখানে ata_piix
(এবং sd
) ড্রাইভার প্রথমবারের জন্য লাথি মারছে।
আমার প্রথম বিভ্রান্তির বিষয়টি হ'ল আমি অন্যথায় ata_piix
বা sd
ড্রাইভারগুলি পর্যবেক্ষণ করতে পারি না :
$ lsmod | grep 'ata_piix\| sd'
$
$ modinfo sd
ERROR: modinfo: could not find module sd
$ modinfo ata_piix
ERROR: modinfo: could not find module ata_piix
সুতরাং আমার প্রথম প্রশ্নটি হল - কেন আমি ata_piix
এখানে কেবলমাত্র বুট-টাইম লগগুলিতে মডিউলটি পর্যবেক্ষণ করতে পারি না ? এটি ata_piix
( কারণ sd
) (একচেটিয়া) কার্নেলটিতে (লোডযোগ্য) .ko
কার্নেল মডিউল হিসাবে নির্মিত হওয়ার বিপরীতে, (এবং ) বিল্ট-ইন ড্রাইভার হিসাবে নির্মিত হয়েছে ?
ডান - তাই এখন, আমি ftrace
লিনাক্স অন্তর্নির্মিত ফাংশন ট্রেসার দিয়ে প্রোগ্রামটি চালানোর পরে কী ঘটে তা পর্যবেক্ষণ করার চেষ্টা করছি ।
sudo bash -c '
KDBGPATH="/sys/kernel/debug/tracing"
echo function_graph > $KDBGPATH/current_tracer
echo funcgraph-abstime > $KDBGPATH/trace_options
echo funcgraph-proc > $KDBGPATH/trace_options
echo 0 > $KDBGPATH/tracing_on
echo > $KDBGPATH/trace
echo 1 > $KDBGPATH/tracing_on ; ./wtest ; echo 0 > $KDBGPATH/tracing_on
cat $KDBGPATH/trace > wtest.ftrace
'
... এবং এখানে ftrace
লগ সম্পর্কিত একটি স্নিপেট রয়েছে write
:
4604.352690 | 0) west-31632 | | sys_writ () { 4604.352690 | 0) west-31632 | 0.750 আমাদের | fget_light (); 4604.352692 | 0) west-31632 | | vfs_writ () { 4604.352693 | 0) west-31632 | | rw_verify_area () { 4604.352693 | 0) west-31632 | | সিকিউরিটি_ফায়াল_পরিমাণ () { 4604.352694 | 0) west-31632 | | apparmor_file_permission () { 4604.352695 | 0) west-31632 | 0.811 আমাদের | common_file_perm (); 4604.352696 | 0) west-31632 | 2.198 আমাদের | } 4604.352697 | 0) west-31632 | 3.573 আমাদের | } 4604.352697 | 0) west-31632 | 4.979 আমাদের | } 4604.352698 | 0) west-31632 | | do_sync_writ () { 4604.352699 | 0) west-31632 | | ext4_file_writ () { 4604.352700 | 0) west-31632 | | জেনেরিক_ফাইল_আইও_ রাইট () { 4604.352701 | 0) west-31632 | | মিটেক্স_লক () { 4604.352701 | 0) west-31632 | 0.666 আমাদের | _cond_resched (); 4604.352703 | 0) west-31632 | 1.994 আমাদের | } 4604.352704 | 0) west-31632 | | __ জেনেরিক_ফিল_আইও_রাইট () { ... 4604.352728 | 0) west-31632 | | ফাইল_আপডেট_টাইম () { ... 4604.352732 | 0) west-31632 | 0.756 আমাদের | mnt_want_write_file (); 4604.352734 | 0) west-31632 | | __মার্ক_ইনোড_ডার্টি () { ... 4604.352750 | 0) west-31632 | | ext4_mark_inode_dirty () { 4604.352750 | 0) west-31632 | 0.679 আমাদের | _cond_resched (); 4604.352752 | 0) west-31632 | | ext4_re সংরক্ষণ_inode_writ () { ... 4604.352777 | 0) west-31632 | | __ext4_j Journal_get_writ_access () { ... 4604.352795 | 0) west-31632 | | ext4_mark_iloc_dirty () { ... 4604.352806 | 0) west-31632 | | __ext4_j Journal_stop () { ... 4604.352821 | 0) west-31632 | 0.684 আমাদের | mnt_drop_write (); 4604.352822 | 0) west-31632 | + 93.541 আমাদের | } 4604.352823 | 0) west-31632 | | জেনেরিক_ফায়াল_ফারড_রাইট () { 4604.352824 | 0) west-31632 | 0.654 আমাদের | iov_iter_advance (); 4604.352825 | 0) west-31632 | | জেনেরিক_পারফর্ম_উইট () { 4604.352826 | 0) west-31632 | 0.709 আমাদের | iov_iter_fault_in_readable (); 4604.352828 | 0) west-31632 | | ext4_da_writ_begin () { 4604.352829 | 0) west-31632 | | ext4_j Journal_start_sb () { ... 4604.352847 | 0) west-31632 | 1.453 আমাদের | __block_write_begin (); 4604.352849 | 0) west-31632 | + 21.128 আমাদের | } 4604.352849 | 0) west-31632 | | iov_iter_copy_from_user_atomic () { 4604.352850 | 0) west-31632 | | __kmap_atomic () { ... 4604.352863 | 0) west-31632 | 0.672 আমাদের | mark_page_accessed (); 4604.352864 | 0) west-31632 | | ext4_da_writ_end () { 4604.352865 | 0) west-31632 | | জেনেরিক_রাইট_এন্ড () { 4604.352866 | 0) west-31632 | | block_writ_end () { ... 4604.352893 | 0) west-31632 | | __ext4_j Journal_stop () { ... 4604.352909 | 0) west-31632 | 0.655 আমাদের | mutex_unlock (); 4604.352911 | 0) west-31632 | 0.727 আমাদের | generic_write_sync (); 4604.352912 | 0) west-31632 | ! 212.259 আমাদের | } 4604.352913 | 0) west-31632 | ! 213.845 আমাদের | } 4604.352914 | 0) west-31632 | ! 215.286 আমাদের | } 4604.352914 | 0) west-31632 | 0.685 আমাদের | __fsnotify_parent (); 4604.352916 | 0) west-31632 | | fsnotify () { 4604.352916 | 0) west-31632 | 0.907 আমাদের | __srcu_read_lock (); 4604.352918 | 0) west-31632 | 0.685 আমাদের | __srcu_read_unlock (); 4604.352920 | 0) west-31632 | 3.958 আমাদের | } 4604.352920 | 0) west-31632 | ! 228.409 আমাদের | } 4604.352921 | 0) west-31632 | ! 231.334 আমাদের | }
এটি আমার বিভ্রান্তির দ্বিতীয় বিষয় - আমি প্রত্যাশা অনুযায়ী write()
কার্নেল-স্পেসের সাথে ব্যবহারকারীর স্থানটি পর্যবেক্ষণ করতে পারি sys_write()
; এবং এর মধ্যে sys_write()
আমি সুরক্ষা সম্পর্কিত ফাংশন (উদাঃ apparmor_file_permission()
), "জেনেরিক" রাইটিং ফাংশন (উদাঃ generic_file_aio_write()
), ext4
ফাইল সিস্টেম সম্পর্কিত ফাংশন (উদাঃ ext4_journal_start_sb()
) পর্যবেক্ষণ করি - তবে আমি (বা ) ড্রাইভারের সাথে সম্পর্কিত কিছু পর্যবেক্ষণ করি না ?!ata_piix
sd
পৃষ্ঠা ট্রেসিং ও প্রোফাইলিং - Yocto প্রকল্প ব্যবহার দাড়ায় blk
মধ্যে রেখক ftrace
সম্পর্কে ব্লক ডিভাইস অপারেশন আরও তথ্য পেতে, কিন্তু এটা এই উদাহরণে আমার জন্য কিছুই রিপোর্ট। এছাড়াও, লিনাক্স ফাইলসিস্টেম ড্রাইভারস - অ্যানন ইন্লোরিওন (টিউটরফস) পরামর্শ দেয় যে ফাইল সিস্টেমগুলি (ক্যান ?) এছাড়াও কার্নেল মডিউল / ড্রাইভার হিসাবে প্রয়োগ করা যেতে পারে, এবং আমি অনুমান করছি যে এটিও ext4
একই অবস্থা।
অবশেষে, আমি শপথ করতে পারলাম যে function_graph
ট্রেসারের দেখানো ফাংশনের পাশে আমি বর্গাকার বন্ধনীগুলিতে ড্রাইভারের নামটি আগে পর্যবেক্ষণ করেছি , তবে আমার ধারণা যে আমি মিশ্রিত জিনিসগুলি পেয়েছি - এটি সম্ভবত স্ট্যাকের (পেছনের) চিহ্নগুলিতে প্রদর্শিত হতে পারে তবে তা নয় ফাংশন গ্রাফে। তদতিরিক্ত, আমি পরিদর্শন করতে পারি /proc/kallsyms
:
$ grep 'piix\| sd\|psmouse' /proc/kallsyms
...
00000000 d sd_ctl_dir
00000000 d sd_ctl_root
00000000 d sdev_class
00000000 d sdev_attr_queue_depth_rw
00000000 d sdev_attr_queue_ramp_up_period
00000000 d sdev_attr_queue_type_rw
00000000 d sd_disk_class
...
00000000 t piix_init_sata_map
00000000 t piix_init_sidpr
00000000 t piix_init_one
00000000 t pci_fixup_piix4_acpi
...
00000000 t psmouse_show_int_attr [psmouse]
00000000 t psmouse_protocol_by_type [psmouse]
00000000 r psmouse_protocols [psmouse]
00000000 t psmouse_get_maxproto [psmouse]
...
... এবং উত্স লিনাক্স / ড্রাইভার / আতা / আতা_পিক্স.সি. এর সাথে পরীক্ষা করে নিশ্চিত করুন যে উদাহরণস্বরূপ piix_init_sata_map
এটি একটি ফাংশন ata_piix
। যা সম্ভবত আমাকে বলতে হবে: যে মডিউলগুলি কার্নেলের মধ্যে সংকলিত হয় (সুতরাং তারা একঘেয়ে কার্নেলের একটি অংশ হয়ে যায়) তারা কোন মডিউল থেকে আসে সে সম্পর্কে তথ্য "হারান"; তবে লোডযোগ্য মডিউলগুলি যা পৃথক .ko
কার্নেল অবজেক্ট হিসাবে নির্মিত হয় সেগুলি সংরক্ষণ করে (উদাহরণস্বরূপ [psmouse]
বর্গাকার বন্ধনীতে দেখানো)। সুতরাং, ftrace
লোডযোগ্যযোগ্য কার্নেল মডিউলগুলি থেকে আসা ফাংশনগুলির জন্য কেবল "উত্সত মডিউল" তথ্য প্রদর্শন করা যায়। এটা কি সঠিক?
উপরের বিষয়টি বিবেচনায় নেওয়া, এই প্রক্রিয়াটি সম্পর্কে বর্তমানে আমার বোঝার বিষয়টি:
- বুট করার সময়
ata_piix
ড্রাইভারটি/dev/sda
হার্ড ডিস্কের মধ্যে একটি ডিএমএ (?) মেমরি ম্যাপিং স্থাপন করে- এই কারণে, সব ভবিষ্যতের ব্যবহারের
/dev/sda
মাধ্যমেata_piix
কার্নেল (যেমন, অনুসরণযোগ্য নয়) স্বচ্ছ হবে - সব থেকে কার্নেল দেখতে হবে, শুধু লেখা আছে / মেমরি অবস্থানে লিখেছেন (অগত্যা নির্দিষ্ট অনুসরণযোগ্য কার্নেল ফাংশন কল), যাfunction_graph
ট্রেসার দ্বারা রিপোর্ট করা হয় না
- এই কারণে, সব ভবিষ্যতের ব্যবহারের
- বুট করার সময়
sd
ড্রাইভারটি পার্টিশনগুলির পার্টিশনগুলির আরও "পার্স" করবে/dev/sda
, তাদের উপলব্ধ করবে এবং সম্ভবত পার্টিশনের মধ্যে মেমরি ম্যাপিংগুলি পরিচালনা করবে <-> ডিস্ক ডিভাইস- আবার,
sd
এটি কার্নেলের সাথে স্বচ্ছ হয়ে অ্যাক্সেস অপারেশন করা উচিত
- আবার,
- যেহেতু উভয়ই
ata_piix
এবংsd
ইন-কার্নেল সংকলিত রয়েছে, এমনকি যদি তাদের কিছু ক্রিয়াকলাপ ক্যাপচার হওয়ার পরেও ঘটে তবেftrace
আমরা কোন মডিউলটি আসতে পারি তার তথ্য (উত্স ফাইলগুলির সাথে "ম্যানুয়াল" পারস্পরিক সম্পর্ক ছাড়া) পেতে পারি না - পরবর্তীতে,
mount
একটি পার্টিশন এবং সংশ্লিষ্ট ফাইল সিস্টেম ড্রাইভারের মধ্যে সম্পর্ক স্থাপন / আবশ্যক স্থাপন করে (এই ক্ষেত্রেext4
)- এই বিন্দু থেকে, মাউন্ট করা ফাইল সিস্টেমের সমস্ত অ্যাকসেসগুলি
ext4
ফাংশন দ্বারা পরিচালিত হবে - যা কার্নেল দ্বারা সনাক্তযোগ্য; তবেext4
ইন-কার্নেল হিসাবে সংকলিত আছে, ট্রেসার আমাদের উত্সের মডিউল তথ্য দিতে পারে না
- এই বিন্দু থেকে, মাউন্ট করা ফাইল সিস্টেমের সমস্ত অ্যাকসেসগুলি
- সুতরাং, পর্যবেক্ষণ করা "জেনেরিক" লিখেছেন,
ext4
ফাংশনগুলির মাধ্যমে বলা হয়, শেষ পর্যন্ত মেমরির অবস্থানগুলিতে অ্যাক্সেস করতে পারে, যার ম্যাপিংটি প্রতিষ্ঠিত করেছেata_piix
- তবে এগুলি ছাড়াও,ata_piix
ডেটা স্থানান্তরে সরাসরি হস্তক্ষেপ করে না (এটি সম্ভবত ডিএমএ দ্বারা পরিচালিত হয় (প্রসেসরের বাইরেও) (গুলি) এবং এটি এতে স্বচ্ছ)।
এই বোঝাপড়াটি কি সঠিক?
সম্পর্কিত কিছু অনুচ্ছেদ:
- উপরের আমার সেটআপে, আমি একটি পিসিআই ডিভাইস ড্রাইভার (
ata_piix
) এবং একটি ফাইল সিস্টেম ড্রাইভার (ext4
) সনাক্ত করতে পারি; তবে "লিখন" কার্যকরকরণের পথে কোথাও চরিত্র বা ব্লক ড্রাইভার ব্যবহার করা হয়েছে এবং যদি তা হয় তবে সেগুলি কোনটি? - এই ড্রাইভারগুলির মধ্যে কে কেচিং পরিচালনা করবে (তাই অপ্রয়োজনীয় ডিস্ক ক্রিয়াকলাপ বাদ দেওয়া বা অনুকূলিত করা যায়?)
- আমি এর আগে থেকেই জানি
/dev/shm
র্যামের একটি ফাইল সিস্টেম;mount | grep shm
আমার জন্য রিপোর্ট:none on /dev/shm type tmpfs (rw,nosuid,nodev)
। এর অর্থ কি - এর বিপরীতে/dev/sda
-shm
ফাইল সিস্টেমটিতে কেবল "নিজস্ব" অ্যাড্রেসগুলি থেকে কোনও ডিভাইসের দিকে বাসের ঠিকানাগুলিতে (ডিএমএ) ম্যাপিংয়ের অভাব হয়; এবং এইভাবেtmpfs
ফাইল সিস্টেমের মাধ্যমে সমস্ত অ্যাক্সেসগুলি প্রকৃত র্যামে শেষ হয়?