| bpftool-map(8) | System Manager's Manual | bpftool-map(8) |
نام (NAME)
bpftool-map - ابزار بازرسی و دستکاری نگاشتهای bpf
خلاصه دستور (SYNOPSIS)
bpftool [OPTIONS] map COMMAND
OPTIONS := { { -j | --json } [{ -p | --pretty }] | { -d | --debug } | { -f | --bpffs } | { -n | --nomount } }
COMMANDS := { show | list | create | dump | update | lookup | getnext | delete | pin | help }
دستورات نگاشت (MAP COMMANDS)
bpftool map { show | list } [MAP]
bpftool map create FILE type TYPE key KEY_SIZE value VALUE_SIZE
entries MAX_ENTRIES name NAME [flags FLAGS] [inner_map MAP]
[offload_dev NAME]
bpftool map dump MAP
bpftool map update MAP [key DATA] [value VALUE] [UPDATE_FLAGS]
bpftool map lookup MAP [key DATA]
bpftool map getnext MAP [key DATA]
bpftool map delete MAP key DATA
bpftool map pin MAP FILE
bpftool map event_pipe MAP [cpu N index M]
bpftool map peek MAP
bpftool map push MAP value VALUE
bpftool map pop MAP
bpftool map enqueue MAP value VALUE
bpftool map dequeue MAP
bpftool map freeze MAP
bpftool map help
MAP := { id MAP_ID | pinned FILE | name MAP_NAME }
DATA := { [hex] BYTES }
PROG := { id PROG_ID | pinned FILE | tag PROG_TAG | name PROG_NAME }
VALUE := { DATA | MAP | PROG }
UPDATE_FLAGS := { any | exist | noexist }
TYPE := { hash | array | prog_array | perf_event_array | percpu_hash
| percpu_array | stack_trace | cgroup_array | lru_hash
| lru_percpu_hash | lpm_trie | array_of_maps | hash_of_maps
| devmap | devmap_hash | sockmap | cpumap | xskmap | sockhash
| cgroup_storage | reuseport_sockarray | percpu_cgroup_storage
| queue | stack | sk_storage | struct_ops | ringbuf | inode_storage
| task_storage | bloom_filter | user_ringbuf | cgrp_storage | arena
| insn_array | rhash }
توضیحات (DESCRIPTION)
- bpftool map { show | list } [MAP]
- نمایش
اطلاعات
درباره
نگاشتهای
بارگذاریشده.
اگر MAP مشخص
شده باشد،
اطلاعات
فقط برای
نگاشتهای
دادهشده
نمایش داده
میشود، در
غیر این
صورت تمام
نگاشتهای
بارگذاریشده
فعلی در
سیستم
فهرست
میشوند. در
صورت
استفاده از
name، ممکن
است MAP با
چند نگاشت
مطابقت
داشته باشد
که همگی
نمایش داده
خواهند شد.
خروجی با شناسه نگاشت (ID) آغاز شده و به دنبال آن نوع نگاشت و صفر یا چند صفت نامدار (بسته به نسخه هسته) درج میشود.
از لینوکس ۵.۸ به بعد، bpftool قادر است اطلاعات مربوط به فرآیندهایی را که توصیفکنندههای فایل (FD) باز به نگاشتهای BPF دارند کشف کند. در چنین هستههایی، bpftool به طور خودکار این اطلاعات را نیز منتشر میکند.
- bpftool map create FILE type TYPE key KEY_SIZE value VALUE_SIZE entries MAX_ENTRIES name NAME [flags FLAGS] [inner_map MAP] [offload_dev NAME]
- ایجاد یک
نگاشت جدید
با
پارامترهای
دادهشده و
سنجاق کردن
(pin) آن به bpffs با
نام FILE.
مقدار FLAGS باید یک عدد صحیح باشد که ترکیبی از فلگهای مورد نظر است، به عنوان مثال ۱۰۲۴ برای BPF_F_MMAPABLE (برای مشاهده فلگهای موجود، هدر UAPI با نام bpf.h را بررسی کنید).
برای ایجاد نگاشتهایی از نوع array-of-maps یا hash-of-maps، باید از کلمه کلیدی inner_map برای ارسال یک نگاشت درونی استفاده شود. هسته برای جمعآوری متادیتای مرتبط با نگاشتهای درونی که نگاشت جدید با آنها کار خواهد کرد به آن نیاز دارد.
کلمه کلیدی offload_dev انتظار نام یک رابط شبکه را دارد و برای درخواست بارگذاری سختافزاری (hardware offload) برای نگاشت استفاده میشود.
- bpftool map dump MAP
- تخلیه تمام مدخلهای موجود در یک MAP مشخص. در صورت استفاده از name، ممکن است MAP با چند نگاشت مطابقت داشته باشد که همگی تخلیه خواهند شد.
- bpftool map update MAP [key DATA] [value VALUE] [UPDATE_FLAGS]
- بهروزرسانی
مدخل نگاشت
برای یک KEY
مشخص.
مقدار UPDATE_FLAGS میتواند یکی از این موارد باشد: any بهروزرسانی مدخل موجود یا افزودن در صورت عدم وجود؛ exist بهروزرسانی فقط در صورتی که مدخل از قبل وجود داشته باشد؛ noexist بهروزرسانی فقط در صورتی که مدخل وجود نداشته باشد.
اگر کلمه کلیدی hex قبل از دنباله بایتها مشخص شود، بایتها به عنوان مقادیر هگزادسیمال تحلیل میشوند، حتی اگر هیچ پیشوند "0x" اضافه نشده باشد. اگر این کلمه کلیدی مشخص نشود، بایتها به عنوان مقادیر دهدهی تحلیل میشوند، مگر اینکه پیشوند "0x" (برای هگزادسیمال) یا پیشوند "0" (برای هشتهشتی) درج شده باشد.
- bpftool map lookup MAP [key DATA]
- جستجوی key در نگاشت.
- bpftool map getnext MAP [key DATA]
- دریافت کلید بعدی. اگر key مشخص نشده باشد، نخستین کلید دریافت میشود.
- bpftool map delete MAP key DATA
- حذف مدخل از نگاشت.
- bpftool map pin MAP FILE
- سنجاق کردن
نگاشت MAP به
عنوان FILE.
نکته: FILE باید در محل اتصال bpffs قرار گیرد. نباید شامل نویسه نقطه ('.') باشد، چرا که برای پسوندهای آینده bpffs رزرو شده است.
- bpftool map event_pipe MAP [cpu N index M]
- خواندن
رویدادها
از یک نگاشت
BPF_MAP_TYPE_PERF_EVENT_ARRAY.
نصب حلقههای perf در نگاشت آرایه رویداد perf و تخلیه خروجی هر فراخوانی bpf_perf_event_output() در هسته. به طور پیشفرض تعداد CPUهای سیستم خوانده شده و برای هر CPU در شاخص مربوطه در آرایه، یک حلقه perf نصب میشود.
اگر cpu و index مشخص شوند، حلقه perf برای cpu مشخص در index دادهشده در آرایه نصب میشود (تک حلقه).
توجه داشته باشید که نصب یک حلقه perf در آرایه، بیصدا جایگزین هر حلقه موجود خواهد شد. هر برنامه دیگری که قبلاً حلقههای خود را نصب کرده باشد دریافت رویدادها را متوقف خواهد کرد.
- bpftool map peek MAP
- مشاهده مقدار بعدی در صف یا پشته بدون حذف آن.
- bpftool map push MAP value VALUE
- قرار دادن VALUE در بالای پشته.
- bpftool map pop MAP
- برداشتن و چاپ مقدار از بالای پشته.
- bpftool map enqueue MAP value VALUE
- افزودن VALUE به انتهای صف.
- bpftool map dequeue MAP
- برداشتن و چاپ مقدار از ابتدای صف.
- bpftool map freeze MAP
- منجمد کردن نگاشت به صورت فقطخواندنی از فضای کاربر. مدخلهای یک نگاشت منجمدشده دیگر نمیتوانند با فراخوانی سیستمی bpf() بهروزرسانی یا حذف شوند. این عملیات برگشتپذیر نیست و نگاشت تا زمان نابودیاش از فضای کاربر تغییرناپذیر باقی میماند. با این حال، مجوزهای خواندن و نوشتن برنامههای BPF روی نگاشت دستنخورده باقی میماند.
- bpftool map help
- چاپ پیام راهنمای کوتاه.
گزینهها (OPTIONS)
- -h, --help
- چاپ پیام راهنمای کوتاه (مشابه bpftool help).
- -V, --version
- چاپ شماره نسخه bpftool (مشابه bpftool version)، شماره نسخه libbpf مورد استفاده و ویژگیهای اختیاری که هنگام کامپایل bpftool گنجانده شدهاند. ویژگیهای اختیاری شامل پیوند به LLVM یا libbfd برای ارائه دیساسمبلر برنامههای JIT شده (bpftool prog dump jited) و استفاده از اسکلتهای BPF (برخی ویژگیها مانند bpftool prog profile یا نمایش pidهای مرتبط با اشیاء BPF ممکن است به آن متکی باشند) است.
- -j, --json
- تولید خروجی JSON. برای دستوراتی که نمیتوانند JSON تولید کنند، این گزینه هیچ تاثیری ندارد.
- -p, --pretty
- تولید خروجی JSON خوانا برای انسان. متضمن -j است.
- -d, --debug
- چاپ تمام لاگهای موجود، حتی اطلاعات در سطح اشکالزدایی (debug). این شامل لاگهای libbpf و همچنین وارسیکننده (verifier) هنگام تلاش برای بارگذاری برنامهها میشود.
- -f, --bpffs
- نمایش نام فایلهای نگاشتهای سنجاقشده.
- -n, --nomount
- عدم تلاش خودکار برای سوار کردن (mount) هرگونه فایلسیستم مجازی (مانند tracefs یا فایلسیستم مجازی BPF) در صورت نیاز.
مثالها (EXAMPLES)
# bpftool map show
10: hash name some_map flags 0x0
key 4B value 8B max_entries 2048 memlock 167936B
pids systemd(1)
سه دستور زیر معادل یکدیگرند:
# bpftool map update id 10 key hex 20 c4 b7 00 value hex 0f ff ff ab 01 02 03 4c # bpftool map update id 10 key 0x20 0xc4 0xb7 0x00 value 0x0f 0xff 0xff 0xab 0x01 0x02 0x03 0x4c # bpftool map update id 10 key 32 196 183 0 value 15 255 255 171 1 2 3 76
# bpftool map lookup id 10 key 0 1 2 3
key: 00 01 02 03 value: 00 01 02 03 04 05 06 07
# bpftool map dump id 10
key: 00 01 02 03 value: 00 01 02 03 04 05 06 07 key: 0d 00 07 00 value: 02 00 00 00 01 02 03 04 Found 2 elements
# bpftool map getnext id 10 key 0 1 2 3
key: 00 01 02 03 next key: 0d 00 07 00
# mount -t bpf none /sys/fs/bpf/ # bpftool map pin id 10 /sys/fs/bpf/map # bpftool map del pinned /sys/fs/bpf/map key 13 00 07 00
توجه داشته باشید که از بهروزرسانی نگاشت میتوان برای تغییر ارجاعات برنامههای نگهداریشده توسط یک نگاشت prog array نیز استفاده کرد. این ویژگی میتواند به عنوان مثال برای تغییر برنامههای مورد استفاده برای پرشهای فراخوانی انتهایی (tail-call) در زمان اجرا، بدون نیاز به بارگذاری مجدد برنامه نقطه ورود (entry-point) به کار رود. در ادامه مثالی برای این مورد کاربرد آمده است: برنامهای را بارگذاری میکنیم که یک نگاشت prog array تعریف میکند و دارای یک تابع اصلی شامل یک فراخوانی انتهایی به برنامههای دیگر است که میتوانند برای "process" بستهها یا برای "debug" پردازش به کار روند. توجه داشته باشید که نگاشت prog array حتماً باید در فایلسیستم مجازی BPF سنجاق (pin) شود تا بهروزرسانی نگاشت با موفقیت انجام گیرد، زیرا هنگامی که هیچ ارجاعی از فضای کاربر باقی نماند، هسته نگاشتهای prog array را پاکسازی میکند (و بهروزرسانی به محض خروج bpftool از دست خواهد رفت).
# bpftool prog loadall tail_calls.o /sys/fs/bpf/foo type xdp # bpftool prog --bpffs
545: xdp name main_func tag 674b4b5597193dc3 gpl
loaded_at 2018-12-12T15:02:58+0000 uid 0
xlated 240B jited 257B memlock 4096B map_ids 294
pinned /sys/fs/bpf/foo/xdp
546: xdp name bpf_func_process tag e369a529024751fc gpl
loaded_at 2018-12-12T15:02:58+0000 uid 0
xlated 200B jited 164B memlock 4096B
pinned /sys/fs/bpf/foo/process
547: xdp name bpf_func_debug tag 0b597868bc7f0976 gpl
loaded_at 2018-12-12T15:02:58+0000 uid 0
xlated 200B jited 164B memlock 4096B
pinned /sys/fs/bpf/foo/debug
# bpftool map
294: prog_array name jmp_table flags 0x0
key 4B value 4B max_entries 1 memlock 4096B
owner_prog_type xdp owner jited
# bpftool map pin id 294 /sys/fs/bpf/bar # bpftool map dump pinned /sys/fs/bpf/bar
Found 0 elements
# bpftool map update pinned /sys/fs/bpf/bar key 0 0 0 0 value pinned /sys/fs/bpf/foo/debug # bpftool map dump pinned /sys/fs/bpf/bar
key: 00 00 00 00 value: 22 02 00 00 Found 1 element
همچنین ببینید (SEE ALSO)
bpf(2), bpf-helpers(7), bpftool(8), bpftool-btf(8), bpftool-cgroup(8), bpftool-feature(8), bpftool-gen(8), bpftool-iter(8), bpftool-link(8), bpftool-net(8), bpftool-perf(8), bpftool-prog(8), bpftool-struct_ops(8), bpftool-token(8)