bpftool-map(8) System Manager's Manual bpftool-map(8)

bpftool-map - ابزار بازرسی و دستکاری نگاشت‌های bpf

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 }

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 }

نمایش اطلاعات درباره نگاشت‌های بارگذاری‌شده. اگر MAP مشخص شده باشد، اطلاعات فقط برای نگاشت‌های داده‌شده نمایش داده می‌شود، در غیر این صورت تمام نگاشت‌های بارگذاری‌شده فعلی در سیستم فهرست می‌شوند. در صورت استفاده از name، ممکن است MAP با چند نگاشت مطابقت داشته باشد که همگی نمایش داده خواهند شد.

خروجی با شناسه نگاشت (ID) آغاز شده و به دنبال آن نوع نگاشت و صفر یا چند صفت نام‌دار (بسته به نسخه هسته) درج می‌شود.

از لینوکس ۵.۸ به بعد، bpftool قادر است اطلاعات مربوط به فرآیندهایی را که توصیف‌کننده‌های فایل (FD) باز به نگاشت‌های BPF دارند کشف کند. در چنین هسته‌هایی، bpftool به طور خودکار این اطلاعات را نیز منتشر می‌کند.

ایجاد یک نگاشت جدید با پارامترهای داده‌شده و سنجاق کردن (pin) آن به bpffs با نام FILE.

مقدار FLAGS باید یک عدد صحیح باشد که ترکیبی از فلگ‌های مورد نظر است، به عنوان مثال ۱۰۲۴ برای BPF_F_MMAPABLE (برای مشاهده فلگ‌های موجود، هدر UAPI با نام bpf.h را بررسی کنید).

برای ایجاد نگاشت‌هایی از نوع array-of-maps یا hash-of-maps، باید از کلمه کلیدی inner_map برای ارسال یک نگاشت درونی استفاده شود. هسته برای جمع‌آوری متادیتای مرتبط با نگاشت‌های درونی که نگاشت جدید با آن‌ها کار خواهد کرد به آن نیاز دارد.

کلمه کلیدی offload_dev انتظار نام یک رابط شبکه را دارد و برای درخواست بارگذاری سخت‌افزاری (hardware offload) برای نگاشت استفاده می‌شود.

تخلیه تمام مدخل‌های موجود در یک MAP مشخص. در صورت استفاده از name، ممکن است MAP با چند نگاشت مطابقت داشته باشد که همگی تخلیه خواهند شد.
به‌روزرسانی مدخل نگاشت برای یک KEY مشخص.

مقدار UPDATE_FLAGS می‌تواند یکی از این موارد باشد: any به‌روزرسانی مدخل موجود یا افزودن در صورت عدم وجود؛ exist به‌روزرسانی فقط در صورتی که مدخل از قبل وجود داشته باشد؛ noexist به‌روزرسانی فقط در صورتی که مدخل وجود نداشته باشد.

اگر کلمه کلیدی hex قبل از دنباله بایت‌ها مشخص شود، بایت‌ها به عنوان مقادیر هگزادسیمال تحلیل می‌شوند، حتی اگر هیچ پیشوند "0x" اضافه نشده باشد. اگر این کلمه کلیدی مشخص نشود، بایت‌ها به عنوان مقادیر ده‌دهی تحلیل می‌شوند، مگر اینکه پیشوند "0x" (برای هگزادسیمال) یا پیشوند "0" (برای هشت‌هشتی) درج شده باشد.

جستجوی key در نگاشت.
دریافت کلید بعدی. اگر key مشخص نشده باشد، نخستین کلید دریافت می‌شود.
حذف مدخل از نگاشت.
سنجاق کردن نگاشت MAP به عنوان FILE.

نکته: FILE باید در محل اتصال bpffs قرار گیرد. نباید شامل نویسه نقطه ('.') باشد، چرا که برای پسوندهای آینده bpffs رزرو شده است.

خواندن رویدادها از یک نگاشت BPF_MAP_TYPE_PERF_EVENT_ARRAY.

نصب حلقه‌های perf در نگاشت آرایه رویداد perf و تخلیه خروجی هر فراخوانی bpf_perf_event_output() در هسته. به طور پیش‌فرض تعداد CPUهای سیستم خوانده شده و برای هر CPU در شاخص مربوطه در آرایه، یک حلقه perf نصب می‌شود.

اگر cpu و index مشخص شوند، حلقه perf برای cpu مشخص در index داده‌شده در آرایه نصب می‌شود (تک حلقه).

توجه داشته باشید که نصب یک حلقه perf در آرایه، بی‌صدا جایگزین هر حلقه موجود خواهد شد. هر برنامه دیگری که قبلاً حلقه‌های خود را نصب کرده باشد دریافت رویدادها را متوقف خواهد کرد.

مشاهده مقدار بعدی در صف یا پشته بدون حذف آن.
قرار دادن VALUE در بالای پشته.
برداشتن و چاپ مقدار از بالای پشته.
افزودن VALUE به انتهای صف.
برداشتن و چاپ مقدار از ابتدای صف.
منجمد کردن نگاشت به صورت فقط‌خواندنی از فضای کاربر. مدخل‌های یک نگاشت منجمدشده دیگر نمی‌توانند با فراخوانی سیستمی bpf() به‌روزرسانی یا حذف شوند. این عملیات برگشت‌پذیر نیست و نگاشت تا زمان نابودی‌اش از فضای کاربر تغییرناپذیر باقی می‌ماند. با این حال، مجوزهای خواندن و نوشتن برنامه‌های BPF روی نگاشت دست‌نخورده باقی می‌ماند.
چاپ پیام راهنمای کوتاه.

چاپ پیام راهنمای کوتاه (مشابه bpftool help).
چاپ شماره نسخه bpftool (مشابه bpftool version)، شماره نسخه libbpf مورد استفاده و ویژگی‌های اختیاری که هنگام کامپایل bpftool گنجانده شده‌اند. ویژگی‌های اختیاری شامل پیوند به LLVM یا libbfd برای ارائه دیس‌اسمبلر برنامه‌های JIT شده (bpftool prog dump jited) و استفاده از اسکلت‌های BPF (برخی ویژگی‌ها مانند bpftool prog profile یا نمایش pidهای مرتبط با اشیاء BPF ممکن است به آن متکی باشند) است.
تولید خروجی JSON. برای دستوراتی که نمی‌توانند JSON تولید کنند، این گزینه هیچ تاثیری ندارد.
تولید خروجی JSON خوانا برای انسان. متضمن -j است.
چاپ تمام لاگ‌های موجود، حتی اطلاعات در سطح اشکال‌زدایی (debug). این شامل لاگ‌های libbpf و همچنین وارسی‌کننده (verifier) هنگام تلاش برای بارگذاری برنامه‌ها می‌شود.
نمایش نام فایل‌های نگاشت‌های سنجاق‌شده.
عدم تلاش خودکار برای سوار کردن (mount) هرگونه فایل‌سیستم مجازی (مانند tracefs یا فایل‌سیستم مجازی BPF) در صورت نیاز.

# 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

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)